1、React处理组件的流程
1.1 处理类组件
react-reconciler/src/ReactFiberClassComponent.js:
function constructClassInstance(workInProgress, // 当前正在工作的 fiber 对象ctor, // 我们的类组件props // props){/* 实例化组件,得到组件实例 instance */const instance = new ctor(props, context)}
1.2 处理函数组件
react-reconciler/src/ReactFiberHooks.js
function renderWithHooks(current, // 当前函数组件对应的 `fiber`, 初始化workInProgress, // 当前正在工作的 fiber 对象Component, // 我们函数组件props, // 函数组件第一个参数 propssecondArg, // 函数组件其他参数nextRenderExpirationTime, //下次渲染过期时间){/* 执行我们的函数组件,得到 return 返回的 React.element对象 */let children = Component(props, secondArg);}
2、React 底层类组件的定义
react/src/ReactBaseClasses.js
function Component(props, context, updater) {this.props = props; //绑定propsthis.context = context; //绑定contextthis.refs = emptyObject; //绑定refthis.updater = updater || ReactNoopUpdateQueue; //上面所属的updater 对象}/* 绑定setState 方法 */Component.prototype.setState = function(partialState, callback) {this.updater.enqueueSetState(this, partialState, callback, 'setState');}/* 绑定forceupdate 方法 */Component.prototype.forceUpdate = function(callback) {this.updater.enqueueForceUpdate(this, callback, 'forceUpdate');}
Component 底层 React 的处理逻辑是,类组件执行构造函数过程中会在实例上绑定 props 和 context ,初始化置空 refs 属性,原型链上绑定setState、forceUpdate 方法。对于 updater,React 在实例化类组件之后会单独绑定 update 对象。
3、问与答
问:如果没有在 constructor 的 super 函数中传递 props,那么接下来 constructor 执行上下文中就获取不到 props ,这是为什么呢?
答:绑定 props 是在父类 Component 构造函数中,执行 super 等于执行 Component 函数,此时 props 没有作为第一个参数传给 super() ,在 Component 中就会找不到 props 参数,从而变成 undefined
