1. 函数组件jsx编译处理
function App() {
const [count, setCount] = React.useState(0)
return <div>
<div>Hello World</div>
<div>Number: {count}</div>
<button onClick={() => setCount(v => v + 1)}>Increment</button>
</div>
}
ReactDOM.render(App, document.querySelector('#app'))
App是一个Element 不是ReactNode
编译输出
const AppElement = {
$$typeof: Symbol(react.element),
_store: { validated: false },
ref: null,
props: {},
_source: null,
_owner: null,
_self: null,
key: null,
type: function App() {
var _React$useState = React.useState(0)
_React$useState2 = _slicedToArray(_React$useState, 2)
count = _React$useState2[0]
setCount = _React$useState2[1]
return React.createElement(
'div',
null,
React.createElement(
'div',
null,
'Hello World',
),
React.createElement(
'div',
null,
'number:',
count,
),
React.createElement(
'button',
{
onClick: function (v) {
return setCount(function (v) {
return v + 1;
});
},
},
'Increment',
)
)
}
}
2. render方法处理
2.1 isValidContainer
检查是否合法的容器组件 我们给的是document.querySelector(‘#app’) 符合条件
2.2 isContainerMarkedAsRoot
检查是否根节点
3. legacyRenderSubtreeIntoContainer
很明显只有几个地方调用且互斥的情况 所以整个react执行流程 该方法只执行了一次
把子树放入容器中
3.1 topLevelUpdateWarning 顶层应用更新
顶层应用更新告警 一般是组件更新 顶层应用的更新不知道会发生啥
3.2 _reactRootContainer应用根节点
react应用根节点