Redux: предыдущее состояние, полученное редуктором, имеет неожиданный тип "Функция",
Когда я добавляю промежуточное программное обеспечение для расширения chrome, редукторы перестают нормально работать на сайте (но работает инструмент отладки chrome/redux) + Я получаю следующую ошибку в консоли:
Предыдущее состояние, получаемое редуктором, имеет неожиданный тип "Функция". Ожидаемый аргумент - объект со следующими ключами: "auth", "common", "home"
Вот код:
import { applyMiddleware, createStore } from 'redux';
import { promiseMiddleware, localStorageMiddleware } from './middleware';
import reducer from './reducer';
const middleware = applyMiddleware(promiseMiddleware, localStorageMiddleware);
const store = createStore(reducer, middleware,
window.devToolsExtension ? window.devToolsExtension() : f => f);
export default store;
Если я удаляю хромную часть:
,window.devToolsExtension ? window.devToolsExtension() : f => f
Если снова работает нормально.
Ответы
Ответ 1
createStore
принимает до 3 аргументов. Если второй аргумент - это функция, он предполагает, что ваш второй аргумент является усилителем хранилища. Если это объект или есть 3 аргумента, он предполагает, что аргумент является вашим начальным состоянием. См. здесь.
Ваша промежуточная переменная является усилителем хранилища, а расширение хром также является энхансером:
window.devToolsExtension ? window.devToolsExtension() : f => f
Вы должны составить оба в одной функции:
import { applyMiddleware, createStore, compose } from 'redux';
import { promiseMiddleware, localStorageMiddleware } from './middleware';
import reducer from './reducer';
const middleware = applyMiddleware(promiseMiddleware, localStorageMiddleware);
const store = createStore(
reducer,
compose(middleware, window.devToolsExtension ? window.devToolsExtension() : f => f)
);
export default store;
Документация для этого можно найти здесь.
Ответ 2
createStore
принимает следующие аргументы:
- Редуктор
- предварительно загруженное состояние
- энхансер
Если заданы только два аргумента, а второй аргумент - функция, то он считается энхансером. Подробнее см. В исходном коде.
Если вы хотите использовать Redux devtools, вы должны compose
использовать его как дополнительный усилитель.
import { applyMiddleware, createStore, compose } from 'redux';
const store = createStore(
reducer,
compose(
middleware,
window.devToolsExtension ? window.devToolsExtension() : f => f
)
)
Надеюсь, что это поможет. Поздрав 😉