Day17. Redux深入

如何使用redux-thunk

使用.png
  • 中間件的使用, redux-thunk

redux-devtools

redux-devtools.png
  • redux開發(fā)過程中, 幫助我們跟蹤狀態(tài)變化, 每次變化記錄在哪里?
  • 方便調(diào)試 => Chrome插件 redux-devtools, 官網(wǎng)中有提到
  • Github可以看使用, 代碼里面也要做相關(guān)的配置
  • 安裝完插件后, 在window


    Usage.png

    image.png
邏輯或.png

代碼配置.png
初始化狀態(tài).png

generator

generator.png
  • ES6里面多增加的一個語法
  • 平時開發(fā)并不是常用
  • saga中間件使用了RS6的generator語法, 所以我們要簡單了解一下:
    • 注意: 我們這里并沒有列出generator的所有用法, 事實上它的用法非常的靈活, 可以自行去學(xué)習(xí).
返回結(jié)果是一個對象.png
  • generator和Promise一起來使用, 寫出來的代碼看起來比較優(yōu)雅.
  • Python里面寫的多點, 主要為了理解Saga的使用過程

redux-saga的使用

saga.png

-redux-saga, 對代碼進行分離, 代碼寫到另外一個地方

  • 安裝 yarn add redux-saga
  • 導(dǎo)入的是一個函數(shù)
  • sageMiddleware.run()跑起來

補充兩個小知識點

  • yield takeLatest() 一次只能監(jiān)聽一個對應(yīng)的action
  • yield takeEvery(FETCH_HOME_MULTIDATA, fetchHomeMultidata) 每一個都會被執(zhí)行
  • 當前只監(jiān)聽了一個action, 監(jiān)聽多個action


    image.png
  • sage優(yōu)勢, 代碼分離, 解耦


    saga引入和使用.png
問題.png
    1. 跟state設(shè)計有關(guān)系
    1. 可以
    1. 官方提到過要不要把所有的數(shù)據(jù)放到Redux, 沒有一個準確的答案, 跟本身你想要怎么設(shè)計它有關(guān)系


      image.png
  • Redux難的知識點, 邊看視頻邊跟著寫出來代碼 -> 不看視頻再把代碼寫一遍

redux中間件的實現(xiàn)原理及簡單實現(xiàn)方式

  • 基本做法
  1. 第二種做法, 封裝一個函數(shù)
function dispatchAndLogging() {
  console.log("dispatch前--dispatching action:", action);
  store.dispatch(action);
  console.log("dispatch后--new state:", store.getState());
}

dispatchAndLogging(addAction(10));
dispatchAndLogging(addAction(5));
  • 實現(xiàn)了, 但使不太好, 耦合度太高

=>

  1. 函數(shù)的基礎(chǔ)之上進行優(yōu)化: 修改原有的dispatch
const next = store.dispatch;
function dispatchAndLogging() {
  console.log("dispatch前--dispatching action:", action);
  next(action);
  console.log("dispatch后--new state:", store.getState());
}
store.dispatch = dispatchAndLogging;

store.dispatch(addAction(10));
store.dispatch(addAction(5));
  • hack技術(shù): monkeyingPatch
  • 修改原有的代碼邏輯

=>

  1. 將之前的操作進行一個封裝
  • 封裝patchLoggin的代碼
function patchLogging(store) {
  const next = store.dispatch;
  function dispatchAndLogging() {
    console.log("dispatch前--dispatching action:", action);
    next(action);
    console.log("dispatch后--new state:", store.getState());
  }
  store.dispatch = dispatchAndLogging;
}

patchLogging(store);

store.dispatch(addAction(10));
store.dispatch(addAction(5));
  1. 希望中間可以做一些異步的操作, 封裝patchThunk的功能
// 封裝patchThunk的功能
function patchThunk(store) {
  const next = store.dispatch;

  function dispatchAndThunk(action) {
    if (typeof action === "function") {
      action(store.dispatch, store.getState);
    } else {
      next(action);
    }
  }

  store.dispatch = dispatchANdThunk;
}

patchLogging(store);
patchThunk(store);

function foo(dispatch, getState) {
  console.log(dispatch, getState);
  dispatch(subAction(10));
}

store.dispatch(foo);
  • 開發(fā)中在做中間件的時候不一樣
  1. 封裝applyMiddleware
// 可變參數(shù), 最后會放到數(shù)組中
function applyMiddleware(...middlewares) {
 // 不會做修改無所謂 
 //const newMiddleware = [...middlewares];
 middlewares.forEach(middleware => {
    store.dispatch = middleware(store);
  })
}

applyMiddlewares(patchLogging, patchTHunk);

Reducer代碼拆分

  • 為什么起名叫Reducer?


    官方解釋.png
  • 推薦MDN網(wǎng)站 地址
preValue, item) => {} 稱之為reducer
["aaa", "bbb"].reduce((preValue, item) => {}, 0)
reducer.png
  • 對reducer做一個拆解, 兩步拆解
  • 把要處理的邏輯放到一個獨立的函數(shù)里面進行處理
// 拆分counterReducer
const initialCounterState = {
  counter: 0
}
function counterReducer(state, action) {
  switch (action.type) {
    CASE add_number:
      return { ...state, counter: state.counter + action.num };
    CASE sub_number:
      return { ...state, counter: state.counter - action.num };

    default:
      return state;
  }
}

// 拆分homeReducer
const initialHomeState = {
  home:
}

const defaultState = {
  counterInfo: null,
 homeInfo: {}
}

function reducer(state = {}, action) {
  return {
    counterInfo: counterReducer(state.counterInfo, action),
    homeInfo: homeReducer(state.homeInfo, action),
  }
}
過程.png
  • 終端yarn insatll 安裝 yarn start 啟動

文件結(jié)構(gòu)重構(gòu)

  • store文件夾中創(chuàng)建counter文件夾


    文件結(jié)構(gòu).png
  • 優(yōu)化導(dǎo)入


    image.png
結(jié)構(gòu)更清晰.png

coderwhy的React核心技術(shù)與開發(fā)實戰(zhàn)課程鏈接

少年~來做同學(xué)呀~.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钉凌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奸忽,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揖庄,死亡現(xiàn)場離奇詭異,居然都是意外死亡欠雌,警方通過查閱死者的電腦和手機蹄梢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來富俄,“玉大人禁炒,你說我怎么就攤上這事』舯龋” “怎么了幕袱?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長悠瞬。 經(jīng)常有香客問我们豌,道長,這世上最難降的妖魔是什么浅妆? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任望迎,我火速辦了婚禮,結(jié)果婚禮上凌外,老公的妹妹穿的比我還像新娘辩尊。我一直安慰自己,他們只是感情好康辑,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布摄欲。 她就那樣靜靜地躺著轿亮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胸墙。 梳的紋絲不亂的頭發(fā)上我注,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機與錄音劳秋,去河邊找鬼仓手。 笑死,一個胖子當著我的面吹牛玻淑,可吹牛的內(nèi)容都是我干的嗽冒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼补履,長吁一口氣:“原來是場噩夢啊……” “哼添坊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起箫锤,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤贬蛙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谚攒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阳准,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年馏臭,在試婚紗的時候發(fā)現(xiàn)自己被綠了野蝇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡括儒,死狀恐怖绕沈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帮寻,我是刑警寧澤乍狐,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站固逗,受9級特大地震影響浅蚪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烫罩,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一掘鄙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嗡髓,春花似錦操漠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撞秋。三九已至,卻和暖如春嚣鄙,著一層夾襖步出監(jiān)牢的瞬間吻贿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工哑子, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留舅列,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓卧蜓,卻偏偏與公主長得像帐要,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子弥奸,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355