Learn Redux

Redux

  • reducer: (preState: (init) , action) => newState
  • const { createStore } = Redux || import { createStore } from 'redux'
    const store = createStore({'reducer ()'})
  • render: { … store.getState()
  • store.subscribe(render)
    render()
  • store.dispatch({...})
const counter = (state = 0, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return state + 1
    case 'D........':
      return state - 1
    default:
      return state
  }
}

// pre writing
const { createStore } = Redux
const store = createStore(counter)

// now writing 
// [ Implementing store from scratch ]
const createStore = (reducer) => {
  let state
  let listeners = []
  
  const getState = () => state;
  
  const dispatch = (action) => {
    state = reducer(state, action)
    listeners.forEach(listener => listener())
  }
  
  const subscribe = (listener) => {
    listeners.push(listener)
    return () => {
      listeners = listeners.filter(l => l !== listener)
    }
  }
  
  dispatch({})
  
  return { getState, dispatch, subscribe }
}


const render = () => {
  document.body.innerText = store.getStatr()
}

store.subscribe(render)
render()

document.addEventListener('click', () => {
  store.dispatch({ type: 'IN....' })
})
  • Avoid Array Mutations with concat(), slice(), and ...spread

  • Avoid Object Mutations with Object.assign() and ...spread

  • define reducers

  • APP <= combine reducers

  • createStore(APP)

Redux 和 reduce 的聯(lián)系與區(qū)別

總結(jié)一下 Redux 和 reduce 的聯(lián)系與區(qū)別。

相同點:

  • reduce和Redux都是對數(shù)據(jù)流進行fold(折疊、歸約)瘫证;
  • 兩者都包含一個累積器(reducer)((a, b) -> a VS (state, action) -> state )和初始值(initialValue VS initialState ),兩者都接受一個抽象意義上的列表(list VS stream )豆励。

不同點:

  • reduce:接收一個有限長度的普通列表作為參數(shù),對列表中的元素從前往后依次累積,并輸出最終的累積結(jié)果。
  • Redux:由于基于時間的事件流是一個無限長的抽象列表傲宜,我們無法顯式地將事件流作為參數(shù)傳給Redux,也無法返回最終的累積結(jié)果(事件流無限長)夫啊。所以我們將事件流抽離出來函卒,通過 dispatch 主動地向 reducer 累積器 push action,通過 getState 觀察當(dāng)前的累積值(中間的累積過程)撇眯。
  • 從冷报嵌、熱信號的角度看,reduce 的輸入相當(dāng)于冷信號熊榛,累積器需要主動拉让(pull)輸入列表中的元素進行累積;而Redux的輸入(事件流)相當(dāng)于熱信號玄坦,需要外部主動調(diào)用 dispatch(action) 將當(dāng)前元素push給累積器血筑。

由上可知,Redux將所有的事件都抽象為 action煎楣,無論是用戶點擊豺总、Ajax請求還是頁面刷新,只要有新的事件發(fā)生择懂,我們就會 dispatch 一個 action給 reducer喻喳,并結(jié)合上一次的狀態(tài)計算出本次狀態(tài)。抽象出來的統(tǒng)一的事件接口休蟹,簡化了處理事件的復(fù)雜度沸枯。

Redux還規(guī)范了事件流——單向事件流日矫,事件 action 只能由 dispatch函數(shù)派發(fā),并且只能通過 reducer 更新系統(tǒng)(網(wǎng)頁)的狀態(tài) state绑榴,然后等待下一次事件哪轿。這種單向事件流機制能夠進一步簡化事件管理的復(fù)雜度,并且有較好的擴展性翔怎,可以在事件流動過程中插入 middleware窃诉,比如日志記錄、thunk赤套、異步處理等飘痛,進而大大增強事件處理的靈活性。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末容握,一起剝皮案震驚了整個濱河市宣脉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌剔氏,老刑警劉巖塑猖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谈跛,居然都是意外死亡羊苟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門感憾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜡励,“玉大人,你說我怎么就攤上這事阻桅×挂校” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵鳍刷,是天一觀的道長占遥。 經(jīng)常有香客問我,道長输瓜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任芬萍,我火速辦了婚禮尤揣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘柬祠。我一直安慰自己北戏,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布漫蛔。 她就那樣靜靜地躺著嗜愈,像睡著了一般旧蛾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蠕嫁,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天锨天,我揣著相機與錄音,去河邊找鬼剃毒。 笑死病袄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赘阀。 我是一名探鬼主播益缠,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼基公!你這毒婦竟也來了幅慌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤轰豆,失蹤者是張志新(化名)和其女友劉穎胰伍,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秒咨,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡喇辽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了雨席。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菩咨。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖陡厘,靈堂內(nèi)的尸體忽然破棺而出抽米,到底是詐尸還是另有隱情,我是刑警寧澤糙置,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布云茸,位于F島的核電站,受9級特大地震影響谤饭,放射性物質(zhì)發(fā)生泄漏标捺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一揉抵、第九天 我趴在偏房一處隱蔽的房頂上張望亡容。 院中可真熱鬧,春花似錦冤今、人聲如沸闺兢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屋谭。三九已至脚囊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桐磁,已是汗流浹背悔耘。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留所意,地道東北人淮逊。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像扶踊,于是被迫代替她去往敵國和親泄鹏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

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