(一)狀態(tài)管理工具之Redux-基礎(chǔ)篇

前言

隨著 JavaScript 單頁應(yīng)用開發(fā)日趨復(fù)雜褒墨,JavaScript 需要管理比任何時候都要多的 state (狀態(tài))。 這些 state 可能包括服務(wù)器響應(yīng)咸这、緩存數(shù)據(jù)、本地生成尚未持久化到服務(wù)器的數(shù)據(jù),也包括 UI 狀態(tài)忆矛,如激活的路由,被選中的標(biāo)簽请垛,是否顯示加載動效或者分頁器等等催训。
管理不斷變化的 state 非常困難,因此宗收,如何優(yōu)雅的管理應(yīng)用中的數(shù)據(jù)狀態(tài)成為了一個需要解決的問題漫拭。
當(dāng)下已有不少優(yōu)秀的狀態(tài)管理工具可以幫助我們解決這一難題,接下來的這段時間混稽,我會選擇現(xiàn)目前比較流行的 Redux 和 Mobx來進(jìn)行學(xué)習(xí)實踐采驻,并將學(xué)習(xí)軌跡記錄于此,便于日后查閱和鞏固匈勋。
本篇文章記錄Redux的一些基礎(chǔ)知識礼旅。

Redux是什么

專注于狀態(tài)管理的庫, 和 React 解耦洽洁。Redux 可以支持 React痘系、Angular、Ember饿自、jQuery 甚至純 JavaScript汰翠。基本中心思想可以描述如下:

(state, action) => newState

Redux核心概念

  • state-狀態(tài)樹
    例如:
{
  todos: [{
    text: 'Eat food',
    completed: true
  }, {
    text: 'Exercise',
    completed: false
  }],
  visibilityFilter: 'SHOW_COMPLETED'
}

  • Action
    Action本質(zhì)上是JavaScript普通對象昭雌,是把數(shù)據(jù)從應(yīng)用傳到 store 的有效載荷复唤。我們約定,action 內(nèi)必須使用一個字符串類型的 type 字段來表示將要執(zhí)行的動作烛卧。除了 type 字段外苟穆,action 對象的結(jié)構(gòu)完全由開發(fā)者自己決定。
{
  type: '吃蘋果',
  text: '我吃了一個蘋果'
}
  • Reducer
    Reducer 就是一個純函數(shù),接收舊的 state 和 action雳旅,返回新的 state跟磨。其指定了應(yīng)用狀態(tài)的變化如何響應(yīng) actions 并發(fā)送到 store 的,記住 actions 只是描述了有事情發(fā)生了這一事實攒盈,并沒有描述應(yīng)用如何更新 state抵拘。
  • Store
    Store 是把action 和 reducers聯(lián)系到一起的對象,有以下職責(zé):
    (1)維持應(yīng)用的state型豁;
    (2)提供getState()方法獲取state僵蛛;
    (3)提供dispatch(action)方法更新state;
    (4)通過subscribe(listener)注冊監(jiān)聽器迎变;
    (5)通過subscribe(listener)返回的函數(shù)注銷監(jiān)聽器充尉;

簡單的redux應(yīng)用

  • 通過reducer新建store,隨時通過store.getState獲取狀態(tài)
  • 需要狀態(tài)變更時衣形, 使用store.dispatch(action)來修改狀態(tài)
  • Reducer 函數(shù) 接收state 和 action驼侠,返回新的state,可以用store.subscribe監(jiān)聽每次修改
import { createStore } from 'redux'

// reducer谆吴,根據(jù)老的state和action倒源, 返回新的state
const counter = (state={}, action) => {
  switch (action.type) {
    case '摘蘋果':
      return state+1;
      break;
    case '吃蘋果':
      return state-1;
      break;
    default:
      return state;
      break;
  }
}

// 新建store
const store = createStore(counter)

// 獲取狀態(tài)
const init = store.getState()
console.log(`最初籃子里有${init}個蘋果`)     // 最初籃子里有0個蘋果

const listener = () =>{
  const current = store.getState()
  console.log(`現(xiàn)在籃子里有${current}個蘋果`)
}
// 訂閱listener,每次修改state,都會執(zhí)行l(wèi)istener
const unsubscribe = store.subscribe(listener)

// 使用store.dispatch(action)來修改狀態(tài)
store.dispatch({ type: '摘蘋果'})    // 現(xiàn)在籃子里有1個蘋果
store.dispatch({ type: '摘蘋果'})    // 現(xiàn)在籃子里有2個蘋果
store.dispatch({ type: '吃蘋果'})    // 現(xiàn)在籃子里有1個蘋果
 // 停止監(jiān)聽 state 更新
unsubscribe();

補充知識點

function counter(state=0, action) {...}

其中state=0是es6中為函數(shù)參數(shù)指定默認(rèn)值的寫法句狼,即調(diào)用該函數(shù)時笋熬,若不傳對應(yīng)的參數(shù),或傳undefined腻菇, 則使用指定的默認(rèn)值胳螟。
PS: 若有錯誤或不準(zhǔn)確的地方,歡迎指正筹吐!感謝旺隙!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市骏令,隨后出現(xiàn)的幾起案子蔬捷,更是在濱河造成了極大的恐慌,老刑警劉巖榔袋,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件周拐,死亡現(xiàn)場離奇詭異,居然都是意外死亡凰兑,警方通過查閱死者的電腦和手機妥粟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吏够,“玉大人勾给,你說我怎么就攤上這事滩报。” “怎么了播急?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵脓钾,是天一觀的道長。 經(jīng)常有香客問我桩警,道長可训,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任捶枢,我火速辦了婚禮握截,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烂叔。我一直安慰自己谨胞,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布蒜鸡。 她就那樣靜靜地躺著胯努,像睡著了一般。 火紅的嫁衣襯著肌膚如雪术瓮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天贰健,我揣著相機與錄音胞四,去河邊找鬼。 笑死伶椿,一個胖子當(dāng)著我的面吹牛辜伟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播脊另,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼导狡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了偎痛?” 一聲冷哼從身側(cè)響起旱捧,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎踩麦,沒想到半個月后枚赡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡谓谦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年贫橙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片反粥。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡卢肃,死狀恐怖疲迂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情莫湘,我是刑警寧澤尤蒿,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站逊脯,受9級特大地震影響优质,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜军洼,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一巩螃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧匕争,春花似錦避乏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至跑杭,卻和暖如春铆帽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背德谅。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工爹橱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窄做。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓愧驱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親椭盏。 傳聞我的和親對象是個殘疾皇子组砚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容