梳理一下React的生命周期 React的生命周期指的是一个组件从挂载、更新到结束,在不同周期阶段会执行不同的API,接下来就开始梳理一下周期执行的API
挂载
constructorstatic getDerivedStateFromPropsrendercomponentDidMount
旧方法
UNSAFE_componentWillMount()
更新
static getDerivedStateFromPropscomponentShouldUpdaterendergetSnapshotBeforeUpdatecomponentDidUpdate
旧方法
UNSAFE_componentWillUpdate()
UNSAFE_componentWillReceiveProps()
销毁
componentWillUnMout
constructor()
构造方法,主要作用在初始化的时候注入state的初始值,以及绑定事件实例
在为React.Component子类实现构造函数时,super(props)应该在任何其他语句之前调用。
eg:
constructor(props: TypeApp) {
super(props);// 这里需要提前执行,后面才可以调用this.porps,否则会因为为声明而报错
this.state = {
age: "18",
name: this.props.name
};
}
static getDerivedStateFromProps(nextProps,state)
static表示的是静态方法在ES6中表示,该方法不会被实例继承,而是直接通过类来调用
- 参数
nextProps是下一轮需要更新的状态state是上一轮更新的状态
通过
props获取state的派生状态
getDerivedStateFromProps在调用 render 方法之前被调用,包括初始挂载和后续更新。返回一个对象来更新状态,返回null则不更新。getDerivedStateFromProps的存在是为了使组件能够根据props的变化更新其内部状态。- 此方法无权访问组件实例
上文提到的派生状态,何为派生状态
派生状态指的一个组件的state中的某个数据来自外部,则这个state中的数据称之为派生状态
render()
render方法是类组件中唯一必须实现的
该方法用来输出展示页面元素,如果返回布尔值false,null,undefined页面则不展示内容
componentDidMount()
componentDidMount在组件插入DOM树之后立即执行,在componentDidMount方法里可以执行异步网络请求、事件监听。也可以调用setState(),更新内部状态
shouldComponentUpdate(newProps, newState)
-
参数
nextProps:即将更新的props值nextState:即将更新的state的值
-
shouldComponentUpdate在组件更新之前调用,可以依据返回的布尔值来决定,是否进行更新,默认为true,返回false则不更新。 -
依据参数newProps、newState和一些其他条件进行逻辑对比,然后返回布尔值,来决定是否需要更新,进行一定的性能优化
-
用来在做性能优化的时候使用,不能过度依赖返回的结果来影响渲染
-
考虑使用内置
PureComponent来代替shouldComponentUpdate -
不推荐进行深度的相等性检查,或者使用
JSON.stringify(),这个操作低效且损害性能
getSnapshotBeforeUpdate(prevProps, prevState)
- 参数
-
prevProps:上一次的props -
prevState:上一次的state处于“Pre-commit phase” 阶段此时能够访问到DOM getSnapshotBeforeUpdate() 在最近一次的渲染输出被提交之前调用。也就是说,在 render 之后,即将对组件进行挂载时调用。 它使组件能够在可能发生更改之前从 DOM 捕获一些信息(例如滚动位置)。此生命周期方法返回的任何值都将作为参数传递给componentDidUpdate().
-
componentDidUpdate(prevProps, prevState, snapshot)
componentDidUpdate() 会在更新后会被立即调用。首次渲染不会执行
- 参数
prevProps:上一次的propsprevState:上一次的statesnapshot:getSnapshotBeforeUpdate执行的“snapshot”,如果未实现getSnapshotBeforeUpdate(),这个值为null 可以依据前后props进行比较,来进行setState,同时比较中需要依赖前后的props,否则会导致异常
componentWillUnmount()
componentWillUnmount()在卸载和销毁组件之前立即调用。
在方法中可以执行一些定时器,监听方法的清理,或者清理在componentDidMount()中的订阅
在componentWillUnmount()不要调用setState,调用了也不会生效,因为组件的不会重新渲染
附上React官方的React生命周期图