【发布时间】:2021-08-29 03:09:53
【问题描述】:
我有两个减速器 - userSignup 和 userLogin。我必须在页面刷新之间持久化存储,所以我使用 redux 持久化。但是,我不想将整个 userSignup 和 userLogin 状态存储到 localStorage 中,我只想存储其中的一部分。
UserSignupReducer.js
import {
USER_SIGNUP_SUCCESS,
USER_SIGNUP_FAILED,
USER_OTP_VERIFICATION_FAILED,
USER_OTP_VERIFICATION_SUCCESS,
SET_LOADING_TRUE,
SET_LOADING_FALSE,
} from './UserSignupTypes';
const initialState = {
loading: false,
userData: {},
signupErrors: {},
signupSuccess: false,
OTPSuccess: false,
OTPErrors: '',
};
const reducer = (state = initialState, action) => {
switch (action.type) {
case SET_LOADING_TRUE:
return {
...state,
loading: true,
};
case SET_LOADING_FALSE:
return {
...state,
loading: false,
};
case USER_SIGNUP_SUCCESS:
return {
...state,
signupSuccess: true,
signupErrors: {},
userData: action.payload,
OTPErrors: '',
};
case USER_SIGNUP_FAILED:
return {
...state,
signupSuccess: false,
signupErrors: action.payload,
};
case USER_OTP_VERIFICATION_SUCCESS:
return {
...state,
OTPSuccess: true,
OTPErrors: '',
};
case USER_OTP_VERIFICATION_FAILED:
return {
...state,
OTPErrors: action.payload,
};
default:
return state;
}
};
export default reducer;
这里的状态有很多变量。但我不想将错误、加载、.. 持久化到 localStorage 中(因为即使用户在刷新页面后也看到错误,UX 也不会很好)。我只想将 userData 保存到 localStorage 中。然后我可以按照 redux persist 文档中的说明使用 state reconciler = automergeLevel1 来获取持久后的新状态。
同样在 userLoginReducer.js 中
import {
SET_LOADING_TRUE,
SET_LOADING_FALSE,
USER_LOGIN_SUCCESS,
USER_LOGIN_FAILED,
} from './UserLoginTypes';
const initialState = {
loading: false,
isloggedIn: false,
loginErrors: {},
username: '',
};
const reducer = (state = initialState, action) => {
switch (action.type) {
case SET_LOADING_TRUE:
return {
...state,
loading: true,
};
case SET_LOADING_FALSE:
return {
...state,
loading: false,
};
case USER_LOGIN_SUCCESS:
return {
...state,
isLoggedIn: true,
username: action.payload,
loginErrors: {},
};
case USER_LOGIN_FAILED:
return {
...state,
isLoggedIn: false,
loginErrors: action.payload,
};
default:
return state;
}
};
export default reducer;
我只想将 isLoggedIn 持久化到 localStorage 中。
rootReducer.js
import { combineReducers } from 'redux';
import userSignupReducer from './UserSignup/UserSignupReducer';
import userLoginReducer from './UserLogin/UserLoginReducer';
import { persistReducer } from 'redux-persist';
import storage from 'redux-persist/lib/storage';
const rootReducer = combineReducers({
userSignup: userSignupReducer,
userLogin: userLoginReducer,
});
const persistConfig = {
key: 'root',
storage,
whitelist: ['userSignup', 'userLogin'],
};
export default persistReducer(persistConfig, rootReducer);
store.js
import { createStore, applyMiddleware } from 'redux';
import logger from 'redux-logger';
import rootReducer from './rootReducer';
import { composeWithDevTools } from 'redux-devtools-extension';
import { persistStore } from 'redux-persist';
import thunk from 'redux-thunk';
export const store = createStore(
rootReducer,
composeWithDevTools(applyMiddleware(logger, thunk)),
);
export const persistor = persistStore(store);
请针对此问题提出任何补救措施。提前谢谢。
【问题讨论】:
标签: reactjs redux redux-persist