React组件生命周期和状态更新

五月的约修亚IP属地: 贵州
字数 391

生命周期

参考: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(){
    ...
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
0人点赞
五月的约修亚民谣程序员
总资产1共写了1.3W字获得10个赞共5个粉丝

推荐阅读更多精彩内容

  • 在React Native中使用组件来封装界面模块时,整个界面就是一个大的组件,开发过程就是不断优化和拆分界面组件...
    ITxiansheng阅读 947评论 1 2
  • 在React Native中使用组件来封装界面模块时,整个界面就是一个大的组件,开发过程就是不断优化和拆分界面组件...
    朱_源浩阅读 8,981评论 6 38
  • 组件的生命周期方法分以下三个阶段。 Mounting当创建组件的实例并将其插入到DOM中时,将调用这些方法:con...
    _八神光_阅读 1,109评论 0 0
  • 最近看了一本关于学习方法论的书,强调了记笔记和坚持的重要性。这几天也刚好在学习React,所以我打算每天坚持一篇R...
    gaoer1938阅读 1,718评论 0 5
  • 开始走出去的感觉,让人欣喜也让人缭乱。 感谢生活赐予勇气可以走出去,面对自己真正想要的生活。 感谢父母。 感谢生命...
    rebaccachen阅读 195评论 0 1