组件的生命周期分可为三大部分: 组件初始化、组件更新、组件卸载。
组件初始化
初始化,第一次render
getDefaultProps
只在组件创建时调用一次并缓存返回的对象。
- 元件类别被建立时立即调用。
- 回传属性若使用物件时则直接参考即所有元件实例公用。
无法使用
this.state或setState()。(es6写法如下)
1
2
3static defaultProps = {
type:'default'
}
getInitialState
初始化
this.state的值,只在组件装载之前调用一次。- 必须要回传物件或
null。 无法使用
this.state或setState()。(es6写法如下)
1
2
3
4
5
6constructor(props,context) {
super(props,context);
this.state = {
openNewCreate: false
};
}
- 必须要回传物件或
componentWillMount
只会在装载之前调用一次,在 render 之前调用,你可以在这个方法里面调用
setState改变状态,并且不会导致额外调用一次 render。- 使用
setState会立即更新state。 - 不会再次触发
render。 只会在初始化被调用一次 。
1
2
3componentWillMount(){
//要修改的内容
}
- 使用
render
组装生成这个组件的HTML结构(使用原生HTML标签或者子组件),也可以返回
null或者false。- 不能使用
setState。 - 必要的。
- 只能回传一个父元件,其他元件必须在其内部。
- 回传
null或false表示不输出。实际上是输出<noscript>标签。 如果里面有其他子元件,在此事件后才开始子元件的生命周期。
1
2
3
4
5render(
return{
//父元件,包子元件。
}
)
- 不能使用
componentDidMount
只会在装载完成之后调用一次,在
render之后调用。DOM加载完成后触发。会等到子元件都加载完才触发。
1
2
3componentDidMount(){
//要修改的内容
}
组件更新
组件更新分为两部分 :props发生改变、state发生改变
props发生改变
componentWillReceiveProps(nextProps)
- 只要父元件更新,子元件都会收到
props。 - 使用
setState不会再次触发render。 - 没有收到
props就略过。
- 只要父元件更新,子元件都会收到
props 和 state 公用方法
shouldComponentUpdate(nextProps, nextState)
- 回传
false则后续行为省略。 - 不可使用
setState。 - 第一次初始化和
forceUpdate时不会被触发
- 回传
componentWillUpdate(nextProps, nextState)
- 即使是父元件更新重新传入
props也会触发。 - 不可使用
setState。
- 即使是父元件更新重新传入
render
同上
componentDidUpdate(prevProps, prevState)
- 会等子元件更新完成才触发。
组件卸载
componentWillUnmount()
- 不可使用
setState。
- 不可使用
总结
生命周期执行流程
第一次初始化的流程
1、displayName 用来设定元件名称
2、getDefaultProps() 当元件类别被建立时就会触发,且和所有实例物件共享
3、getInitialState() 开始渲染元件时初始化
4、componentWillMount() 准备加载 DOM 之前触发
5、render() 执行输出
- 如果里面有其他的子元件则依据上面的流程
getInitialState() -> componentWillMount() -> render() -> componentDidMount()
6、componentDidMount() DOM 完成之后立即触发(会等到子元件都完成才触发)
更新的流程
1、componentWillReceiveProps(nextProps)
这边使用 setState 不会再触发一次 render。初始化不会被触发
2、shouldComponentUpdate(nextProps, nextState)
元件是否要更新
3、componentWillUpdate(nextProps, nextState)
将要更新之前,不可以用 setState
4、render()
5、componentDidUpdate(prevProps, prevState)
使用setState不会重新render的方法
componentWillMount()componentWillReceiveProps()
存取 DOM 的适当时机
componentDidMount()
不得使用 setState 的事件
shouldComponentUpdate(nextProps, nextState)componentWillUpdate(nextProps, nextState)render()