美文网首页
2-Redux中间件

2-Redux中间件

作者: 我竟无言以对_1202 | 来源:发表于2021-02-25 21:47 被阅读0次

Redux 中间件

[toc]

Redux 中间件的作用

Reudx 中的中间件是通过对 dispatch 进行的二次封装,对 action 发起之后,reducer 调用之前的行为进行扩展,我们可以通过中间件来进行:日志记录发送报告调用异步接口 ……

从日志记录需求开始

需求:再每次 dispatch 的时候打印修改之前和之后的 state

准备

let initState = {
  users: []
}

function reducers(state=initState, {type, payload}) {
  switch(type) {
    case 'user/add':
      return Object.assign(state, {
        users: [...state.users, payload]
      });
  }

  return state;
}

let store = Redux.createStore(
  reducers
);

最直接最原始的做法

console.log(store.getState());
store.dispatch({
  type: 'user/add',
  payload: 'zmouse'
});
console.log(store.getState());

封装 logger

function logger(store, action) {
  console.log(store.getState());
  store.dispatch(action)
  console.log(store.getState());
}

logger(store, {
  type: 'user/add',
  payload: 'zmouse'
});

封装 dispatch

let next = store.dispatch;
store.dispatch = function logger(action) {
  console.log(store.getState());
  next(action);
  console.log(store.getState());
}

store.dispatch({
  type: 'user/add',
  payload: 'zmouse'
});

添加错误报告发送

需求:每次 dispatch 把提交的数据进行持久化

let next = store.dispatch;
store.dispatch = function storage(action) {
  next(action);
  let s = localStorage
}

store.dispatch({
  type: 'user/add',
  payload: 'zmouse'
});

封装合并多个中间件

  • 把每个独立的中间件封装成独立的函数
  • 每个中间件都需要获取一次 dispatch
function logger(store) {
  let next = store.dispatch;
  return function loggerDispatch(action) {
    console.log('before: ', store.getState());
    next(action);
    console.log('after: ', store.getState());
  }
}

function storage(store) {
  let next = store.dispatch;
  return function storageDispatch(action) {
    next(action);
    localStorage.setItem('store', JSON.stringify(store.getState()));
    console.log('持久存储完成');
  }
}

store.dispatch = logger(store);
store.dispatch = storage(store);

store.dispatch({
  type: 'user/add',
  payload: 'zmouse'
});

方法一个方法统一处理中间件函数的注册

封装一个 applyMiddleware 方法

function applyMiddleware(store, middlewares) {
  middlewares.reverse()
  middlewares.forEach(middleware => {
    store.dispatch = middleware(store)
  })
}

applyMiddleware(store, [logger, storage])

抽取 next

function applyMiddleware(store, middlewares) {
  middlewares.reverse()
  let dispatch = store.dispatch
  middlewares.forEach(middleware => {
    dispatch = middleware(store)(dispatch)
  })
  store.dispatch = dispatch;
}

function logger(store) {
  return function(next) {
    return function loggerDispatch(action) {
      console.log('before: ', store.getState());
      next(action);
      console.log('after: ', store.getState());
    }
  }
}

function storage(store) {
  return function(next) {
    return function storageDispatch(action) {
      next(action);
      localStorage.setItem('store', JSON.stringify(store.getState()));
      console.log('持久存储');
    }
  }
}

ES6 改写

let logger = store => next => action => {
  console.log('before: ', store.getState());
  next(action);
  console.log('after: ', store.getState());
}
let storage = store => next => action => {
  next(action);
  localStorage.setItem('store', JSON.stringify(store.getState()));
  console.log('持久存储');
}

使用 Redux.applyMiddleware 方法

Redux 内置了一个 applyMiddleware 方法用来注册中间件

let store = Redux.createStore(
  reducers,
  Redux.applyMiddleware(logger, storage)
);

异步的问题

仔细观察我们发现,默认的 dispatch 是没有对异步的任务进行处理的,且该方法默认情况下接收的是一个 action 对象

redux-thunk 的原理

通过中间件重新封装 dispatch 方法,使它能够接收一个异步任务函数

let thunk = store => next => action => {
  console.log('thunk');
  new Promise( (resolve, reject) => {
    action(next);
  } )
}

store.dispatch( dispatch => {
  setTimeout(() => {
    dispatch({
      type: 'user/add',
      payload: 'zmouse'
    });
  }, 1000);
} )

相关文章

  • 2-Redux中间件

    Redux 中间件 [toc] Redux 中间件的作用 Reudx 中的中间件是通过对 dispatch 进行的...

  • RN学习笔记2-Redux

    一、背景 React或者说ReactNative原生使用state和props管理UI状态,但是俩属性非常琐碎,稍...

  • 翻译

    Laravel 的路由中间件 简介 创建中间件 注册中间件全局中间件为路由指定中间件中间件组 中间件参数 Term...

  • 中间件学习——具体分类

    中间件分为远程过程调用中间件、数据访问中间件、消息中间件、事务(交易)处理中间件、分布式对象中间件。 远程过程调用...

  • nodejs19-express中间件

    中间件 匹配路由之前和之后做的操作 应用级中间件 路由级中间件 错误处理中间件 内置中间件 第三方中间件 应用级中...

  • 4.3KOA 中间件模块化与中间件合成

    中间件模块化与中间件合成 一、中间件模块化 定义中间件模块 使用中间件模块 二、使用 koa-compose 模块...

  • 4.2KOA 中间件执行流程

    中间件执行流程 代码执行流程 中间件 1 开始执行中间件 2 开始执行执行内容中间件 2 结束执行中间件 1 结束...

  • 13.中间件和上下文处理器

    中间件 中间件的引入image.png django中的中间件django 中的中间件(middleware),在...

  • Express学习

    使用中间件 Express 应用可使用如下几种中间件:* 应用级中间件* 路由级中间件* 错误处理中间...

  • Express 中间件

    中间件的概念 什么是中间件 中间件(Middleware),特指业务流程的中间处理环节。 Express 中间件的...

网友评论

      本文标题:2-Redux中间件

      本文链接:https://www.haomeiwen.com/subject/dycpfltx.html