Ошибка при использовании redux-persist с redux-immutable

Я пытаюсь использовать redux-immutable с redux-persist.

Я много искал, но не нашел решений для решения этой проблемы.

store.js:

import { createStore, applyMiddleware } from 'redux';
import { composeWithDevTools } from 'remote-redux-devtools';
import logger from 'redux-logger';
import { createEpicMiddleware } from 'redux-observable';
import immutableTransform from 'redux-persist-transform-immutable';
import { persistStore, persistReducer } from 'redux-persist';
import { combineReducers } from 'redux-immutable';
import { Map } from 'immutable';
import { routerReducer } from 'react-router-redux';
import storage from 'redux-persist/lib/storage';
import createFilter from 'redux-persist-transform-filter';
import epics from './epics';
import reducers from './reducers';

const middlewares = [createEpicMiddleware(epics), logger];
const composeEnhancers = composeWithDevTools({ realtime: true, port: 8000 });

const saveSubsetFilter = createFilter(
  'Login',
  ['userData'],
);

const persistConfig = {
  key: 'reduxStore',
  storage,
  transforms: [saveSubsetFilter, immutableTransform()],
};

const initialState = Map();

const persistedReducer = persistReducer(persistConfig, combineReducers({
  ...reducers,
  routing: routerReducer,
}));

export const store = createStore(
  persistedReducer,
  initialState,
  composeEnhancers(applyMiddleware(...middlewares)),
);

export const persistor = persistStore(store);

Мои ошибки в консоли:

The previous state received by the reducer is of unexpected type. Expected argument to be an instance of Immutable.Collection or Immutable.Record with the following properties: "Login", "Campaigns", "Websites", "routing".

Uncaught TypeError: inputState.withMutations is not a function

Примечание.

У меня не было ошибок до добавления redux-persist.

Пожалуйста, помогите мне, если у вас есть идеи.


person Soroush Chehresa    schedule 12.05.2018    source источник


Ответы (2)


Redux-persist ожидает, что состояние, возвращаемое редюсером, которое вы передаете persistReducer, будет простым объектом.

Он воспользуется этим фактом, внедрив дополнительный свойство в этот объект, который будет использоваться для размещения состояния redux-persist..

Для вас это означает, что для использования текущей версии redux-persist вы должны избавиться от redux-immutable и вместо этого использовать redux own combineReducers.

redux-persist-transform-immutable позволит вам хранить списки, карты, Записи и т. д. в вашем дереве состояний, но приведенное выше правило все еще применяется: ваше корневое состояние или состояние редуктора, которое вы передаете в persistReducer, должно быть простым объектом.

person mpontus    schedule 14.05.2018
comment
Убедитесь, что редуктор, который вы оборачиваете persistReducer, возвращает простой объект javascript. Если это уже так, то, пожалуйста, поделитесь своим кодом. - person mpontus; 12.06.2018

Хорошее решение, которое я только что использовал... Поймайте случай с 'persist/REHYDRATE', а затем используйте мутацию.

case 'persist/REHYDRATE':
  return state.withMutations((st) => {
    st.set('data', action.payload)
  })
person user2208124    schedule 01.04.2020