React lifecycle详讲

  • 组件的三个生命周期状态:

    • Mount:插入真实 DOM

    • Update:被重新渲染

    • Unmount:被移出真实 DOM

  • React 为每个状态都提供了两种勾子(hook)函数,will 函数在进入状态之前调用,did 函数在进入状态之后调用

这里说钩子函数特别形象,将任务从任务队列中勾出来

 *  componentWillMount()

  * componentDidMount() : 已插入真实DOM, 在render之后才会执行

* componentWillUpdate(object nextProps, object nextState)

* componentDidUpdate(object prevProps, object prevState)

* componentWillUnmount()
  • 生命周期流程:

1).第一次初始化渲染显示: render()

  1.constructor(): 创建对象初始化state

  2.componentWillMount() : 将要插入回调

  3.render() : 用于插入虚拟DOM回调

  4.componentDidMount() : 已经插入回调

2).每次更新state: this.setSate()

  1.componentWillUpdate() : 将要更新回调

  2.render() : 更新(重新渲染)

  3.componentDidUpdate() : 已经更新回调

3).删除组件

  1.ReactDOM.unmountComponentAtNode(document.getElementById('example')) : 移除组件

2.componentWillUnmount() : 组件将要被移除回调

  • notice

    • 一般会在componentDidMount()中: 开启监听, 发送ajax请求

    • 可以在componentWillUnmount()做一些收尾工作: 停止监听

    • 生命周期还有一个方法(后面需要时讲): componentWillReceiveProps

组件生命周期.png

例子:

 class LifeCycle extends React.Component {
    constructor(props) {
      super(props);
      console.log('constructor(): 创建组件对象');

      this.state = {
        date: new Date().toLocaleString()
      };
    }

    componentWillMount() {
      console.log('componentWillMount(): 将要初始挂载');
    }

    componentDidMount() {
      console.log('componentDidMount(): 已经初始挂载');

      this.intervalId = setInterval(
          () => {
            this.setState({date: new Date().toLocaleString()});
          },
          1000
      );
    }

    componentWillUpdate() {
      console.log('componentWillUpdate(): 将要进行state更新');
    }

    componentDidUpdate() {
      console.log('componentDidUpdate(): 已经更新');
    }

    componentWillUnmount() {
      console.log('componentWillUnmount(): 将要被移除');
      clearInterval(this.intervalId);
    }

    removeComp() {
      ReactDOM.unmountComponentAtNode(document.getElementById('example'));
    }

    render() {
      console.log('render(): 渲染内部虚拟DOM');
      return (
          <div>
            <h2>{this.props.name}, 当前时间: {this.state.date}</h2>
            <button onClick={this.removeComp}>移除组件</button>
          </div>
      );
    }
  }

  ReactDOM.render(<LifeCycle name="JACK"/>, document.getElementById('example'));

自定义组件:
功能描述: 让指定的文本做显示/隐藏的动画

 class AnimateMsg extends React.Component {
   constructor(props) {
     super(props)
     this.state = {
       opacity: 1.0
     }
   }

   componentDidMount() {
     this.intervalId = setInterval(function () {
       var opacity = this.state.opacity;
       opacity -= 0.05;
       if (opacity < 0.05) {
         opacity = 1.0;
       }
       this.setState({
         opacity: opacity
       });
     }.bind(this), 100);
   }

   componentWillUnmount() {
     clearInterval(this.intervalId)
   }

   render () {
     return (
         <p style={{opacity: this.state.opacity}}>{this.props.msg}</p>
     );
   }
 }
 AnimateMsg.propTypes = {
   msg: React.PropTypes.string.isRequired,
 }

 ReactDOM.render(<AnimateMsg msg="www.atguigu.com"/>, document.getElementById('example'));
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 说在前面 关于 react 的总结过去半年就一直碎碎念着要搞起来,各(wo)种(tai)原(lan)因(le)。心...
    陈嘻嘻啊阅读 7,090评论 7赞 41
  • 使用 create-react-app 快速构建 React 开发环境 项目的目录结构如下: React JSX ...
    majun00阅读 600评论 0赞 0
  • 深入JSX date:20170412笔记原文其实JSX是React.createElement(componen...
    gaoer1938阅读 8,206评论 2赞 35
  • 函数式编程,对应的是声明式编程,声明式编程的本质的lambda验算(是一个匿名函数,即没有函数名的函数。Lambd...
    不安分的三好份子阅读 1,294评论 0赞 1
  • 自己最近的项目是基于react的,于是读了一遍react的文档,做了一些记录(除了REFERENCE部分还没开始读...
    潘逸飞阅读 3,790评论 1赞 10

友情链接更多精彩内容