2020 动手写个 react (3)
来源:     阅读:465
依创模板店
发布于 2020-11-08 01:20
查看主页
coding

组件

组件可能是函数还可能是类,我们知道只需继承 Component 类就是 react 的组件。

function Box(){    return (        <div className='box' size="24">            hello,<span>zidea</span>        </div>    )}

创立一个函数,函数名为 Box 函数返回一个 jsx 对象

ReactDOM.render(<Box name={title}/>,document.querySelector("#root"));

传入一个名称为 title 的对象,

整理代码

function _render(vnode){    //TODO    if(vnode === undefined ) return;    // vnode is equal string    if(typeof vnode === 'string'){        //create textNode        return document.createTextNode(vnode)    }    // deconstruct vnode    const {tag,attrs} = vnode;    //create dom object    const dom = document.createElement(tag)    if(attrs){        // property key: className box        Object.keys(attrs).forEach(key=>{            const val = attrs[key]            setAttribute(dom,key,val)        })    }    vnode.children.forEach(child=>render(child,dom))    return dom;    }

在 javascript 中,假如函数名称以下划线开头通常是私有方法。这里把渲染设置为私有方法,也就是渲染逻辑放置在_render 方法中。而后 _render 方法主要就是讲虚拟节点解决 dom 节点返回出来。

function render(vnode,container){    container.appendChild(_render(vnode))}

渲染方法(_render)

if(vnode === undefined || vnode === null || typeof vnode === 'boolean') vnode = '';

判断 tag 是函数,tag 可能是函数组件或者类组件
if(typeof vnode.tag === 'function') 通过虚拟节点 tag 值来判断能否为组件,而后按组件进行解决

  1. 创立组件
    const comp = createComponent(vnode.tag,vnode.attrs);
  2. 设置组件的属性
    setComponentProps(comp,vnode.attrs);
  3. 组件渲染的节点返回对象
    return comp.base; 这里我们不能返回组件,而需要将节点对象挂接到 comp 的 base 属性上,而后返回comp.base的个节点对象。

创立组件

function createComponent(comp,props){    //declare component instance    let instance;    // class component case    if(comp.prototype && comp.prototype.render){        instance = new comp(propos)    }else{ // function component case         //conver function component to class component        instance = new Component(props)        //constructor prefer to function(component)        instance.constructor = comp;        //define render function        instance.render = function(){            //return jsx object            return this.constructor(props)        }    }    return instance;}
class Component{    constructor(props = {}){        this.props = props;        this.state = {};    }}export default Component;
- 在构造函数接收 props 参数,这是从外部传入的参数,而后内部维护一个状态对象 state
instance.render = function(){    //return jsx object    return this.constructor(props)}

设置组件属性

function setComponentProps(comp,props){    //设置组件的属性    comp.propos = props;    renderComponent(comp)}

渲染组件

function renderComponent(comp){    let base;    //call render method to return jsx object    const renderer = comp.render();    //conver jsx to dom obj    base = _render(renderer);        console.log(base)    comp.base = base}
屏幕快照 2020-05-09 上午5.55.21.png
免责声明:本文为用户发表,不代表网站立场,仅供参考,不构成引导等用途。 系统环境 windows
相关推荐
如何在打包Electron时,额外上传文件到Githbu的release
如何给域名配置https证书
国际化-通用 LTR/RTL 布局处理方案
WEB和WAP有何区别-前台开发趋势
nginx——控制 Nginx 并发连接数
首页
搜索
订单
购物车
我的