applyMiddleware 沉思录
let newStore = applyMiddleware(mid1, mid2, mid3, ...)(createStore)(reducer, null);
给({ getState, dispatch }) => next => action签名的函数组分步赋值并进行串联的过程;
整体上是dispatch的method swizzling;
export default function applyMiddleware(...middlewares) {
return (next) =>
(reducer, initialState) => {
var store = next(reducer, initialState);
var dispatch = store.dispatch;
var chain = [];
//({ getState, dispatch })
var middlewareAPI = {
getState: store.getState,
dispatch: (action) => dispatch(action)
};
//({ getState, dispatch })
chain = middlewares.map(middleware => middleware(middlewareAPI));
//next
dispatch = compose(...chain, store.dispatch);
return {
...store,
dispatch
};
};
}
export default store => next => action => {
console.log('dispatch:', action);
next(action);
console.log('finish:', action);
}
export default ({ getState, dispatch }) => next => action => {
console.log('dispatch:', action);
next(action);
console.log('finish:', action);
}
function compose(...funs) {
return arg => funcs.reduceRight( (compose, f) => f(composed), arg)
}
https://www.cnblogs.com/fe-linjin/p/10494763.html
https://stackoverflow.com/questions/41139585/what-is-the-next-in-applymiddleware
...middlewares (arguments): 遵循 Redux middleware API 的函数。每个 middleware 接受 Store 的 dispatch 和 getState 函数作为命名参数,并返回一个函数。该函数会被传入 被称为 next 的下一个 middleware 的 dispatch 方法,并返回一个接收 action 的新函数,这个函数可以直接调用 next(action),或者在其他需要的时刻调用,甚至根本不去调用它。调用链中最后一个 middleware 会接受真实的 store 的 dispatch 方法作为 next 参数,并借此结束调用链。所以,middleware 的函数签名是 ({ getState, dispatch }) => next => action。
https://www.redux.org.cn/docs/api/applyMiddleware.html
最新文章
- 详解mmseg
- Java实现上传下载
- Python学习笔记3-字符串
- ios 消息通知
- 1004. Counting Leaves (30)
- iscsi 怎么搞
- R中的par()函数的参数
- object.assign()方法的使用
- c#部分---输入班级人数,输入语文数学英语成绩,打印语文前两名,数学后两名,英语平均分
- iOS开发——根据Url 获取图片尺寸
- 在oc代码中使用swift第三方框架
- CTE-递归[2]
- ulimit -n修改单进程可打开最大文件数目
- 使用Nginx+Lua(OpenResty)开发高性能Web应用
- Ubuntu新建用户
- Javascript随笔2(JQuery)
- 京东B2B业务架构演变
- 利用kibana插件对Elasticsearch进行映射
- firebug定位工具很强大
- MFC应用技术之CTreeControl的使用
热门文章
- 新博客 https://k8gege.org
- Java中的数据类型与运算符
- Akka-CQRS(11)- akka-http for http-web-service: Marshalling-数据序列化
- 移动端可视化框架antv f2出现两个legend选项
- 【题解】选数字 [51nod1354]
- golang 学习笔记 --基本类型
- RabbitMQ 的消息持久化与 Spring AMQP 的实现剖析
- 在excel实现多级联动
- wps金山文档在线编辑--.Net 接入指南
- python numPy模块 与numpy里的数据类型、数据类型对象dtype