React 组件的生命周期API和事件处理
一、简单记录React的组件的简洁的生命周期API:
A:实例化期:
一个实例第一次被创建时所调用的API与其它后续实例被创建时所调用的API略有不同。
实例第一次被创建时会调用getDefaultProps,而后续实例创建时不会调用这个方法。
实例被创建时,依次被调用的API有:
getDefaultProps:
实例第一次被创建时才调用,对于组件类来说,它只调用一次。
这个方法返回的对象可为实例设置默认的props值。
getInitialState:
对于每个实例来说,这个方法只调用一次。每次创建实例时执行一次。
在这里初始化每个实例的state,在这里可以访问到this.props。
componentWillMount:
在首次渲染之前被调用,在渲染之前更改组件state的最后机会。
render:
组件的唯一必需方法。创建虚拟DOM,表示组件输出。
只能通过this.props和this.state访问数据。
可以return null,return false,或return 任何React组件。
只能有一个顶级组件。
不能改变组件状态,或修改DOM的输出。
(注,render返回的结果说虚拟DOM,React随后会把它和真实DOM做对比,来判断是否有必要做出修改)
componentDidMount:
render成功调用并且真实DOM也已经被渲染后,这个方法会调用。
在这里可以通过this.getDOMNode()方法访问真实的DOM。
例如需要测量DOM元素的宽度和高度等属性,可以在这个方法里做。
(注,React跑在Server端时,componentDidMount不会被调用)
B:存在期:
随着应用状态的改变,以下API依次被调用:
componentWillReceiveProps
shouldComponentUpdate
componentWillUpdate
render
componentDidUpdate
C:销毁期:
组件被用完后,以下API被调用,给实例清理自身:
componentWillUnmount
注意反模式:
在getInitialState方法里,通过this.props来创建state的方法是一种反模式!
React专注于维护数据的单一来源,当组件的state值和它所基于的prop不同步时,是一种反模式!
反模式例子:
getDefaultProps: function() {
return { date: new Date() }
};
getInitialState: function() {
return {
day: this.props.date.getDay() // 不要在这里计算
}
};
render: function() {
return <div>Day is: {this.state.day}</div>;
};
正确的模式应该是在渲染时计算:(保证计算后的值不会与派生出它的props值不同步)
getDefaultProps: function() {
return { date: new Date() }
};
render: function() {
var day = this.props.date.getDay(); // 在渲染时做计算是正确的
return <div>Day is: {day}</div>;
};
注意,组件可以用this.props访问props,但不能修改自己的props!
关于state:
每个组件都有自己的state。state和props区别在于state只存在于组件内部。
state用来确定一个元素的视图状态。
state可以用setState或replaceState来修改。(不能用this.state来修改state)
只要setState或replaceState被调用,render就会被调用。如果render返回值有变化,DOM就会被更新。
二、React的事件处理:
事件文档:http://facebook.github.io/react/docs/events.html
绑定一个事件处理器:
React.DOM.button({className:"btn", onClick: this.handleSendClick}, "Send");
触控事件需要调用这个方法来手动启动:React.initializeTouchEvents(true);
更新组件状态会触发组件重绘。
setState会更新某一个state属性,而replaceState会替换掉整个state对象。
在绑定的事件处理器里做setState:
getInitialState: function() {
return { title: "Title 1.0" }
};
handlePageOnload: function(ev) {
this.setState({title: "Title 2.0"});
ev.preventDefault(); // 非必需,视情况而定
};
小结:更改state只能用setState或replaceState,因为它们可以通知React重绘DOM,即调用render方法。
补充:关于处理input的onChange事件:
handleComplete: function(event) {
this.callMethodOnProps("onCompleted", event.target.value);
};
render: function() {
return <textarea onBlur="{this.handleComplete}"></textarea>
};
注意,使用event.target.value获取input值是一种常规方法。
React 组件的生命周期API和事件处理的更多相关文章
- 2. React组件的生命周期
2. React组件的生命周期 使用React开发时候用到最多的就是React的组件了,通过继承React.Component,加入constructor构造函数,实现Render方法即可.这当中Re ...
- React 组件的生命周期方法
React 组件的生命周期方法 按渲染顺序: 1: componentWillMount() – 在渲染之前执行,在客户端和服务器端都会执行. 2: componentDidMount() – 仅在第 ...
- react第三单元(react组件的生命周期)
第三单元(react组件的生命周期) #课程目标 灵活掌握react组件的生命周期以及组件的活动过程. 能够灵活使用react的生命周期 #知识点 react的类组件的生命周期分为三个阶段 实例期 存 ...
- react 组件的生命周期 超简版
组件从被创建到被销毁的过程称为组件的 生命周期: 通常,组件的生命周期可以被分为三个阶段:挂载阶段.更新阶段.卸载阶段: 一.挂载阶段 这个阶段组件被创建,执行初始化,并被挂载到DOM中,完成组件的第 ...
- react 组件的生命周期
组件的生命周期 过程 装载(Mounting) :组件被插入到 DOM 中: 更新(Updating) :组件重新渲染以更新 DOM: 卸载(Unmounting) :组件从 DOM 中移除. 过程 ...
- React组件和生命周期简介
React 简介----React 是 Facebook 出品的一套颠覆式的前端开发类库.为什么说它是颠覆式的呢? 内存维护虚拟 DOM 对于传统的 DOM 维护,我们的步骤可能是:1.初始化 ...
- 理解React组件的生命周期
本文作者写作的时间较早,所以里面会出现很多的旧版ES5的时代的方法.不过,虽然如此并不影响读者理解组件的生命周期.反而是作者分为几种不同的触发机制来解释生命周期的各个方法,让读者更加容易理解涉及到的概 ...
- React: React组件的生命周期
一.简介 在前面的第二篇博文中对组件的生命周期虽然做了一个大略介绍,但总感觉说的过于简单,毕竟生命周期是React组件的核心部分.在我们熟练使用React挂载和合成组件来创建应用表现层的过程中,针对数 ...
- react组件的生命周期
写在前面: 阅读了多遍文章之后,自己总结了一个.一遍加强记忆,和日后回顾. 一.实例化(初始化) var Button = React.createClass({ getInitialState: f ...
随机推荐
- Java 静态代理和动态代理例子
代理Proxy: Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委 ...
- TEXT 15 A text a day...
TEXT 15 A text a day... Mar 24th 2006 From The Economist print edition The medical uses of mobile ph ...
- Kotlin语言学习笔记(7)
反射 // 反射 val c = MyClass::class val c2 = MyClass::class.java // 获取KClass的引用 val widget: Widget = ... ...
- 趣味编程:CPS风格代码(Java 8,Functional Java版)
CPS风格代码(Java 8版) package fp; import java.util.function.IntConsumer; public class CPS { static int ad ...
- docker 入門
http://dockone.io/article/277 我的碎碎念:Docker入门指南 [编者的话]之前曾经翻译过很多Docker入门介绍的文章,之所以再翻译这篇,是因为Anders的角度很独特 ...
- KEGG下载某物种最新的版本信息(斑马鱼为例)
步骤一:打开链接并选择物种 http://www.genome.jp/kegg-bin/get_htext?hsa00001+3101 步骤二:对文件进行解析 步骤三:统计信息 一级结构(6大类): ...
- racktables 的介绍及搭建指南
Racktables RackTables称自己为一个“机架空间.IP地址.服务器.交换机.路由器等 的管理框架”.它拥有一个web界面,执行报告和配置,并管理名字服务.RackTables以PHP5 ...
- google thumbnailator
Thumbnailator 是一个优秀的图片处理的Google开源Java类库.处理效果远比Java API的好. 从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片 ...
- php下ajax的文件切割上传
html5中的File对象继承Blob二进制对象,Blob提供了一个slice函数,可以用来切割文件数据. <!DOCTYPE HTML> <html lang="zh-C ...
- oracle查找特定表的引用
select * from user_source t where upper(t.TEXT) like upper('%table1%') 第二种方法类似于eclipse中的file search ...