3

我尝试将redux-immutableredux-persist一起使用。

我搜索了很多,但我没有找到解决此问题的任何解决方案。

商店.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

笔记:

在 add 之前我没有任何错误redux-persist

如果您有任何想法,请帮助我。

4

2 回答 2

4

Redux-persist 期望减速器返回的状态,你传递给persistReducer它是一个普通的对象。

它将利用这一事实,通过向该对象注入一个额外的属性,该属性将用于托管 redux-persist 状态。.

这对你来说意味着,为了使用当前版本的 redux-persist,你必须摆脱 redux-immutable,而改用 redux own combineReducers

redux-persist-transform-immutable将允许您在状态树中存储 Lists、Maps、Records 等,但上述规则仍然适用:您的根状态,或者您传递给 persistReducer 的 reducer 的状态,必须是普通对象。

于 2018-05-14T18:54:34.160 回答
0

我刚刚使用的一个很好的解决方案...用'persist/REHYDRATE'抓住这个案例,然后useMutation

case 'persist/REHYDRATE':
  return state.withMutations((st) => {
    st.set('data', action.payload)
  })
于 2020-04-01T18:59:50.703 回答