createElement 方法
function createElement(type,config,children){
//步骤一.处理config
for (propName in config) {
if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
props[propName] = config[propName];
}
}
//步骤2:处理children
var childrenLength = arguments.length - 2;
if (childrenLength === 1) {
props.children = children;
} else if (childrenLength > 1) {
var childArray = Array(childrenLength);
for (var i = 0; i < childrenLength; i++) {
childArray[i] = arguments[i + 2];
}
{
if (Object.freeze) {
Object.freeze(childArray);
}
}
props.children = childArray;
}
//步骤3:处理defaultProps
if (type && type.defaultProps) {
var defaultProps = type.defaultProps;
for (propName in defaultProps) {
if (props[propName] === undefined) {
props[propName] = defaultProps[propName];
}
}
}
return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);
}
一、处理config
- 如果config中有key,ref ,___self,___source 属性,单领出来;
- config中除了key,ref,self,source属性之外的其他属性遍历到props里面;
二、处理children
- 从第三个参数开始都是children;
- 只有一个children,直接赋值给props.children;
- 如果大于1,把children按个数遍历成为一个数组,数组成员为每一个children;
- 冻结数组,外界不能添加、删除、修改数组;
- 把这个数组赋值给props.children;
三、处理defaultProps
- 判断defaultProps中的属性是否在props上面存在,不存在添加属性
最后去调用 reactElement()并返回reactNode;