学习并实现react4
实现生命周期
生命周期介绍
1 | componentWillMount // 组件挂载前 |
React 生命周期图
React 子组件在父组件下的生命周期流程
实现 componentWillMount, componentDidMount, componentDidUpdate
componentWillMount
在组件实例新建时执行
componentDidMount、componentDidUpdate
相同点:组件render 执行完成后执行的
不同点:新建的实例render 后执行componentDidMount, 已创建的实例组件再次render 则调用componentDidUpdate
1 | function render(vnode, parent, comp, olddomOrComp, myIndex) { |
实现 componentWillReceiveProps, shouldComponentUpdate, componentWillUpdate
componentWillReceiveProps
1 | componentWillReceiveProps(nextProps) { |
componentWillReceiveProps 具有一个 nextProps 参数,表示改变后的新props,而在componentWillReceiveProps 内执行的 this.props 还是指向未改变的 oldProps
1 | if (typeof vnode.type === 'function') { |
shouldComponentUpdate / componentWillUpdate
1 | shouldComponentUpdate(nextProps, nextState) { |
- 组件setState 或props 后决定组件是否更新,返回一个 true 或 false 通知组件是否执行 componentWillUpdate - render - componentDidUpdate, 组件不存在shouldComponentUpdate 则直接更新
- componentWillUpdate 只有当shouldComponentUpdate 返回值是true 时才会调用
1 | // render.js 父组件props 改变时 |
1 | // component.js 当组件本身调用 setState |
componentWillUnmount
componentWillUnmount 调用的场景
1组件实例销毁时
2组件实例不被复用时
3包裹组件的dom 不被复用时 <div><Comp /></div>
1 | function recoveryComp(comp) { |
- recoveryComp 对传入的参数进行判断
- 当为组件实例时调用 componentWillUnmount 然后递归调用 comp.__rendered
- 当comp.__rendered 为数组时comp 为dom 节点,对__rendered 里的各元素进行 recoveryComp(el)
- 最后如果是文本节点则不操作
1 | function diffDOM(vnode, parent, comp, olddom) { |
现在我们把生命周期都加入了。
首次挂载到根节点时
1 | // document.getElementById('app') dom 节点也需要初始化__rendered 和 myIndex |
1 | export function render(vnode, parent) { |