很多时候,组件实例的外观和行为我们通过props进行定制就可以了。因为任何时候,组件实例的表现只跟 传过来的props属性 相关。
我们称这种为 无状态/ stateless 组件
即它自身是 无记忆的
 
比如切换开关,它可以响应用户的点击事件,如果当前状态是关,那么它就 切换到开的状态(显示开状态的图片);而如果当前状态是开,那么它就切换到关的 状态(显示关状态的图片)
 
状态记忆:state
React引入了状态机的概念,让组件具有不同的状态,使得组件具有记忆功能
具体如下:
  • state ——组件的状态
每个组件都有一个state变量,保存组件的当前状态。用this.state可以获取到组件的当前状态。
 
  • getInitialState()——设置组件初始状态
开发者应当写一个getInitialState() 方法来设置组件的初始状态。该方法必须返回一个JSON对象或者空值null。
 
  • setState(currentState)——设置当前组件状态
currentState必须是一个JSON对象,但只需要写上需要设置的状态的键值对,不必把所有状态变量都包含。
我们虽然可以对this.state进行赋值来设置当前组件的状态。但是React官方推荐使用setState(),因为用该方法会自动重新渲染组件。当前如果有特殊需求,是可以用this.state的。
 
具体运用如下面这个开关的例子:
 <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>EzSwitchComp</title>
<script src="lib/react.min.js"></script>
<script src="lib/JSXTransformer.js"></script>
</head>
<body>
<div id="content"></div>
<script type="text/jsx">
//组件定义
var EzSwitchComp = React.createClass({
//设置初始状态
getInitialState : function(){
return {on : false};
},
//处理点击事件,切换状态
onClick : function(){
//读取并重设状态,这将触发重新渲染
this.setState({on : !this.state.on});
},
render : function(){
//根据状态设置样式
img = this.state.on ? "img/switch-on.png" : img = "img/switch-off.png"; //返回元素
return <img src = {img} style={{width:"150px"}} onClick={this.onClick}/>;
}
});
//渲染
React.render(
<EzSwitchComp/>,
document.querySelector("#content"));
</script>
</body>
</html>
 
 
我们这里加一个需求,开关只有4次的寿命,即只能切换4次,之后alert出坏了。
下面我们就来实现,首先既然要保存寿命这个变量,让组件有记忆功能,那么就是继续使用state
直接上代码吧
 <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>EzSwitchComp</title>
<script src="lib/react.min.js"></script>
<script src="lib/JSXTransformer.js"></script>
</head>
<body>
<div id="content"></div>
<script type="text/jsx">
//组件定义
var EzSwitchComp = React.createClass({
//设置初始状态
getInitialState : function(){
return {
on : false,
life: 4
};
},
//处理点击事件,切换状态
onClick : function(){
if(!!this.state.life)
  //读取并重设状态,这将触发重新渲染
  this.setState({"on" : !this.state.on,"life": --this.state.life });
else
  alert('已完');
},
render : function(){
//根据状态设置样式
img = this.state.on ? "img/switch-on.png" : img = "img/switch-off.png"; //返回元素
return <img src = {img} style={{width:"150px"}} onClick={this.onClick}/>;
}
});
//渲染
React.render(
<EzSwitchComp/>,
document.querySelector("#content"));
</script>
</body>
</html>
这里不小心犯了一个小错误,就是this.setState({"on" : !this.state.on,"life": --this.state.life });
这句话,之前写了是 life:this.state.life--   ,然后发现console出来的this.state.life一直是4,至于这里的错误的原因,相信看官想想就明白了,就不多说了。
 
 
 
生命周期
熟悉WebComponent的同学应该都知道,组件是有生命周期的,在WebComponent中,就有4个生命周期的回调函数。
在React中,生命周期的回调函数分的更细
 
componentWillMount()——组件实例即将初次渲染时调用,整个周期中只调用1次
 
componentDidMount()——组件实例初次渲染后调用,只调用1次
 
componentWillReceiveProps(nextProps)——组件实例即将设置新属性时调用,nextProps表示新属性值。在此方法内调用setState()不会引起重新渲染。(不知道这个有什么特别的用法)
 
shouldComponentUpdate(nextProps, nextState)——组件实例即将重新渲染时调用。此方法返回false时,组件实例不会被渲染,true则渲染。通过forceUpdate()方法进行重新渲染时,这个方法不会被调用。
componentWillUpdate(nextProps, nextState)——组件实例即将重新渲染时调用。不能在此方法内调用setState()
 
componentDidUpdate(prevProps, prevState)——组件实例重新渲染后调用
 
componentWillUnmount()——组件实例即将从DOM树中移除时调用,只调用1次
 
 
 
好了,今天先这样,明天继续.....
 
 
 

React.js再探(三)的更多相关文章

  1. React.js再探(四)

    不知道看官们还记不记得上一节的内容,关于生命周期的.我们来个例子重温且练习一下. 传送门:http://www.cnblogs.com/galenyip/p/4574400.html 我们来实现一下时 ...

  2. React.js再探(二)

    上文中说到了组件了. 我们使用组件的目的最大莫过于复用,提供生产效率. 那么,这时候组件就应该能够提供一些”api”出来,让开发者去定义在不同场景下的不同表现,比如,行为或外观等. 而这些“api”就 ...

  3. React.js终探(七)(完)

    我们在前面介绍了组件的各种特性,这一节我们来说说多组件的情况. 在实际开发中,我们的组件难免会遇到有公共部分的情况,如果是个别情况还好,但如果数量比较多的话,那这时候,就需要公用了. 怎么公用呢? R ...

  4. React.js终探(六)

    在React中,我们怎么样使用它跟CSS 3 动画结合在一起使用呢? CSS3 Transitoin CSS3动画要求DOM属性变化的时候才能够被触发.所以这就需要我们把属性变化后的React元素渲染 ...

  5. react.js 从零开始(三)JSX 语法及特点介绍

    什么是jsx? jsx = JavaScript + xml jsx 是一种 Ecmascript 的一种新标准. jsx 是一种 带有结构性的语法. jsx 的特点: 1.类xml语法易于理解. 2 ...

  6. React.js终探(五)

    在React中,一切都是看做组件. 而组件的嵌套也是十分常见的. 所以有的组件就作为容器组件 容器组件 React元素可以包含子元素 如 //JSX <ezpanel title="t ...

  7. 再谈React.js实现原生js拖拽效果

    前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目 ...

  8. React.js 三周 -- 入门到搭建团队基础项目

    吐槽 公司自己的产品,由于历史遗留问题,前端一直是和java放到一个项目里写的. 导致了,前端就被死死的绑在了IDEA战车上.想要看页面效果,先起几个java服务.想要调试一个改动,重启个java服务 ...

  9. 从源码的角度再看 React JS 中的 setState

    在这一篇文章中,我们从源码的角度再次理解下 setState 的更新机制,供深入研究学习之用. 在上一篇手记「深入理解 React JS 中的 setState」中,我们简单地理解了 React 中 ...

随机推荐

  1. poj 3311Hie with the Pie

    题意:一个送披萨的,每次送外卖不超过10个地方,给你这些地方之间的时间,求送完外卖回到店里的总时间最小. 解法一: 这个n不大,即使是NP问题也才1E6多一些所以可以dfs():具体的回溯方法结合da ...

  2. POJ 3422 Kaka&#39;s Matrix Travels(费用流)

    POJ 3422 Kaka's Matrix Travels 题目链接 题意:一个矩阵.从左上角往右下角走k趟,每次走过数字就变成0,而且获得这个数字,要求走完之后,所获得数字之和最大 思路:有点类似 ...

  3. C#取硬盘、CPU、主板、网卡的序号 ManagementObjectSearcher

    原文:C#取硬盘.CPU.主板.网卡的序号 ManagementObjectSearcher private void button1_Click(object sender, EventArgs e ...

  4. Java的结构之美【2】——销毁对象

    先来看一段代码: import java.util.Arrays; import java.util.EmptyStackException; /** * 2014年6月28日09:31:59 * @ ...

  5. SpringMVC源码解析- HandlerAdapter - ModelFactory(转)

    ModelFactory主要是两个职责: 1. 初始化model 2. 处理器执行后将modle中相应参数设置到SessionAttributes中 我们来看看具体的处理逻辑(直接充当分析目录): 1 ...

  6. cocos2d-x -- 渠道SDK【棱镜】接入(1)

    棱镜SDK简单介绍 若想让游戏上线,渠道接入步骤是不可缺少的,为了避免一对一接入渠道问题,我选择了棱镜SDK,由于棱镜是游戏与渠道SDK的中间层,为CP厂商屏蔽各个渠道SDK之间的差异,整个接入过程, ...

  7. w3wp占用CPU过高

    w3wp占用CPU过高 在此之前项目有发生过两次类似的状况,都得以解决,但最近又会发现偶尔CPU会跑满,虽然之前使用过WinDbg解决过两次问题但人的记忆是不可靠的,今天处理同样问题的时候还是遇到了一 ...

  8. 与我一起extjs5(04--MVVM简要说明财产)

    与我一起extjs5(04--MVVM简要说明财产)         以下我们来看一下自己主动生成的代码中的MVVM架构的关系. Main是一个可视的控件,MainController是这个控件的控制 ...

  9. 第十二章——SQLServer统计信息(3)——发现过期统计信息并处理

    原文:第十二章--SQLServer统计信息(3)--发现过期统计信息并处理 前言: 统计信息是关于谓词中的数据分布的主要信息源,如果不知道具体的数据分布,优化器不能获得预估的数据集,从而不能统计需要 ...

  10. 快讯:埃博拉患者Martin Salia去天堂了

    下面是Martin Salia外科医生的遗像: 11月17日,埃博拉重病患者Martin Salia外科医生死了.请见:Ebola patient Dr. Martin Salia dies in O ...