原文在此: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的內容.