React严格定义了组件的生命周期,生命周期可能会经历以下三个过程:浏览器
当组件第一次被渲染时,依次调用的函数:服务器
constructor函数
ES6中每一个类的构造函数,要建立一个组件类的实例,便会调用对应的构造函数
注意:this
- 并非每一个组件都须要定义本身的构造函数,无状态的React组件每每就不须要定义构造
函数;- 一个React组件须要构造函数目的:
- 初始化state,由于组件的生命周期中任何函数均可能要访问state,那么整个周期中第一个被调用的构造函数即是初始化state最理想的地方;
- 绑定成员函数的this环境:
- 由于在ES6语法下,类的每一个成员函数在执行时的this并非和类实例自动绑定的;
- 而在构造函数中this就是当前组件实例,因此,为了方便未来调用,每每在构造函数中将这个实例的特定函数绑定this为当前类实例:code
... constructor(props){ super(props); this.onClickFunc = this.onClickFunc.bind(this); }
getInitialState和getDefaultProps
1. getInitialState函数的返回值用来初始化组件的this.state;
2. getInitialState只出如今装载过程,也就是说一个组件的整个生命周期过程当中,这个函数只被调用一次;
3. getDefaultProps函数的返回值能够做为props的初始值;
4. 两个函数都只有在使用React.createClass方法建立组件类时才会用到:component
const Sample = React.createClass({ getInitialState: function() { return {foo: '返回值将做为this.state的初始值'}; }, getDefaultProps: function() { return {sampleProp: '做为props的初始值'} } })
5. React.createClass建立方法已经逐渐被Facebook官方废弃
6. 使用ES6时,在构造函数中经过this.state赋值完成状态初始化;经过给类属性(注意是类属性,而不是类的实例对象的属性)defaultProps赋值指定的props初始值:对象
class Sample extends React.Component{ constructor (props){ super(props); this.state = {foo: '初始值'} } } Sample.defaultProps = { sampleProps: 0 }
render生命周期
componentWillMount和componentDidMount字符串
- render函数自己并不往DOM树上渲染或者装载内容,它只是返回一个表示JSX表示的对象(及组件实例),而后由React库根据返回的对象决定如何渲染;
- 而React库确定是要把全部组件返回的结果综合起来,才能知道如何产生对应的DOM修改;
- 因此只有React库调用全部组件的render函数以后,才有可能完成DOM装载,这时候才会依调用componentDidMount函数做为装载的收尾。
- componentWillMount能够在服务器和浏览器端被调用,而componentDidMount只能在浏览器端被调用(由于componentDidMount是在‘装载’完成以后被调用,且‘装载’是一个建立组件并放到DOM树上的过程,而服务器端渲染经过React组件产生的只是一个纯粹的字符串,并不会产生DOM树,即在服务器端不可能完成‘装载过程’因此没法调用componentDidMount)
更新过程会依次调用如下生命周期函数,其中render函数和“装载”过程同样:
- componentWillReceiveProps
- shouldComponentUpdateget
componentWillReceiveProps(nextProps)
shouldComponentUpdate(nextProps,nextState)
componentWillUpdate和componentDidUpdate