React组件的生命周期说明

组件的生命周期有3个主要部分: 1) 实例化:组件被注入DOM。 2) 存在期:组件被重新渲染来决定DOM是否应被更新。 3) 卸载:组件从DOM中被移除。 React提供生命周期方法,以便指定...

attachments-2020-06-EQZP0SL35eface0c9385c.png

组件的生命周期有3个主要部分:


1) 实例化:组件被注入DOM。


2) 存在期:组件被重新渲染来决定DOM是否应被更新。


3) 卸载:组件从DOM中被移除。


React提供生命周期方法,以便指定钩挂到这个过程上。提供will方法,在某事件发生前被调用;提供did方法,在某事件发生后被调用。


 


1、实例化


1) getDefaultProps():


对于每个组件类来说,该方法只会调用一次,该组件类的所有后续实例将不会再调用,其返回的对象可以用于设置默认的props值。


2) getInitialState():


在组件实例化前被调用一次,返回初始的state值。有状态组件应该实现此函数。


对于组件的每个实例来说,该方法的调用有且只有一次,用来初始化每个实例的state,在该方法里可以访问组件的props。每一个React组件都有自己的state,其与props的区别在于 state只存在于组件的内部,而props 在所有实例中共享。


getInitialState 和 getDefaultProps 的调用是有区别的,getDefaultProps 是对于组件类来说只调用一次,而 getInitialState 对于每个组件实例来说都会调用,且只调一次。


每次修改 state,都会重新渲染组件,会依次调用下列方法:


① shouldComponentUpdate


② componentWillUpdate


③ render


④ componentDidUpdate


3) componentWillMount():


在组件实例化前被立即调用。


该方法在首次渲染之前调用,也是在 render 方法调用之前修改 state 的最后一次机会。


4) render():


创建一个虚拟DOM,用来表示组件的输出。


对于一个组件来讲,render方法是唯一一个必需的方法。


render方法需要满足:


① 只能通过 this.props 和 this.state 访问数据(不能修改)。


② 可以返回 null,false 或者任何React组件。


③ 只能出现一个顶级组件,不能返回一组元素。


④ 不能改变组件的状态。


⑤ 不能修改DOM的输出。


render方法返回的结果并不是真正的DOM元素,而是一个虚拟DOM,一个JavaScript对象。react效率高就是这个原因。


有关虚拟DOM的介绍请见:http://www.shehuiyuan.com/article/174


5) componentDidMount():


在组件实例化后被立即调用。需要DOM node的初始化应该放在这里。


该方法不会在服务端被渲染的过程中调用。该方法被调用时,已经渲染出真实的DOM,可以在该方法中通过 this.getDOMNode() 访问到真实DOM(推荐使用 ReactDOM.findDOMNode())。


由于组件并不是真实的DOM节点,而是存在于内存之中的虚拟DOM,只有当它插入文档后,才会变成真实的DOM 。有时需要从组件获取真实的 DOM节点,就要用到 ref 属性。


注意:由于 this.refs.[refName] 属性获取的是真实的 DOM,所以必须等到虚拟 DOM 插入文档后才能使用,否则会报错。


 


2、存在期


1) componentWillReceiveProps(object nextProps):


组件的 props 属性可以通过父组件来更改,此时componentWillReceiveProps 将被调用。可以在这个方法里更新 state,以触发 render 方法重新渲染组件。


每次修改 props,若更新state,重新渲染组件,会依次调用下列方法:


① componentWillReceiveProps


② shouldComponentUpdate


③ componentWillUpdate


④ render


⑤ componentDidUpdate


2) shouldComponentUpdate(object nextProps, object nextState):


如果确定组件的 props 或 state 的改变不需要重新渲染,可以通过在这个方法里通过返回 false 来阻止组件的重新渲染,返回 false 则不会执行 render 及后面的 componentWillUpdate,componentDidUpdate 方法。


该方法是非必须的,并且大多数情况下没有在开发中使用。


3) componentWillUpdate(object nextProps, object nextState) :


在组件更新前被立即调用。


在组件接收到了新的 props 或 state 即将进行重新渲染前被调用,注意不要在此方法里再去更新 props 或 state。


4) componentDidUpdate(object prevProps, object prevState) 


在组件更新后被立即调用。


在组件重新被渲染之后会被调用。可以在这里访问并修改 DOM。


 


3、卸载


componentWillUnmount() :


在组件被卸载和摧毁前被立即调用。


每当React使用完一个组件,这个组件必须从 DOM 中卸载后被销毁,此时 componentWillUnmount 会被执行,完成所有的清理和销毁工作,在 componentDidMount 中添加的任务都需要在该方法中撤销,如创建的定时器或事件监听器。


实例请见:http://www.shehuiyuan.com/article/175


当再次实例化组件时,以下方法会被依次调用:


① getInitialState


② componentWillMount


③ render


④ componentDidMount



4、实例:

var MyBox = React.createClass({
getInitialState: function() {
return {fontSize: 15};
},
componentDidMount: function() {
setInterval(function() {
var fontSize = this.state.fontSize;
fontSize += 5;
if (fontSize == 30)
fontSize = 15;
this.setState({fontSize: fontSize});
}.bind(this), 1000);
},
render: function() {
return (
<div style={{fontSize: this.state.fontSize + "px"}}>
Hello, react!
</div>
);
}
});
ReactDOM.render(  
<MyBox />, 
   document.getElementById('content')  
); 

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
廖雪
廖雪

78 篇文章

作家榜 »

  1. admin 651 文章
  2. 粪斗 185 文章
  3. 王凯 92 文章
  4. 廖雪 78 文章
  5. 牟雪峰 12 文章
  6. 李沁雪 9 文章
  7. 全易 2 文章
  8. Stevengring 0 文章