目录
一、数据加载时
二、数据更新时
三、组件销毁
一、数据加载时 constructor-->componentWilMount-->render-->componentDidMount
注:在版本16.4之后,废除了componentWillMount,则顺序如下:
constructor()-->static getDerivedStateFromProps()-->render()-->componentDidMount()
import React, { Component } from 'react'export default class Lifecycle extends Component {constructor(props){super(props);console.log('01 构造函数');}//组件将要被挂载componentWillMount(){console.log('02 组件挂载前触发');}//组件挂载完成componentDidMount(){console.log('04 组件挂载完成');}render() {console.log('03 数据渲染');return (
React 声明周期函数
)} } getDerivedStateFromProps 一个静态方法,所以不能在这个函数里面使用this ,这个函数有两个参数props 和state ,分别指接收到的新参数和当前的state对象,这个函数会返回一个对象用来更新当前的state对象,如果不需要更新可以返回null
场景 : 当我们接收到新的属性想去修改我们state,可以使用getDerivedStateFromProps
class ExampleComponent extends React.Component {// Initialize state in constructor,// Or with a property initializer.state = {};static getDerivedStateFromProps(nextProps, prevState) {if (prevState.someMirroredValue !== nextProps.someValue) {return {derivedData: computeDerivedState(nextProps),someMirroredValue: nextProps.someValue};}// Return null to indicate no change to state.return null;} }
二、数据更新时 shouldComponentUpdate -->componentWillUpdate--->render -->componentDidUpdate
版本更新后顺序 :
static getDerivedStateFromProps() -->static shouldComponentUpdate()-->render()-->static getSnapshotBeforeUpdate() -->componentDidUpdate()
import React, { Component } from 'react'export default class Lifecycle extends Component {constructor(props){super(props);this.state={title:''}console.log('01 构造函数');}shouldComponentUpdate = (nextProps, nextState) => {console.log('更新的数据',nextState);console.log('01 数据是否要更新');return true;}//组件更新前componentWillUpdate(){console.log('02 数据将要更新');}//组件更新完成componentDidUpdate(){console.log('04 数据更新完毕');}updata=()=>{this.setState({title:'update 完成'})}render() {console.log('03 数据渲染');return (
React 声明周期函数 更新数据
)} } getSnapshotBeforeUpdate 有两个参数prevProps 和prevState ,表示之前的属性和之前的state,这个函数一定有一个返回值,会作为第三个参数传递给componentDidUpdate,如果不想返回值,则返回null。该方法一定要和componentDidupdate一起使用, 否则控制台会有警告
三、组件销毁 //子组件中 componentWillUnmount(){console.log('组件销毁前触发');}//父组件中 import React, { Component } from 'react'; import Lifecycle from './components/Lifecycle' class App extends Component {constructor(props){super(props);this.state={flag:true}}destroy=()=>{this.setState({flag:!this.state.flag})}render() {return ({this.state.flag? :''}组件创建与销毁
);} }
错误处理
当渲染过程过,生命周期或子组件的构造函数中抛出错误时,会调用如下方法:
static getDerivedStateFromError()
componentDidCatch()
总结
1. 在 v16版本后 引入了 Fiber机制,Fiber将原先的同步渲染改为异步渲染
2. 由于原先有些生命周期可能会被打断,所以可能会出现多次调用的情况,因此替换方案如下:
2.1 geDerivedStateFromProps 替换 componentWillReciveProps
2.2 getSnapshotBeforeUpdate 替换 componentWillUpdate