react的生命周期

187 阅读3分钟
众所周知,要学习一个框架,name他的生命周期是非常重要的一部分,不仅仅会对提高组价的性能有所帮助,并且也会对数据的更新刨坑有一些帮助。
react的生命周期主要分为三部分:
即 1、初始化 2、更新 3、销毁

初始化阶段: 1、getDefaultProps 设置默认的props,也可以用defaultProps设置组件的默认属性。

example:

var ShowTitle = React.createClass({ getDefaultProps:function () {

        return {
            title:"将前端坚持到底!"
        }
    },
    
    render:function(){
        return <h1>{this.props.title}</h1>
    }
})

//渲染
ReactDOM.render(
        <ShowTitle/>,   //在未设置title属性时,显示默认值,设置后覆盖默认值
        document.getElementById("container")
)

2、getInitialState()

在使用es6的class语法时是没有这个钩子函数的,可以直接在constructor中定义this.state。此时可以访问this.props

3、componentWillMount() 组件初始化时只调用,以后组件更新不调用,整个生命周期只调用一次,此时可以修改state。

4、render()

react最重要的步骤,创建虚拟dom,进行idff算法,更新dom书都在此进行。此时就不能更改state了。

5、componentDidMount() 组件渲染之后,只调用一次。

componentDidMount()与componentWillMount()的区别,

如果想要获取外部数据并加载到组件上,只能在组件""已经"挂载到真实的网页上才能做这件事,其他情况是加载不到组件的。componentDidMount()方法中的代码,是在组 件已经完全挂载到网页上才会调用被执行,所以可以保证数据的加载。此外,在这方法中调用setState方法,会触发重渲染。所以官方设计这个方法就是用来加载外部数据用的,或处理其他的副作用代码。

constructor被调用是在组件准备要挂载的最一开始,所以此时组件尚未挂载到网页上。与componentWillMount()方法的调用是在constructor之后,在render之前,在这方法里的代码调用setstate方法不会触发重新渲染,所以它一半不会用来作加载数据之用,他也很少被使用到。

一般的从后台(服务器)获取的数据,都会与组件上要用的数据加载有关,所以都在componentDidMount方法里面作。虽然与组件上的数据无关的加载,也可以在constructor里作,但constructor是作组件state初绐化工作,并不是设计来作加载数据这工作的,所以所有有副作用的代码都会集中在componentDidMount方法里。

6、componentWillReceiveProps(nextProps)

组件初始化时不调用,组件接收新的props时调用

nextProps代表这次的props的值。

7、shouldComponentUpdate(nextProps, nextState)

react性能优化非常重要的一环。组件接收新的state或者props时调用,我们可以设置在此对比前后两个props和state是否相同,如果相同则返回false阻止更新,因为相同的属性状态一定会生成相同的dom树,这样就不需要创造新的dom树和旧的dom树进行diff算法对比,节省大量性能,尤其是在dom结构复杂的时候

8、componentWillUpdata(nextProps, nextState)

组件初始化时不调用,只有在组件将要更新时才调用,此时可以修改state

9、render()

组件渲染

10、componentDidUpdate()

组件初始化时不调用,组件更新完成后调用,此时可以获取dom节点

11、卸载

componentWillUnmount()

组件将要卸载时调用,一些事件监听和定时器需要在此时清除。