Day17. Redux深入

如何使用redux-thunk

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

redux-devtools

redux-devtools.png
  • redux开发过程中, 帮助我们跟踪状态变化, 每次变化记录在哪里?
  • 方便调试 => Chrome插件 redux-devtools, 官网中有提到
  • Github可以看使用, 代码里面也要做相关的配置
  • 安装完插件后, 在window


    Usage.png

    image.png
逻辑或.png

代码配置.png
初始化状态.png

generator

generator.png
  • ES6里面多增加的一个语法
  • 平时开发并不是常用
  • saga中间件使用了RS6的generator语法, 所以我们要简单了解一下:
    • 注意: 我们这里并没有列出generator的所有用法, 事实上它的用法非常的灵活, 可以自行去学习.
返回结果是一个对象.png
  • generator和Promise一起来使用, 写出来的代码看起来比较优雅.
  • Python里面写的多点, 主要为了理解Saga的使用过程

redux-saga的使用

saga.png

-redux-saga, 对代码进行分离, 代码写到另外一个地方

  • 安装 yarn add redux-saga
  • 导入的是一个函数
  • sageMiddleware.run()跑起来

补充两个小知识点

  • yield takeLatest() 一次只能监听一个对应的action
  • yield takeEvery(FETCH_HOME_MULTIDATA, fetchHomeMultidata) 每一个都会被执行
  • 当前只监听了一个action, 监听多个action


    image.png
  • sage优势, 代码分离, 解耦


    saga引入和使用.png
问题.png
    1. 跟state设计有关系
    1. 可以
    1. 官方提到过要不要把所有的数据放到Redux, 没有一个准确的答案, 跟本身你想要怎么设计它有关系


      image.png
  • Redux难的知识点, 边看视频边跟着写出来代码 -> 不看视频再把代码写一遍

redux中间件的实现原理及简单实现方式

  • 基本做法
  1. 第二种做法, 封装一个函数
function dispatchAndLogging() {
  console.log("dispatch前--dispatching action:", action);
  store.dispatch(action);
  console.log("dispatch后--new state:", store.getState());
}

dispatchAndLogging(addAction(10));
dispatchAndLogging(addAction(5));
  • 实现了, 但使不太好, 耦合度太高

=>

  1. 函数的基础之上进行优化: 修改原有的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技术: 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);
  • 开发中在做中间件的时候不一样
  1. 封装applyMiddleware
// 可变参数, 最后会放到数组中
function applyMiddleware(...middlewares) {
 // 不会做修改无所谓 
 //const newMiddleware = [...middlewares];
 middlewares.forEach(middleware => {
    store.dispatch = middleware(store);
  })
}

applyMiddlewares(patchLogging, patchTHunk);

Reducer代码拆分

  • 为什么起名叫Reducer?


    官方解释.png
  • 推荐MDN网站 地址
preValue, item) => {} 称之为reducer
["aaa", "bbb"].reduce((preValue, item) => {}, 0)
reducer.png
  • 对reducer做一个拆解, 两步拆解
  • 把要处理的逻辑放到一个独立的函数里面进行处理
// 拆分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 启动

文件结构重构

  • store文件夹中创建counter文件夹


    文件结构.png
  • 优化导入


    image.png
结构更清晰.png

coderwhy的React核心技术与开发实战课程链接

少年~来做同学呀~.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,306评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,657评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,928评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,688评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,105评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,024评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,159评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,937评论 0 212
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,689评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,851评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,325评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,651评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,364评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,192评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,985评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,154评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,955评论 2 279