<body>
<!-- React 真实 DOM 将会插入到这里 -->
<div id="example"></div>

<!-- 引入 React -->
<script src="src/libs/react.js"></script>

<!-- 引入 JSX 语法格式转换器 -->
<script src="src/libs/JSXTransformer.js"></script>

<script src="src/libs/jquery.js"></script>
<!-- 注意:script 需要注明 type 为 text/jsx 以指定这是一个 JSX 语法格式 -->
<script type="text/jsx">
var MyComponent = React.createClass({
clickHandle : function () {
this.setState({
count: this.state.count + 1
})
},
//1.创建阶段
getDefaulProps : function () {
//在创建类的时候被调用
console.log('getDefaultProps');
return {
count: 0
}
},
getInitialState: function () {
//获取this.state的默认值
console.log('getInitialState');
return {}
},
componentWillMount : function () {
//在render之前调用此方法
//业务逻辑的处理都应该放在这里,比如对state的操作等
console.log('componentWillMount')

},
render: function () {
//渲染并返回一个虚拟DOM
console.log('render');
return (
<div>
hello
<h1>{this.props.name} </h1>
<button onClick={this.clickHandle}>Click me</button>
</div>
)
},
componentDidMount : function () {
//该方法发生在render方法之后
//在该方法中,ReactJS会使用render方法返回的虚拟DOM对象来创建真实DOM结构
console.log('componentDidMount');
console.log('###end###')

},
//3.个更新阶段
componentWillReceieveProps: function() {
//该方法发生在this.props被修改或父组件调用setProps()方法之后
console.log('componentWillRecieveProps');
},
shouldComponentUpdate: function() {
//是否需要更新
console.log('shouldComponentUpdate');
return true;
},
componentWillUpadate: function() {
//将要更新
console.log('componentWillUpadate');
},
componentDidUpdate: function() {
//更新完毕
console.log('componentDidUpdate');
},
//4.销毁阶段
componentWillUnmout: function() {
//销毁时被调用
console.log('componentWillUnmout');
}
})
React.render(
<MyComponent name="World " />,
document.getElementById('example')
)
</script>
</body>

生命周期各阶段

在整个ReactJS的声明周期中,主要会经历这四个阶段:创建阶段、实例化阶段、更新阶段、销毁阶段

创建阶段:

该阶段主要发生在创建组件类的时候,即在调用React.createClass的时候。这个阶段只会触发一个getDefaultProps方法,该方法会返回一个对象,并缓存下来。然后与父组件制定的props对象合并,最后赋值给this.props作为该组件的默认属性。

实例化阶段

该阶段主要发生在实例化组件类的时候,也就是组件类被调用的时候。

React.render(
<MyComponent name="World " />,
document.getElementById('example')
)

该组件被调用的时候,这个阶段会触发一系列的流程,具体的执行顺序如下所示。

  • getInitialState。

    初始化组件的state的值,其返回值会赋值给组件的this.state属性。

  • componentWillMount 在渲染(挂载)之前调用一次。

    此时this.refs对象为空。如果在此时调用this.setState()则会更新this.state对象

  • render

    根据state的值,生成页面需要的虚拟DOM结构,并返回该结构

  • componentDidMount

    在渲染之后调用一次。根据虚拟DOM结构而生成的真实DOM进行相应的处理,组件内部可以通过this.getDOMNode()来获取当前组件的节点,然后就可以像在web开发中那样操作里面的DOM元素了。

componentDidMount : function () {
//该方法发生在render方法之后
//在该方法中,ReactJS会使用render方法返回的虚拟DOM对象来创建真实DOM结构
console.log('componentDidMount');
console.log('###end###')

},

更新阶段

主要发生在用户操作或者组件有更新的时候,此时会根据用户的操作行为进行相应的页面结构的调整。该阶段也会触发一系列的流程,具体的执行顺序如下所示。

  • componentWillReceiveProps

    在将要接收props时调用。在该函数中,通常可以调用this.setState方法来完成对state的修改。

    props是父组件传递给资组建的。父组件发生render的时候子组件就会调用componentWillReceiveProps(不管props有没有更新,也不管父子组件之间有没有数据交换)。

componentWillReceieveProps: function() {
//该方法发生在this.props被修改或父组件调用setProps()方法之后
console.log('componentWillRecieveProps');
},

shouldComponentUpdate

该方法用来拦截新的props或state,然后根据事先设定好的判断逻辑,返回值决定组件是否需要update。

组件挂载之后,每次调用setState后都会调用shouldComponentUpdate判断是否需要重新渲染组件。默认返回true,需要重新render。在比较复杂的应用里,有一些数据的改变并不影响界面展示,可以在这里做判断,优化渲染效率。

shouldComponentUpdate: function() {
//是否需要更新
console.log('shouldComponentUpdate');
return true;
},

  • componentWillUpdate :

    组件更新之前调用一次。当上一部中shouldComponentUpdate方法返回true时候,就可以在该方法中做一些更新之前的操作。

  • render

    根据一系列的diff算法,生成页面需要的虚拟DOM结构,并返回该结构。实际表明,在render中,最好只做数据和模板的结合,而不进行state等逻辑的修改,这样组件结构更清晰。

  • componentDidUpdate 组件的更新已经同步到DOM中后出发。

    除了首次render之后调用componentDidMount,其它render结束之后都是调用componentDidUpdate。

销毁阶段

  • componentWillUnmount

    会在组件即将从挂载点移去时调用,用来取出去除即将被销毁的DOM节点的引用,或者是清除计时器,取消监听的时间等等。

componentWillMount、componentDidMount和componentWillUpdate、componentDidUpdate可以对应起来。区别在于,前者只有在挂载的时候会被调用;而后者在以后的每次更新渲染之后都会被调用。

 

react9 生命周期的更多相关文章

  1. react组件的生命周期

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

  2. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  3. C# MVC 5 - 生命周期(应用程序生命周期&请求生命周期)

    本文是根据网上的文章总结的. 1.介绍 本文讨论ASP.Net MVC框架MVC的请求生命周期. MVC有两个生命周期,一为应用程序生命周期,二为请求生命周期. 2.应用程序生命周期 应用程序生命周期 ...

  4. UIViewController生命周期-完整版

    一.UIViewController 的生命周期 下面带 (NSObject)的方法是NSObject提供的方法.其他的都是UIViewController 提供的方法. load   (NSObje ...

  5. angular2系列教程(十一)路由嵌套、路由生命周期、matrix URL notation

    今天我们要讲的是ng2的路由的第二部分,包括路由嵌套.路由生命周期等知识点. 例子 例子仍然是上节课的例子:

  6. Spring中Bean的作用域、生命周期

                                   Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...

  7. Autofac - 生命周期

    实例生命周期决定在同一个服务的每个请求的实例是如何共享的. 当请求一个服务的时候,Autofac会返回一个单例 (single instance作用域), 一个新的对象 (per lifetime作用 ...

  8. 【微信小程序开发•系列文章六】生命周期和路由

    这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...

  9. Xamarin.Android活动的生命周期

    一.前言 用过Android手机的人一定会发现一种现象,当你把一个应用置于后台后,一段时间之后在打开就会发现应用重新打开了,但是之前的相关的数据却没有丢失.可以看出app的“生命”是掌握在系统手上的, ...

随机推荐

  1. import sun.net.www.MimeTable报错

    我原以为是要导什么jar包,仔细一看是 Access restriction: The type * is not accessible due to restriction on required ...

  2. 最常见的 20 个 jQuery 面试问题及答案

    jQuery 面试问题和答案 JavaScript 是客户端脚本的标准语言,而 jQuery 使得编写 JavaScript 更加简单.你可以只用写几行的jQuery 代码就能实现更多的东西. 它是最 ...

  3. python lxml install

    之前记得安装libxslt和libxml yum install libxml* -yyum install libxslt* -y wget http://lxml.de/files/lxml-3. ...

  4. CentOS 7 防止端口自动关闭

    tl;dr firewall-cmd --permanent --zone=public --add-port=2888/tcp firewall-cmd --reload #重新载入服务 永久配置f ...

  5. Node学习思维导图

    如果看不清楚图片上的内容,右键保存图片或新窗口打开.

  6. 【转】stopPropagation, preventDefault 和 return false 的区别

    因为有父, 子节点同在, 因为有监听事件和浏览器默认动作之分. 使用 JavaScript 时为了达到预期效果经常需要阻止事件和动作执行. 一般我们会用到三种方法, 分别是  stopPropagat ...

  7. Webform Application传值 ViewState

    Application:所有的会话共享一个Application空间,任何一个人改变Application的内容,其他人都会发现被改变了.Application中的内容不会被自动释放 存放位置:服务端 ...

  8. unison+inotify

    hostnamectl --static set-hostname tCentos 1.下载文件到/usr/local/srcocamlunisoninotify-tools 2.安装inotify- ...

  9. Linux tar文件打包

    tar格式,会打包成一个文件,可以对多个目录,或者多个文件进行打包 tar命令只是打包,不会压缩,打包前后大小是一样的 tar命令 -c    //打包 -x    //解压 -f    //指定文件 ...

  10. java学习笔记(3)之面向对象(1)

    下面来谈谈我对面向对象的一些理解和总结. 1.什么叫面向对象?我自己的理解就是一种编程思想,强调对象,是一种思考问题的思维模式.在学习面向对象的时候,我们要建立起自己面向对象的思维模式. (1).先整 ...