生命周期
参考:http://wiki.jikexueyuan.com/project/react/component-specs-lifecycle.html
生命周期 | API | 说明 | 备注 |
---|---|---|---|
挂载 | componentWillMount | 组件初始化渲染之前立刻调用 | 只调用一次 |
挂载 | componentDidMount | 组件初始化渲染后立刻调用 | 只调用一次 |
更新 | comcponentWillReceiveProps | 在组件接收到新的props 的时候调用 |
初始化渲染时不会调用 |
更新 | shouldComponentUpdate | 在接收到新的props 或者 state,将要渲染之前调用。 |
初始化渲染时不会调用 |
更新 | componentWillUpdate | 在接收到新的props 或者state 之前立刻调用 |
初始化渲染时不会调用 |
更新 | componentDidUpdate | 在组件的更新已经同步到 DOM 中之后立刻被调用 | 初始化渲染时不会调用 |
移除 | componentWillUnmount | 在组件从 DOM 中移除的时候立刻被调用。 | 在该方法中执行任何必要的清理,比如无效的定时器 |
componentWillUpdate
当组件收到新的props
或者state
,在render
之前会回调该函数。
注意不能在该方法中使用 this.setState()
,否则会导致无限循环。如果需要在收到新的prop
后更新state
,应该使用 componentWillReceiveProps
方法,在该方法中使用this.setState()
不会触发组件重新渲染。
componentDidUpdate
可以在该方法中使用this.setState()
如果在该方法中使用 this.setState()
会更新该组件,更新组件的同时又会触发componentDidUpdate
从而重复调用this.setState()
,这会导致无限循环。
正确的做法是加入一个终止条件,使得在调用过程中能正确退出
componentDidUpdate: function() {
if(condition) {
this.setState({..})
} else {
//do something else
}
}
setState方法详解
-
setState
方法是异步的并且为了获得更好的性能会进行批量更新,进行setState()
操作后state
变化不会马上反映到this.state
上,所以通过this.state
获得的可能还是原来的值。如果想要确保state
变化后执行某些操作可以使用setState
提供的回调函数setState({...}, function(){})
-
setState
使用异步操作是因为JS是单线程语言,而更新state
是一种比较昂贵的操作,若进行同步操作会导致浏览器卡顿用户体验变差,因此setState
采用异步批量更新。 - 若要确保
state
确实被更新后执行某些操作那么应该使用setState
的回调函数
this.setState({...}, function(){
...
})