react学习笔记-05 lifecycle

时间:2022-05-26 16:05:23

根据React官网,react有三个生命状态:装载(Mounting),更新(updating),卸载()

一:装载

装载:componentWillMount/componentDidMount(组件即将被装载、组件已经被装载)

export default class blog extends React.Component{
  constructor(props){
    super(props);
    this.state = {count:0};
  };

  componentWillMount(){
    console.log("will mount");
  };
  componentDidMount(){
    console.log("did mount");
   console.log(ReactDom.findDOMNode(this)); }; render(){
   console.log("render"); return ( <div>hello world! {this.state.count}</div> ); } }

输出结果: 

 react学习笔记-05 lifecycle

可以看出,在componentWillMount里面进行setState,组件不会重新渲染.如果在componentDidMount里面setState,组件会重新渲染。

在render结束之后,就可以获得DOM 节点了。

在componentDidMount通常做一些ajax或者settimeout/setInterval操作,再更新DOM进行update操作

二:卸载

componentWillunMount:取消事件监听,清除定时器

export default class blog extends React.Component{
  constructor(props){
    super(props);
    this.state = {count:0};
  };

  componentWillMount(){
    console.log("will mount");
    this.setState({
      count:3
    });
  };
  componentDidMount(){
    console.log("did mount");

    console.log(ReactDom.findDOMNode(this));
  };

  componentWillUnmount(){
    console.log("you want kill me?");
  };

  killMyself(){
    ReactDom.unmountComponentAtNode(document.getElementById('blog'));
    console.log("yes, I want to  kill you");
  };
  render(){
    console.log("render");
    return (
      <div>hello world!  {this.state.count}
        <button onClick = {this.killMyself} value="kill"></button>
      </div>
    );
  }
}

  react学习笔记-05 lifecycle

如果在componentWillMount里面使用setInterval:

componentWillMount(){
    console.log("will mount");
    var self = this;
    this.timer = setInterval(function(){
      self.setState({count:self.state.count+1});
    },1000);
  };

点击清空按钮后会出现下面warning:

react学习笔记-05 lifecycle

该warning的出现是因为DOM被清除了,但是计时器还在。所以这个时候可以在componentWillUnmount里面清空setInterval

  componentWillUnmount(){
    console.log("you want kill me?");
    clearInterval(this.timer);
  };

三:更新

第一次创建组件的时候,不会调用update相关的方法。

shouldComponentUpdate返回true时,其他的update方法才会被触发。

  shouldComponentUpdate(nextProp,nextState){
    //判断是否需要重新渲染
    console.log("shouldComponentUpdate");
    if(nextState >2){
      return false;
    }
    return true;
  };
  componentWillUpdate(nextProps,nextState){
    //做一些数据的处理
      console.log("componentWillUpdate");
  };
  componentDidUpdate(){
    //可以获取更新后的DOM结构
    console.log("update success");
  };
  doUpdate(){
    this.setState({count:this.state.count+1});
  };
  render(){
    console.log("render");
    return (
      <div>hello world!  {this.state.count}
        <button onClick = {this.doUpdate.bind(this)}>update</button>
      </div>
    );
  }

  react学习笔记-05 lifecycle

还有一个重要的update方法:

componentWillReceivePops

用props更新子组件的state,判断子组件是否更新

var SubMessage = React.createClass({
  componentWillReceiveProps (nextProps){
    console.log("子组件将要获得props");
  },

  shouldComponentUpdate (nextProps,nextState){
    if(nextProps.count >4){
      return false;
    }
    return true;
  },
  render(){
    return (<h3>{this.props.count}</h3>);
  }
});

export default class blog extends React.Component{
  constructor(props){
    super(props);
    this.state = {count:0};
  };

  //更新周期

  shouldComponentUpdate (nextProp,nextState){
    //判断是否需要重新渲染
    console.log("shouldComponentUpdate");
    if(nextState.count >8){
      return false;
    }
    return true;
  };
  componentWillUpdate(nextProps,nextState){
    //做一些数据的处理
      console.log("componentWillUpdate");
  };
  componentDidUpdate(){
    //可以获取更新后的DOM结构
    console.log("update success");
  };
  doUpdate(){
    this.setState({count:this.state.count+1});
  };
  render(){
    console.log("render");
    return (
      <div>hello world!  {this.state.count}
        <button onClick = {this.doUpdate.bind(this)}>update</button>
        <SubMessage count={this.state.count}></SubMessage>
      </div>
    );
  }
}

  react学习笔记-05 lifecycle