react 源码解读 一(createElement方法 )

101 阅读1分钟

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

  1. 如果config中有key,ref ,___self,___source 属性,单领出来;
  2. config中除了key,ref,self,source属性之外的其他属性遍历到props里面;

二、处理children

  1. 从第三个参数开始都是children;
  2. 只有一个children,直接赋值给props.children;
  3. 如果大于1,把children按个数遍历成为一个数组,数组成员为每一个children;
  4. 冻结数组,外界不能添加、删除、修改数组;
  5. 把这个数组赋值给props.children;

三、处理defaultProps

  1. 判断defaultProps中的属性是否在props上面存在,不存在添加属性

最后去调用 reactElement()并返回reactNode;