将 redux-persist 与 redux-immutable 一起使用时出错
Error when using redux-persist with redux-immutable
我尝试使用redux-immutable with 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
之前没有任何错误。
有什么想法请帮帮我
Redux-persist 期望您传递给 persistReducer
的 reducer 返回的状态是一个普通对象。
这对您意味着,为了使用当前版本的 redux-persist,您必须摆脱 redux-immutable,并改用 redux 自己的 combineReducers
。
redux-persist-transform-immutable 将允许你在你的状态树中存储 Lists、Maps、Records 等,但是上面的规则仍然适用:你的根状态,或者你传递给 persistReducer 的 reducer 的状态,必须是普通对象。
我刚刚使用的一个很好的解决方案...用 'persist/REHYDRATE' 捕捉案例,然后使用 Mutation
case 'persist/REHYDRATE':
return state.withMutations((st) => {
st.set('data', action.payload)
})
我尝试使用redux-immutable with 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
之前没有任何错误。
有什么想法请帮帮我
Redux-persist 期望您传递给 persistReducer
的 reducer 返回的状态是一个普通对象。
这对您意味着,为了使用当前版本的 redux-persist,您必须摆脱 redux-immutable,并改用 redux 自己的 combineReducers
。
redux-persist-transform-immutable 将允许你在你的状态树中存储 Lists、Maps、Records 等,但是上面的规则仍然适用:你的根状态,或者你传递给 persistReducer 的 reducer 的状态,必须是普通对象。
我刚刚使用的一个很好的解决方案...用 'persist/REHYDRATE' 捕捉案例,然后使用 Mutation
case 'persist/REHYDRATE':
return state.withMutations((st) => {
st.set('data', action.payload)
})