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


reducer(函数):一种归约函数,返回给定当前状态树和要处理的动作的下一个状态树。
preloadedState(任意):初始状态。您可以选择指定它,以在通用应用程序中混合服务器中的状态,或还原以前序列化的用户会话。如果使用combinedReducers生成了reducer,则该对象必须是形状与传递给它的键相同的普通对象。否则,您可以自由传递reducer可以理解的任何内容。
enhancer(功能):存储增强器。您可以选择指定它来增强第三方功能,例如中间件,时间旅行,持久性等。Redux附带的唯一商店增强器是applyMiddleware()


如果我们同时使用combineReducersapplyMiddleware(),则可以在使用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返回错误。

10-04 22:43