翻譯|A Visual Guide to State in React

原文在此: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中.服務器

React的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指出 minmax不會改變,由於他們從不改變,爲何還要在state中出現? 常見的作法是從服務器獲取響應輸入到state.若是你遠程獲取當前溫度數據,數據就包含了min,max.最好和state中其餘數據一塊兒保存. 由於看起好像數據是固定不變的.可是如何服務器改變了標準怎麼處理? 若是用戶使用了一個200A的電力系統?等等問題.

因此:state一般保存這個能夠變化的東西,也能夠放一些從服務器得到的易改變的信息.

如何對State進行修改

若是state中任何一項發生變化,例如溫度飆升到75°,應用應該刷新反映出變化.這就是React根據state所作的工做:從新渲染整個app

這裏是state可能發生變化的緣由:

  • 用戶點擊按鈕
  • 從服務器得到了數據-websocket的信息,或者是以前請求返回的響應數據
  • 定時器終止-或許是每5秒更新屏幕上的當前時間

那麼,React是如何知道state發生改變的? 持續輪訓變化?像Angular同樣觀察事件?不是,一點也不神奇.

React知曉State的變化是由於你在組件內部經過this.setState顯式的告訴組件應該怎麼更新.換句話說,沒有什麼魔法,React只是按照你設定的去作更新.

計數器中的State變換

上面的家庭檢測應用是一個state實戰的絕好實例,可是咱們會返回簡單的"counter"應用,看看state是如何變化的.

這裏是counter的工做方式:

  • 數字顯示從0開始
  • 你點擊按鈕(會調用設定的handleClick函數)
  • 計數器增長1(調用setState完成這個任務)
  • React 根據state的變化從新渲染app

代碼展現

快速瀏覽:

  • React以對象的形式保存state
  • 你能夠經過調用setState來改變對象
  • 每次調用setState時,React會從新渲染 這裏有兩個地方要注意:
  • 不能直接用this.state,必定要用this.setState
  • state的變化時異步的,因此若是你想從this.state中當即獲取this.setState的變化,可能尚未反應出來.

用Debugger把代碼可視化

細節,細節

在本文中,我說過state是一個描述整個app的單一對象-可是在實際中,它須要分紅更小的片斷. 最好的方法是把它們保存在"container"組件中,和"presentational"組件隔離.

若是你正在使用Redux,你實際就有一個描述整個app的大 state對象. Redux的基本作法就是保持一個大的表明整個應用的state, 接着reducer和mapStateToProps把它切分紅每一個組件須要的塊.

我但願本文能讓你理解state的內容.

相關文章
相關標籤/搜索