React 生命周期

React生命周期

如图:

 

一、装载(初始化)过程(Mount)

组件第一次在DOM树渲染的过程

1)getDefaultProps() :

ES5中设置默认的props(ES6中defaultProps设置组件的默认的属性)。

2)getInitialState() :

ES5中初始化state,此时可以访问this.props。

3)componentWillMount() :

在组件被挂载前调用,整个生命周期只执行一次。

4)render():

渲染组件,创建虚拟DOM,更新DOM树(不能更改state了),必须实现该方法。

5)componentDidMount():

在组件渲染之后调用,已经生成真实的DOM节点,只执行一次。

 

二、更新过程(Update)

组件被重新渲染的过程(初始化时均不调用)

1)componentWillReceiveProps(nextProps):

父组件的render()方法执行后就会调用。

2)shouldComponentUpdate(nextProps, nextState):

当state或者props改变时调用,有返回值true/false。

若返回true,则继续执行render();若返回false则放弃本次渲染(对于react性能优化非常重要)。

forceUpDate会越过shouldComponentUpdate(nextProps, nextState)重新渲染。

3)componentWillUpdate(nextProps, nextState):

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

4)render():

渲染组件

5)componentDidUpdate():

组件更新完成后调用,此时可以获取dom节点。

 

三、卸载过程(Unmount)

组件从DOM树中删除的过程

1)componentWillUnmount():

组件将要卸载时调用,将组件从DOM树移出,防止内存溢出(如:事件监听、定时器)。

 

四.例子

1.HTMI

<div id="app"></div>

2.JS

class Components extends React.Component {
  
  constructor(props){
    super(props);
    this.state = {}
  }
  componentWillMount(){
    console.debug("实例化:componentWillMount")
  }
  componentDidMount(){
    console.debug("实例化:componentDidMount")
  }
  componentWillReceiveProps(){
    console.debug("存在期:componentWillReceiveProps")
  }
  shouldComponentUpdate(nextProps,nextState){
    console.debug("存在期:shouldComponentUpdate",nextProps,nextState)
    return true;
  }
  componentWillUpdate(){
    console.debug("存在期:componentWillUpdate")
  }
  componentDidUpdate(){
    console.debug("存在期:componentDidUpdate")
  }
  render() {
    if(!this.props.reRender){
      console.debug("实例化:render")
    }else{
      console.debug("存在期:render")
    }
    return (
      <div>
        <br />
        请查看下面的console
        <br />
      </div>
    )
      
  }
}
Components.defaultProps = {
    text: "hello word",
}
class App extends React.Component{
  constructor(props){
    super(props);
    this.state = {}
  }
  refresh(){
    return (e)=>{
      this.setState({
        reRender: true,
      })
    }
  }
  render(){
    return (
      <div>
        <Components reRender={this.state.reRender}/>  
        <button onClick={this.refresh()}>
            更新Component
        </button>
      </div>
    )
  }
}
//这个组件是没有调用的,但是,getDeafultProps直接执行了
var Test = React.createClass({
  getDefaultProps: function(){
    console.debug("Test组件为调用,直接执行了defaultProps")
    return {
      
    }
  },
  render(){
    return (
      <div></div>
    )
  },
})
/*
 * Render the above component into the div#app
 */
ReactDOM.render(<App />, document.getElementById('app'));

 

posted @ 2018-03-07 22:02  慕容冰菡  阅读(253)  评论(0编辑  收藏  举报