Date: 2015-11-27 21:23

Category: Web

Tags: JavaScript

Author: 刘理想

1. React Components的生命周期

React Components的3种状态:

  • Mounted:React Component被render解析,生成对应的DOM节点,并被插入浏览器的DOM结构的过程。这个过程结束了就是这个组件被Mounted了。
  • Update:一个被mounted的React Component被重新render的过程。
  • Unmounted:一个被mounted的React Component对应的DOM节点被从DOM结构中移除的这样一个过程。

每一个状态React都封装了对应的hook函数。


2. React Components生命周期中的hook函数

2.1 实验,来添加mount的hook函数

我们使用getInitialState, componentWillMount, componentDidMount来添加React Component在Mount阶段的hook函数,其中getIntialState返回一个键值对对象。

  1. <div id="container"></div>
  2. <script type="text/jsx">
  3. var Hello = React.createClass({
  4. getInitialState: function(){
  5. alert("getInitialState");
  6. return {
  7. opacity: 1.0,
  8. fontSize: '20px'
  9. }
  10. },
  11. render: function(){
  12. return <div style={{color:'red'}}>Hello, {this.props.name}</div>;
  13. },
  14. componentWillMount: function(){
  15. alert("component will mount");
  16. },
  17. componentDidMount: function(){
  18. alert("component did");
  19. }
  20. });
  21. React.render(<Hello name="world"/>,
  22. document.getElementById("container"));
  23. </script>

getIntialState返回的对象如何使用呢,使用{this.state}就可以了:

  1. render: function(){
  2. return <div style={this.state}>Hello, {this.props.name}</div>;
  3. }

这里state中都是合法有效的键值,如果不是的话需要这样用:

  1. render: function(){
  2. return <div style={{opacity:this.state.opacity, fontSize: this.state.fontSize}}>Hello, {this.props.name}</div>;
  3. }

propsstate的区别是什么呢?props是属于调用者的,而state是属于当前组件的。


2.2 如何修改state呢?

我们调用setState,比如我们在组件mount后一秒更改state,我们这样:

  1. componentDidMount: function(){
  2. var _self = this;
  3. window.setTimeout(function(){
  4. _self.setState({
  5. opacity: 0.5,
  6. fontSize: '44px'
  7. });
  8. }, 1000);
  9. }

这里对var _self = this进行说明:

this指的是调用函数的那个对象,也就是函数的所有者,而setTimeout中的function并不属于任何对象,它只是一个纯粹的函数调用,所以属于全局对象,这种情况下,thisglobal,因此我们为了调用组件对象,需要使用var _self = this的这种方法。

既然说到了this,我们不妨多讲一些this的使用情况,比如:

我们把函数当做构造函数来使用,这种情况下,this就是指构造函数生成的对象:

  1. function test(){
  2. this.x = 1;
  3. }
  4. var o = new test();

还有一种则是调用函数的apply, call, bind等方法,其作用是改变函数的调用对象,它们的第一个参数就是改变后的调用这个函数的对象,因此这种情况下,this指的就是第一个参数所代表的对象。因此,刚才的例子可以这样写,让function里面的this指向function外面的this

  1. componentDidMount: function(){
  2. window.setTimeout(function(){
  3. this.setState({
  4. opacity: 0.5,
  5. fontSize: '44px'
  6. });
  7. }.bind(this), 1000);
  8. }

注意,bind是从ES5才开始有的,早期的IE不支持。

通过现象看本质,我们发现,每次组件的state发生变化都会导致组件进入update阶段,从而重新render。注意,我们并没有显式的修改组件的样式,而是state的值变了之后,样式就跟着改变了。


2.3 Update阶段

我们看开始的图,可以看到:

  • componentWillReceiveProps:当一个mounted的组件将要接收新的property时,此函数会被调用,其函数参数就是新的props对象。我们可以在函数体内比较这个props参数和this.props,从而执行一些例如修改state这样的操作。
  • shouldComponentUpdate: 在一个mounted的组件已经接收到新的stateprops对象之后,判断是否有必要去更新DOM结构。这个函数的参数有2个,一个就是新的props对象,第二个参数是新的state对象。我们可以分别对比其跟this.propsthis.state来决定是否需要更新DOM结构。返回true表示更新,返回false表示不更新。
  • componentWillUpdate: 组件更新前调用。
  • compoentDidUpdate: 组件更新后调用。

一般我们很少会更新上面的4个函数


2.4 Unmounting阶段

当我们要把一个组件销毁掉的时候,则是unmounting阶段了,它只有一个调用函数:

componentWillUnmount:我们在这个函数内执行一些clean up的操作,比如释放内存、图片等。得益于浏览器的垃圾回收机制,我们基本不需要使用这个函数。

作者:liulixiang1988#gmail.com (#换成@)

参考链接:http://www.imooc.com/learn/504

React使用笔记2-React Components的生命周期的更多相关文章

  1. React 深入系列4:组件的生命周期

    文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列4:组件的生命周期 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助 ...

  2. 【React学习笔记】React生命周期梳理(16.X前后两种)

    React生命周期 「16版本以前的:」 生命周期流程图 组件从生成到被挂在到页面上的一系列过程 根据流程图打印的执行顺序图: 流程讲解: 初始化流程 start 开始创建组件 在这个周期中做的事情 ...

  3. React 入门学习笔记整理(七)—— 生命周期

    (1)react 生命周期 只有类组件有生命周期,函数组件没有生命周期 1.挂载阶段:这些方法会在组件实例被创建和插入DOM中时被调用: 1)constructor(props) 初始化组件的状态.绑 ...

  4. React学习笔记(五)State&声明周期

    React学习笔记(五) 四.State&声明周期 可以为组件添加"状态(state)".状态与属性相似,但是状态是私有的,完全受控于当前组件. 局部状态就是只能用于类(定 ...

  5. React Native填坑之旅--组件生命周期

    这次我们来填React Native生命周期的坑.这一点非常重要,需要有一个清晰的认识.如果你了解Android或者iOS的话,你会非常熟悉我们今天要说的的内容. 基本上一个React Native的 ...

  6. React Native 学习-组件说明和生命周期

    组件的详细说明(Component Specifications) 当通过调用 React.createClass() 来创建组件的时候,你应该提供一个包含 render 方法的对象,并且也可以包含其 ...

  7. React之状态(state)与生命周期

    很多时候,我们的页面数据是动态的.所以,我们需要实时渲染页面: 一.用定时函数setInterval() 组件(输出当前时间): index.js: 这样每隔1秒页面就会重新渲染一次,这样传进去的时间 ...

  8. react(一):组件的生命周期

    最近兄弟团队让我去帮忙优化两个页面,前端用的react全家桶,后端用的python,上一次写react代码都过去一年了,顺着以前的的学习思路,再捋顺一下react的要点 组件的生命周期就是Reac的工 ...

  9. 深入了解React组件重新渲染的条件和生命周期

    React组件rerender的真正条件 当前组件的State中的属性改变时且当前组件的shouldcomponentupdate返回true,那么当前组件会rerender 组件的props中的任一 ...

随机推荐

  1. Html5 Video的使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. iOS中点击背景收键盘

    这一次给大家带来的是ios中点击背景如何收键盘(感觉不错给个赞

  3. NXT项目准备资料

    聊天资源 http://www.cocoachina.com/ios/20150205/11116.html https://developer.layer.com/docs/ios/quick-st ...

  4. find: missing argument to `-exec'

    man find 发现 花括号要加 '' find ${LOG_BASE_DIR}$dir/ -type f -mtime +${KEEP_DAYS} -name ${LOG_REG} -exec r ...

  5. SQL Server 中同时操作的例子:

    在SQL 中同一逻辑阶段的操作是同时发生的. 先有一个例子做为带入: declare @x as int =1;declare @y as int =2;set @x=@y;set @y=@x;sel ...

  6. Git-常用命令集合

    该文章会陆续添加内容,学习网页来自http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 ...

  7. 原理图产生网络表后导进PADS之后,网络乱了的问题

    问题描述:在Orcad中生成的网络表(格式.ASC),导进PADS9.2中(PADS9.2中已有一些元器件),结果报Mixing nets,如下图示. 仔细检查原理图中的这些nets,发现有的有错,有 ...

  8. Delphi的WebBrowser改造,对网页中Alter等对话框的改造方法(通过COM来改造)

    刚有一段时间没做博客了,今天刚好有人问了这个问题,而自己以前也弄过,于是这里有了一篇新的博文. 关于改造WebBrowser控件的一些技巧,大家可以参考MSDN或者蒋晟写的一个东西,里面有讲的很详细的 ...

  9. 将 SQL Server 实例设置为自动启动(SQL Server 配置管理器)

    本主题说明如何使用 SQL Server 配置管理器在 SQL Server 2012 中将 SQL Server 实例设置为自动启动. 在安装过程中,SQL Server 通常配置为自动启动. 如果 ...

  10. Codeforces Beta Round #97 (Div. 2)

    A题求给出映射的反射,水题 #include <cstdio> int x,ans[105],n; int main(){ scanf("%d",&n); fo ...