cjb 2019-06-28
此文章源码解读版本 react16.6
作者:starkwang
欢迎关注订阅号:rd-hub
如需转载请标明作者和出处
从一个最简单的jsx开始

import React from 'react';
import ReactDOM from 'react-dom';
ReactDOM.render(<h2 style={{ "color": "#53cde2" }}>hi stark wang</h2>, document.getElementById('root'));bable 会转译成(编译原理会另有篇幅橡树)
import React from 'react';
import ReactDOM from 'react-dom';
ReactDOM.render(React.createElement(
'h2',
{ style: { "color": "#53cde2" } },
'hi stark wang'
), document.getElementById('root'));
在此我们看到在ReactDOM.render()函数里面有两个参数,下面我们来看看React.createElement()源码
createElement() 源码如下:

function createElement(type, config, children) {
}
从函数来看,三个参数:type,config,children表示类型比如我们传入的是 <h2 style={{ "color": "#53cde2" }}>hi stark wang</h2> 此时的type就是 h2
为了增加文章的严谨,我专门在源码里面做了调试

config 就是dom属性: style={{ "color": "#53cde2" }}
children 就是我们在dom里面的内容了

function hasValidRef(config) {
{
if (hasOwnProperty.call(config, 'ref')) {
var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;
if (getter && getter.isReactWarning) {
return false;
}
}
}
return config.ref !== undefined;
}
function hasValidKey(config) {
{
if (hasOwnProperty.call(config, 'key')) {
var getter = Object.getOwnPropertyDescriptor(config, 'key').get;
if (getter && getter.isReactWarning) {
return false;
}
}
}
return config.key !== undefined;
}// 通过arguments 的长度来判断dom里面的内容
var childrenLength = arguments.length - 2; // 2 :代表默认的 type 和 config,减去就是 children了
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;
}如果dom属性内容为<h2>hi stark {shudong} {rdhub.cn} {starkwang}</h2>则参数为 8个
默认有有两个,剩下都是 children 所以剩下有6个分别是
{shudong}每个变量中间的隔得内容都算一个参数

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);