使用createStore
时,需要1个参数和2个可选参数:reducer
(函数):一种归约函数,返回给定当前状态树和要处理的动作的下一个状态树。preloadedState
(任意):初始状态。您可以选择指定它,以在通用应用程序中混合服务器中的状态,或还原以前序列化的用户会话。如果使用combinedReducers生成了reducer
,则该对象必须是形状与传递给它的键相同的普通对象。否则,您可以自由传递reducer
可以理解的任何内容。enhancer
(功能):存储增强器。您可以选择指定它来增强第三方功能,例如中间件,时间旅行,持久性等。Redux附带的唯一商店增强器是applyMiddleware()
。
如果我们同时使用combineReducers
和applyMiddleware()
,则可以在使用createStore()
时省略第二个参数,如下所示:
(在official doc's example中,显示了相同的用法模式)
const modules = combineReducers(reducer1, reducer2)
const store = createStore(modules, applyMiddleware(...middlewares))
怎么可能?
combineReducers
仅返回function
。在上面的示例中,createStore
是否可以知道第二个(也是最后一个)参数是商店增强器,而不是初始状态? 最佳答案
当检查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
状态应该是一个对象,而enhancer
应该是一个函数,否则createStore
返回错误。