生命周期
初始化阶段
- componentWillMount: render之前最后一次修改状态的机会 UNSAFE_componentWillMount
- render: 只能访问this.props和this.state , 不允许修改状态和Dom输出
- componentDidMount: 成功render并渲染完成真实Dom之后触发, 可以修改Dom
UNSAFE_componentWillMount,UNSAFE_componentWillUpdate: 16.2之前需要创建虚拟dom树,新的虚拟dom树对比老的虚拟dom树 这个操作实在浏览器渲染主线程中执行的,而且是同步的, 如果dom树非常庞大, 会造成浏览器的假死, 卡顿.
16.2之后React Fiber技术优化的虚拟dom的diff算法,把创建,和渲染碎片化,按优先级执行, 低优先级可以被打断执行, 先执行高优先级(render), 再重新执行低优先级(UNSAFE_componentWillMount,UNSAFE_componentWillUpdate) 所以低优先级的可能会执行多次
运行中阶段
- componentWillReceiveProps: 父组件修改属性触发
- shouldComponentUpdate: 返回false会阻止render调用
- componentWillUpdate: 不能修改属性和状态
- render: 只能访问this.props和this.state , 不允许修改状态和Dom输出
- componentDidUpdate: 可以修改dom
销毁阶段
- componentWillUnmount: 在删除组件之前清理操作, 比如计时器和事件监听
新生命周期
getDerivedStateFromProps
- 用于替代 componentWillReceiveProps 和 componentWillMount
- 组件初始化或更新时将props映射到state
- 返回值与 state 合并后可以做用为 shouldcomponentupdate 生命周期的第二个参数newstate
getSnapshotBeforeUpdate
- 配合componentDidUpdate使用, 可以dom更新之前获取dom元素的快照, return 后会传递给componentDidUpdate的第三个参数
getSnapshotBeforeUpdate(prevProps,preState){
const style = getComputedStyle(this.node)
// 传递更新前的元素位置
return {
cx:style.cx,
cy:style.cy
}
}
componentDidUpdate(prevProps, prevState, snapshot){
// 获取元素绘制之前的位置
console.log(snapshot)
}