createStore с CombineReducers и applyMiddleware без второго аргумента - PullRequest
1 голос
/ 10 ноября 2019

при использовании createStore требуется 1 аргумент и 2 необязательных аргумента:

  1. reducer ( Function ): сокращающая функция, которая возвращаетследующее дерево состояний, учитывая текущее дерево состояний и действие для обработки.

  2. preloadedState ( any ): начальное состояние. При желании вы можете указать его для гидратации состояния с сервера в универсальных приложениях или для восстановления ранее сериализованного сеанса пользователя. Если вы сгенерировали reducer с combReducers, это должен быть простой объект такой же формы, что и ключи, переданные ему. В противном случае вы можете передавать все, что может понять ваш reducer.

  3. enhancer ( Функция ): усилитель магазина. При желании вы можете указать его, чтобы расширить магазин сторонними возможностями, такими как промежуточное ПО, путешествия во времени, постоянство и т. Д. Единственный усилитель магазина, который поставляется с Redux, это applyMiddleware().

Если мы используем combineReducers и applyMiddleware() вместе, то можно использовать второй аргумент при использовании createStore(), как показано ниже:

примере официального документа , тот же шаблон использованияпоказано)

const modules = combineReducers(reducer1, reducer2)

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

Как это возможно? combineReducers возвращает только function. В приведенном выше примере может createStore знать, является ли второй (и последний) параметр энхансером хранилища , а не начальным состоянием ?

1 Ответ

1 голос
/ 10 ноября 2019

Когда вы проверяете исходный код 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 возвращает ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...