React.createElement
React.createElement函数的作用。
React.createElement函数的作用无非就是返回虚拟DOM。
React.createElement(type,config,children);
type:标签类型,例如div标签。
config:元素上面带的属性,例如className属性。
children:子元素。
我们看下面的代码:
/**
* react.js
*/
//createElement返回虚拟DOM
import { REACT_ELEMENT } from "./stants";
import Component from "./component";
import { toObject } from "./util";
//type是标签类型,config是属性,children是子元素
function createElement(type,config,children){
//处理key ref
let key,ref;
if(config){
//将属性上的key和ref提取出来
key=config.key;
ref=config.ref;
delete config.key;
delete config.ref;
}
//处理children
let props={...config}
//1、没有children
//2、有一个children (1)文本 (2)元素
//3、多个儿子
if(arguments.length>3){//多个儿子
props.children = Array.prototype.slice.call(arguments,2).map(toObject)
}else if(arguments.length===3){//只有一个儿子
props.children = toObject(children);
}
return {//vnode=>react元素 虚拟DOM
$$typeofs:REACT_ELEMENT,
key,//后面用于diff算法
ref,//获取真实DOM
type,//标签类型
props//子元素
}
}
const MyReact = {
createElement
}
export default MyReact
/**
* stants.js
*/
//标识是元素还是文本
export const REACT_ELEMENT = Symbol("react.element");
export const REACT_TEXT = Symbol("react.text")
注意:React中没有这一部分的转换,我们转换知识为了方便判断是文本几点还是元素节点
/**
* util.js
*/
//判断节点是数字或文本,则将节点转换成对象的形式。
import { REACT_TEXT } from "./stants";
export function toObject(element){
return typeof element === "string"||typeof element === "number"?
{type:REACT_TEXT,content:element}:element;
}
上面就是React.createElement函数的代码,还是比较简单的,就是将一些属性转换一下,然后就成了虚拟Dom,返回虚拟Dom。