原文在此:A Visual Guide to State in React
javascript
React的"state"概念是比较难学的内容,不只仅是由于React中放置了state,而是实际上,React是所以而生存. Redux也和React的state直接相关. 我但愿在本文中能把一些困惑的内容讲清楚java
实际上,这个词"state"有点模棱两可.某种意义上,"state"意思是当前屏幕上的数据表现. 它能够是"loading" 状态,或者是一个"error" 状态. 这里的解释和React里的state解释还不太同样.react
从React的角度上,"state"是一个表明了应用中能够变化的部分.每一个组件都在this.state
中保存了本身的stateweb
简而言之,若是须要应用能够作任何事-若是想添加交互,添加和删除内容,输入输出日志-都要包含在state中.服务器
假设你有这样一个应用,在特定的时间,以下图: websocket
看这张图,挑出全部能够改变的部分(基本上包含了全部的东西)app
如今咱们能够给这些内容定义名字(时间,电池用量,室内温度,室外温度),用JavaScript对象描述以下:异步
{
currentTime: "2016-10-12T22:25:42.564Z",
power: {
min: 0,
current: 37,
max: 100
},
indoorTemperature: {
min: 0.0,
current: 72.0,
max: 100.0
},
outdoorTemperature: {
min: -10.0,
current: 84.0,
max: 120.0
},
tempUnits: "F"
}
复制代码
这个对象描述了应用的整个state,也就是React state的用途.socket
注意一点,字段没有和UI彻底契合. 不要紧,日期很容易格式化,能够用最大值这最小值画出图形的尺度,等等.ide
这一点保持不变:改变了state
对象就会改变app的表现.
读者 foobarwtf指出 min
和max
不会改变,由于他们从不改变,为何还要在state
中出现? 常见的作法是从服务器获取响应输入到state.若是你远程获取当前温度数据,数据就包含了min
,max
.最好和state中其余数据一块儿保存. 由于看起好像数据是固定不变的.可是如何服务器改变了标准怎么处理? 若是用户使用了一个200A的电力系统?等等问题.
因此:state一般保存这个能够变化的东西,也能够放一些从服务器得到的易改变的信息.
若是state中任何一项发生变化,例如温度飙升到75°,应用应该刷新反映出变化.这就是React根据state所作的工做:从新渲染整个app
这里是state可能发生变化的缘由:
那么,React是如何知道state发生改变的? 持续轮训变化?像Angular同样观察事件?不是,一点也不神奇.
React知晓State的变化是由于你在组件内部经过this.setState
显式的告诉组件应该怎么更新.换句话说,没有什么魔法,React只是按照你设定的去作更新.
上面的家庭检测应用是一个state实战的绝好实例,可是咱们会返回简单的"counter"应用,看看state是如何变化的.
这里是counter的工做方式:
handleClick
函数)setState
完成这个任务)快速浏览:
setState
来改变对象setState
时,React会从新渲染 这里有两个地方要注意:this.state
,必定要用this.setState
this.state
中当即获取this.setState
的变化,可能尚未反应出来.在本文中,我说过state是一个描述整个app的单一对象-可是在实际中,它须要分红更小的片断. 最好的方法是把它们保存在"container"组件中,和"presentational"组件隔离.
若是你正在使用Redux,你实际就有一个描述整个app的大 state对象. Redux的基本作法就是保持一个大的表明整个应用的state, 接着reducer和mapStateToProps
把它切分红每一个组件须要的块.
我但愿本文能让你理解state的内容.