生命周期 (新)
初始化阶段
constructor()
类的默认方法,在类中是必须存在的,里边的super()
方法是必须的,如果没有定义constructor()
,会默认生成一个空的构造器constructor
挂载阶段
(componentWillMount() ->) render() -> componentDidMount()
(componentWillMount()
❌:组件挂载之前调用,很少使用, 17.0 版本将会删除)
-
render()
:是组件中必须定义的,用来渲染DOM,并必须return
一个React元素(描述组件,即UI) -
componentDidMount()
: 组件完成后调用 ,componentDidMount在渲染过程中永远只有执行一次,一般是在componentDidMount执行副作用,进行异步操作,并在异步请求中可以进行setState
;也可以在这里使用refs,获取真实dom元素。
更新阶段
但凡
state
和props
发生更新,不管是否改变,都会引起子组件重新render
static getDerivedStateFromProps(nextProps, prevState) -> shouldComponentUpdate(nextProps,nextState) -> getSnapshotBeforeUpdate(prevProps, prevState) -> componentDidUpdate(prevProps, prevState)
static getDerivedStateFromProps(nextProps, prevState)
✅v16.4新增加的生命周期nextProps
表示更新后的 props,prevState
表示更新前的 state- 根据
nextProps
和prevState
计算出预期的状态改变,返回结果会被送给setState
,也就是说我们可以根据props
,state
的变化情况来决定返回情况 - ⚠️这个生命周期函数是一个静态函数,因此是无法访问实例的属性和方法的(就不能使用
this
啦 - 返回值如果是
object
,就相当于是setState
操作;如果是null或者其他基本类型,就不会更新state
,没有返回值会报错 - 这是一个例子🌰:
static getDerivedStateFromProps(nextProps, state) {
const param = nextProps.search.substring(1)
if (param !== state.param) {
return {
param,
loading: true
}
}
return null;
};
(componentWillReceiveProps(nextProps )❌17.0 版本将会删除)
shouldComponentUpdate(nextProps,nextState)
- 通过比较
nextProps
,nextState
及当前组件的this.props
,this.state</
- 通过比较