本文主要和大家分享react组件生命周期,react组件的生命周期有一堆的相关函数,其实就是一推的钩子函数。在react组件创建的各个阶段触发特定的钩子函数。希望能帮助到大家。
可以先大概看一下下面这张图:
constructor构造函数,在创建组件的时候调用一次。
constructor(props, context)
componentwillmount在组件挂载之前调用一次。如果在这个函数里面调用setstate,render()知道state发生变化,并且只渲染一次。
void componentwillmount()
renderrender是一个react组件所必不可少的核心函数。不要在render里面修改state。也不要去读写dom或者与服务器交互,保持render()方法的纯净。
reactelement render()
componentdidmount在组件挂载之后调用一次。这个时候,子组件也都挂载好了,可以在这里使用refs。
void componentdidmount()
shouldcomponentupdate这个方法在初始化render时不会执行,当props或者state发生变化时执行。函数默认返回true,需要重新render。返回false,就不会重新render了。componentwillupdate和componentdidupdate方法也不会被调用。在比较复杂的应用里,有一些数据的改变并不影响界面展示,可以在这里做判断,优化渲染效率。
boolean shouldcomponentupdate(
object nextprops, object nextstate
)
componentwillupdateshouldcomponentupdate返回true之后,componentwillupdate会被调用。需要特别注意的是,在这个函数里面,不要用this.setstate来修改状态。不然这个函数会无限循环执行。这个函数调用之后,就会把nextprops和nextstate分别设置到this.props和this.state中。紧接着这个函数,就会调用render()来更新界面了。
void componentwillupdate(
object nextprops, object nextstate
)
componentdidupdate除了首次render之后调用componentdidmount,其它render结束之后都是调用componentdidupdate。
void componentdidupdate()
componentwillreceivepropsprops是父组件传递给子组件的。父组件发生render的时候子组件就会调用componentwillreceiveprops(不管props有没有更新,也不管父子组件之间有没有数据交换)。在这个回调函数里面,你可以根据属性的变化,通过调用this.setstate()来更新你的组件状态,旧的属性还是可以通过this.props来获取,这里调用更新状态是安全的,并不会触发额外的render调用。
void componentwillreceiveprops(nextprops) {
this.setstate({...});
}
componentwillunmount当组件要被从界面上移除的时候,就会调用componentwillunmount(),在这个函数中,可以做一些组件相关的清理工作,例如取消计时器、网络请求等。
void componentwillunmount()
下面是一个react组件生命周期的测试例子var react = require('react');
var reactdom = require('react-dom');
class parent extends react.component {
constructor(){
super()
console.log(%cparent -- constructor,color:green);
this.state = {
name : 'lucy'
}
}
componentwillmount(){
console.log(%cparent -- componentwillmount,color:green);
}
componentdidmount(){
console.log(%cparent -- componentdidmount,color:green);
}
componentwillreceiveprops(){
console.log(%cparent -- componentwillreceiveprops,color:green);
}
shouldcomponentupdate(){
console.log(%cparent -- shouldcomponentupdate,color:green);
return true;
}
componentwillupdate(){
console.log(%cparent -- componentwillupdate,color:green);
}
componentdidupdate(){
console.log(%cparent -- componentdidupdate,color:green);
}
componentwillunmount(){
console.log(%cparent -- componentwillunmount,color:green);
}
changename(){
this.setstate({name : 'jone'})
}
unmountcomponent(){
reactdom.unmountcomponentatnode(document.getelementbyid(app));
}
render(){
console.log(%cparent -- render,color:green);
return(
<p style={{border:'1px solid #000',color:'green'}}>
<h2>parent:</h2>
<h3>hello {this.state.name}</h3>
<button onclick={this.changename.bind(this)}>state改变</button>
<button onclick={this.unmountcomponent.bind(this)}>卸载组件</button>
<child props1="haha"></child>
</p>
)
}
}
class child extends react.component {
constructor(){
super()
console.log( %cchild -- constructor,color:blue);
this.state = {
}
}
componentwillmount(){
console.log( %cchild -- componentwillmount,color:blue);
}
componentdidmount(){
console.log( %cchild -- componentdidmount,color:blue);
}
componentwillreceiveprops(){
console.log( %cchild -- componentwillreceiveprops,color:blue);
}
shouldcomponentupdate(){
console.log( %cchild -- shouldcomponentupdate,color:blue);
return true;
}
componentwillupdate(){
console.log( %cchild -- componentwillupdate,color:blue);
}
componentdidupdate(){
console.log( %cchild -- componentdidupdate,color:blue);
}
componentwillunmount(){
console.log( %cchild -- componentwillunmount,color:blue);
}
changename(){
this.setstate({name : 'jone'})
}
render(){
console.log( %cchild -- render,color:blue);
return(
<p style={{border:'1px solid #000',margin:'10px',color:'blue'}}>
<h2>child:</h2>
</p>
)
}
}
reactdom.render(
<parent></parent>,
document.getelementbyid('app')
);
测试例子截图如下:
改变父组件的state:
卸载组件后:
相关推荐:
微信小程序生命周期详解
react组件的生命周期函数是什么
react native 中组件生命周期的简单介绍
以上就是react组件生命周期实例分析的详细内容。