zoukankan      html  css  js  c++  java
  • react组件的生命周期

    React组件的生命周期

      在用es6写组件时,一般使用class来表示的,即 class Todos extends React.Component {}。

      

    与生命周期有关的函数:

    • consctructor --- 构造函数,在创建组件的时候调用。 
    • componentWillMount --- 在组件将要挂载之前调用一次。
    • componentDidMount --- 在组件挂载之后调用一次。 这时候,子组件也都挂载好了,即我们我可以使用refs来操作子组件了。 一般,我们都会在这个钩子函数中注册一些事件,但是注册的事件必须在 componentWillUnmojnt 将注册的组件删除。
    • componentWillReceiveProps --- props是父组件传递给子组件的,父组件在render的时候就会调用(无论props是否更新,无论父子组件是否有数据交换)。
    • shouldComponentUpdate --- 组件挂载之后,每次调用 setState 后都会调用 shouldCoponentUpdate 。判断是否需要重新渲染组件。 默认返回true,即需要重新render。 在比较复杂的应用中,有一些数据的变化并不会影响界面的展示,可以在这里做判断,优化渲染效率
    • componentWillUpdate --- 当shouldComponentUpdate返回true或者调用forceUpdate之后,componentWillUpdate就会被调用,即将要开始update。 
    • componentDidMount --- 首次render之后就会调用这个钩子函数。
    • componentDidUpdate --- 除了首次render之后都会调用componentDidUpdate这个钩子函数。注意: 这个钩子函数一般很少使i用,因为它会被频繁的调用,有很大的不确定性。
    • componentWillMount、componentDidMount和componentWillUpdate、componentDidUpdate可以对应起来。区别在于,前者只有在挂载的时候会被调用;而后者在以后的每次更新渲染之后都会被调用。
    • render --- 这个React组件中必不可少的核心函数(上面其钩子函数都不是必须的)
    • componentWillUnmount --- 组件被卸载的时候调用,一般在componentDidMount里面注册的事件需要在这里删除。

    更新方式

      在react中,触发render的有4条路径(下面我们都假设shouldComponentUpdate都是按照默认方式返回true的方式

    1. 首次渲染 Initial Render
    2. 调用 this.setState (注意:并不是一次setState就会触发一次render,React可能会合并操作,然后一次性的进行render
    3. 父组件发生更新(一般就是从父组件传递过来的props发生改变,注意:就算是props的值没有变或者父子组件没有数据交换也会触发render
    4. 调用this.forceUpdate。 

    下面这幅图大致可以说明生命周期:

    根据以上图示,我们发现,我们可以通过两条思路来讲解react中的生命周期

      • 首次加载(5个相关钩子函数):即第一次挂载时所触发的。
        • constructor -> componentWillMount -> render -> componentDidMount -> componentWillUnmount 

    更新(6个钩子函数)

      : 这是在刷新的时候可能会遇到的生命周期的问题。
      • componentWillReceiveProps -> shouldComponentUpdate -> componentWillUpdate -> render -> componentDidUpdate -> componentWillUnmount

    这些钩子函数尽管有重叠,但是在形式上已经构成了一个足球队啦!  我们 可以看到,不重叠的钩子函数有 8 个。 

    我们可以看到触发更新的几个点:this.setState、 this.forceUpdate、 还有就是父组件改变,传递过来新的props时子组件会更新 ,   并且除了 this.forceUpdate 之外,其余的更新都可以通过 shouldComponentUpdate 来优化。 

     这个链接 http://wximg.gtimg.com/shake_tv/test/lifeCycle2113.html 可以进行测试顺序。 

    参考文章: http://www.jianshu.com/p/4784216b8194

  • 相关阅读:
    ReentrantLock(重入锁)的源码解析
    vue项目使用vue-photo-preview插件实现点击图片放大预览和移动
    BOM简单总结
    js中属性类型:数据属性与访问器属性
    Javascript面向对象编程(三):非构造函数的继承(对象的深拷贝与浅拷贝)
    Javascript面向对象编程(二):构造函数的继承 作者:yuan一峰
    Javascript 面向对象编程(一):封装 作者:yuan一峰
    js面向对象、创建对象的工厂模式、构造函数模式、原型链模式
    Vue中父子组件执行的先后顺序
    Vue子组件调用父组件的方法
  • 原文地址:https://www.cnblogs.com/zhuzhenwei918/p/7255668.html
Copyright © 2011-2022 走看看