const store = createStore(
rootReducer,
initialState,
compose(
applyMiddleware(thunk, api, wsMiddleware, createLogger()),
typeof window === 'object' && typeof window.devToolsExtension !==
'undefined'
? window.devToolsExtension()
: DevTools.instrument(),
),
);
以上是您通常如何创建商店,然后您的中间件就像这样开始:
export default store => next => (action) => {
我确实从redux.org读了中间件部分,但是有人能够更好地向我解释那里发生了什么?
中间件正在接收商店吗?并从商店调出下一个函数,最后使用作为操作给出的参数(在本例中)。 ?
答案 0 :(得分:1)
Redux中间件管道可以像这样细分......
store => {...}
商店API是给予管道的第一个参数。这允许中间件在管道中的任何点获取当前状态和/或将新操作分派到商店中。
注意:它具有许多与createStore
函数返回的商店相同的特性,但它们并不相同。只有dispatch
和getState
功能可用。
next => {...}
next
参数是对链中下一个中间件的引用。如果没有更多的中间件可以去,商店会处理动作(即将其传递给减速器)。
如果未调用next
,则操作将不会进入reducer。这可以用于抑制对其自身没有有效操作的内容,例如函数或promise,因为如果Redux尝试处理它,则会引发错误。
action => {...}
action
参数是分配到商店的东西。
在这里,您将测试action
以查看是否存在您想要使用的特殊内容以及是否将其传递到next
处理程序。
对于此示例,我们将创建一个简化的thunk
middleware,解释它如何使用管道的每个部分。
export default store => next => action => {
// if the action is a function, treat it as a thunk
if (typeof action === 'function') {
// give the store's dispatch and getState function to the thunk
// we want any actions dispatched by the thunk to go through the
// whole pipeline, so we use the store API dispatch instead of next
return action(store.dispatch, store.getState)
} else {
// we're not handling it, so let the next handler have a go
return next(action)
}
}
答案 1 :(得分:0)
符合Redux中间件API的函数。每个中间件都接收Store的dispatch和getState函数作为命名参数,并返回一个函数。该函数将被赋予下一个中间件的调度方法,并且期望返回具有可能不同的参数的调用next(action)的动作的函数,或者在不同的时间,或者可能根本不调用它。链中的最后一个中间件将接收真实存储的调度方法作为下一个参数,从而结束链。因此,中间件签名是({getState,dispatch})=> next =>动作。
在applymiddleware文档中找到了答案。 https://redux.js.org/docs/api/applyMiddleware.html