本文作者写作的时间较早,所以里面会出现很多的旧版ES5的时代的方法。不过,虽然如此并不影响读者理解组件的生命周期。反而是作者分为几种不同的触发机制来解释生命周期的各个方法,让读者更加容易理解涉及到的概念。以下是正文。

简介

React在创建组件的时候会触发组件生命周期各个方法的调用。这篇文章就分别介绍其中的各种不同的绘制触发之后调用的各个生命周期的方法。

理解组件的生命周期,你才可以在组件创建、销毁的时候执行特定的方法。甚至于,你可以决定是否更新组件,正确的处理stateprops的改变。

生命周期

要弄清楚生命周期,首先就要区分开初次创建和stateprops更改触发的组件更新,以及组件的卸载。

初始化

初始化
initial props
initial state
componentWillMount
render
componentDidMount

在ES6里,initial props在类的constructor方法里作为参数传入了。initial state则在constructor方法里有开发者自行设置。如:

class DemoComponent extends React.Component {
constructor(props) {
super(props) this.state = {
initialState: 'value',
} this._innerMethod = this._innerMethod.bind(this)
}
}

componentWillMount方法在render方法执行之前被调用。有一点需要注意,在这里设置state不会触发重绘。

render方法返回组件需要的标记(markup),并最终转化为正确的输出。propsstate都不应该在这个方法里修改。一定要记住render方法必须是一个纯函数。也就是每次调用,这个方法都要返回同样的结果。

render方法执行之后就开始执行componentDidMount方法。DOM元素(React Native的原生元素)可以在这个方法里取到。这时可以在这个方法里执行数据获取等操作。如果需要的话,任何的DOM操作都可以在这里执行,绝对不可以在render方法里执行。

State改变引发的绘制

State的修改会触发一些列的方法:

更新state
shouldComponentUpdate
componentWillUpdate
render
componentDidUpdate

shouldComponentUpdate方法会在render方法调用之前调用。在这个方法里可以控制是否绘制组件,或者直接跳过。显然,这个方法一定不会在初始化的时候调用。在这个方法里需要返回一个boolean类型的值,默认返回true

shouldComponentUpdate(nextProps, nextState) {
return true
}

通过对nextPropsnextState的值的处理,可以判定接下来的重绘是否必要。

componentWillUpdate方法在shouldComponentUpdate方法返回true之后就会被调用。在和方法里任何的this.setState方法调用都是不允许的,因为这个方法是用来为接下来的绘制做准备的,不是用来触发重绘的。

componentDidUpdate方法在render方法之后调用。和componentDidMount方法类似,这个方法里也可以执行DOM操作。

componentWillUpdate(nextProps, nextState) {
// 为接下来的绘制做准备
} componentDidUpdate(prevProps, prevState) {
//
}

Props改变引发的绘制

任何对props对象的修改也会触发生命周期方法的调用,这个过程和state的修改引发的生命周期方法基本一致,只是多了一个方法。

更新Props
componentWillRecieveProps
shouldComponentUpdate
componentWillUpdate
render
componentDidUpdate

componentWillRecieveProps只会在props对象发生改变并且不是初始绘制的时候调用。在这个方法里,可以根据当前的props和将要传入的props来设置state,但是这样并不会触发绘制。**这个方法里有个很有趣的地方,在这个方法里state的相等比较是无效的,因为state的改变不应该引起任何的props的改变。

componentWillReceiveProps(nextProps) {
this.setState({
// 设置state
})
}

其他的生命周期基本上和改变state引起的生命周期方法是一样的。

卸载

卸载
componentWillUnmount

我们唯一没有触及的方法就是componentWillUnmount了。这个方法在组件被从DOM中移除之前调用。当你需要在组件移除前执行清理操作的时候非常有用。比如,清除timer之类的对象。

原文地址:http://busypeoples.github.io/post/react-component-lifecycle/

理解React组件的生命周期的更多相关文章

  1. 2. React组件的生命周期

    2. React组件的生命周期 使用React开发时候用到最多的就是React的组件了,通过继承React.Component,加入constructor构造函数,实现Render方法即可.这当中Re ...

  2. React 组件的生命周期方法

    React 组件的生命周期方法 按渲染顺序: 1: componentWillMount() – 在渲染之前执行,在客户端和服务器端都会执行. 2: componentDidMount() – 仅在第 ...

  3. react第三单元(react组件的生命周期)

    第三单元(react组件的生命周期) #课程目标 灵活掌握react组件的生命周期以及组件的活动过程. 能够灵活使用react的生命周期 #知识点 react的类组件的生命周期分为三个阶段 实例期 存 ...

  4. React组件和生命周期简介

        React 简介----React 是 Facebook 出品的一套颠覆式的前端开发类库.为什么说它是颠覆式的呢? 内存维护虚拟 DOM 对于传统的 DOM 维护,我们的步骤可能是:1.初始化 ...

  5. react 组件的生命周期

    组件的生命周期 过程 装载(Mounting) :组件被插入到 DOM 中: 更新(Updating) :组件重新渲染以更新 DOM: 卸载(Unmounting) :组件从 DOM 中移除. 过程 ...

  6. React: React组件的生命周期

    一.简介 在前面的第二篇博文中对组件的生命周期虽然做了一个大略介绍,但总感觉说的过于简单,毕竟生命周期是React组件的核心部分.在我们熟练使用React挂载和合成组件来创建应用表现层的过程中,针对数 ...

  7. react 组件的生命周期 超简版

    组件从被创建到被销毁的过程称为组件的 生命周期: 通常,组件的生命周期可以被分为三个阶段:挂载阶段.更新阶段.卸载阶段: 一.挂载阶段 这个阶段组件被创建,执行初始化,并被挂载到DOM中,完成组件的第 ...

  8. react组件的生命周期

    写在前面: 阅读了多遍文章之后,自己总结了一个.一遍加强记忆,和日后回顾. 一.实例化(初始化) var Button = React.createClass({ getInitialState: f ...

  9. React 组件的生命周期API和事件处理

    一.简单记录React的组件的简洁的生命周期API: A:实例化期: 一个实例第一次被创建时所调用的API与其它后续实例被创建时所调用的API略有不同. 实例第一次被创建时会调用getDefaultP ...

随机推荐

  1. Linux 上利用Nginx代理uWSGI处理Flask web应用

    一.介绍 最近开发要用一个测试环境,是这样的Nginx+uwsgi+flask 的一个结构.下面是一些记录,在Centos 系统上使用Flask 架构部署一个简单的Python应用.然后使用Nginx ...

  2. python-web自动化环境安装

    web自动化环境安装 1.安装selenium 命令行使用以下命令安装selenium:pip install -U selenium 2.安装chrome浏览器 3.chromedriver的下载  ...

  3. Dubbo基本原理机制

      分布式服务框架: –高性能和透明化的RPC远程服务调用方案 –SOA服务治理方案 -Apache MINA 框架基于Reactor模型通信框架,基于tcp长连接 Dubbo缺省协议采用单一长连接和 ...

  4. python学习笔记_week25

    note Day25 - 博客 - KindEditor - beautifulsoup4对标签进行过滤 - 单例模式 - 事务操作 - from django.db import transacti ...

  5. airbnb 开源reAir 工具 用法及源码解析(一)

    reAir 有批量复制与增量复制功能 今天我们先来看看批量复制功能 批量复制使用方式: cd reair ./gradlew shadowjar -p main -x test # 如果是本地tabl ...

  6. MySQL索引原理及优化

    一.各种数据结构介绍 这一小节结合哈希表.完全平衡二叉树.B树以及B+树的优缺点来介绍为什么选择B+树. 假如有这么一张表(表名:sanguo): (1)Hash索引 对name字段建立哈希索引: 根 ...

  7. java学习--异常

    异常的概念 java异常是java提供的用于处理程序中错误的一种机制 所谓的错误是指在程序运行过程中发生的一些异常事件.如除0溢出,数组下标越界,文件不存在 设计良好的程序应该在异常发生时,提供处理这 ...

  8. 微擎系统jssdk系统快速签名变量

    jssdkconfig = {php echo json_encode($_W['account']['jssdkconfig']);} || { jsApiList:[] };    jssdkco ...

  9. eclipse配置Servlet连接Mysql要注意的几个地方

    用Servlet即把jdbc那套放到继承于HttpServlet的派生类之内,那段代码很简单 protected void doPost(HttpServletRequest request, Htt ...

  10. Python设计模式 - 基础 - 封装 & 继承 & 多态

    面向对象的核心是对象,世间万物都可以看作对象,任何一个对象都可以通过一系列属性和行为来描述,可以包含任意数量和类型的数据或操作.类是用来描述具有相同属性和方法的所有对象的集合.类通常是抽象化的概念,而 ...