gpt4 book ai didi

javascript - createStore with combineReducers 和 applyMiddleware 没有第二个参数

转载 作者:行者123 更新时间:2023-11-30 19:07:54 26 4
gpt4 key购买 nike

使用createStore时,需要1个参数和2个可选参数:

  1. reducer(函数):在给定当前状态树和要处理的操作的情况下,返回下一个状态树的缩减函数。

  2. preloadedState(任何):初始状态。您可以选择指定它以在通用应用程序中混合来自服务器的状态,或恢复以前序列化的用户 session 。如果您使用 combineReducers 生成了 reducer,这必须是一个普通对象,其形状与传递给它的键相同。否则,您可以自由传递您的 reducer 可以理解的任何内容。

  3. enhancer(功能):商店增强器。您可以选择指定它以使用中间件、时间旅行、持久性等第三方功能增强商店。Redux 附带的唯一商店增强器是 applyMiddleware()

如果我们将 combineReducersapplyMiddleware() 一起使用,则可以在使用 createStore() 时省略第二个参数,如下所示:

(在 official doc's example 中,显示了相同的使用模式)

const modules = combineReducers(reducer1, reducer2)

const store = createStore(modules, applyMiddleware(...middlewares))

这怎么可能? combineReducers 只返回一个函数。在上面的示例中,createStore 是否可以知道第二个(也是最后一个)参数是否是store enhancer,而不是初始状态

最佳答案

当你查看createStore的源代码时可以看到如下验证码:

export default function createStore<
S,
A extends Action,
Ext = {},
StateExt = never
>(
reducer: Reducer<S, A>,
preloadedState?: PreloadedState<S> | StoreEnhancer<Ext, StateExt>,
enhancer?: StoreEnhancer<Ext, StateExt>
): Store<ExtendState<S, StateExt>, A, StateExt, Ext> & Ext {
if (
(typeof preloadedState === 'function' && typeof enhancer === 'function') ||
(typeof enhancer === 'function' && typeof arguments[3] === 'function')
) {
throw new Error(
'It looks like you are passing several store enhancers to ' +
'createStore(). This is not supported. Instead, compose them ' +
'together to a single function.'
)
}

if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {
enhancer = preloadedState as StoreEnhancer<Ext, StateExt>
preloadedState = undefined
}

if (typeof enhancer !== 'undefined') {
if (typeof enhancer !== 'function') {
throw new Error('Expected the enhancer to be a function.')
}

return enhancer(createStore)(reducer, preloadedState as PreloadedState<
S
>) as Store<ExtendState<S, StateExt>, A, StateExt, Ext> & Ext
}

if (typeof reducer !== 'function') {
throw new Error('Expected the reducer to be a function.')
}

preloadedState state 应该是一个对象,enhancer 应该是一个函数,否则 createStore 会返回一个错误。

关于javascript - createStore with combineReducers 和 applyMiddleware 没有第二个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58790029/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com