redux - 当我使用 getServerSideProp 它使持久存储不起作用
问题描述
我开始使用 NextJs 并且当我在任何页面中使用 serverSideProps 函数时,这会阻止persist-redux 工作,redux 存储返回初始数据减速器,甚至 localStorage 用减速器中的初始数据替换其数据
这页纸:
const Home = (props) => {
const router = useRouter();
const user = useSelector((state) => selectUser(state));
const newLang = useSelector((state) => selectLang(state));
const lang = selectLang(props.initialReduxState);
const dispatch = useDispatch();
const stateR = useSelector((state) => state);
const setLang = (action) => {
dispatch(actions.setLang(action));
//refresh data serverSide Props data
router.replace(router.asPath);
};
return (
<>
<h1>{lang}</h1>
<button
onClick={() => {
setLang("ar");
}}
>
setArabic
</button>
<button onClick={() => setLang("en")}>setEnglish</button>
</>
);
};
export function getServerSideProps() {
const reduxStore = initializeStore();
return { props: { initialReduxState: reduxStore.getState() } };
}
这是商店配置:
import { useMemo } from "react";
import { createStore, applyMiddleware } from "redux";
import { composeWithDevTools } from "redux-devtools-extension";
import thunkMiddleware from "redux-thunk";
import reducers from "./reducers";
import createSagaMiddleware from "redux-saga";
import { watchSettings } from "./saga";
let store;
function initStore(initialState) {
const sagaMiddleware = createSagaMiddleware();
const middleWares = [sagaMiddleware, thunkMiddleware];
const Store_ = createStore(
reducers,
initialState,
composeWithDevTools(applyMiddleware(...middleWares))
);
Store_.sagaTask = sagaMiddleware.run(watchSettings);
return Store_;
}
export const initializeStore = (preloadedState) => {
let _store = store ?? initStore(preloadedState);
if (preloadedState && store) {
_store = initStore({
...store.getState(),
...preloadedState,
});
store = undefined;
}
if (typeof window === "undefined") return _store;
if (!store) store = _store;
return _store;
};
export function useStore(initialState) {
const store = useMemo(() => initializeStore(initialState), [initialState]);
return store;
}
这是减速器配置
import settings from "./settings";
import user from "./userReducer";
import { persistReducer, createMigrate } from "redux-persist";
import storage from "redux-persist/lib/storage";
import { migrations } from "./migrations";
import { combineReducers } from "redux";
const Reducers = combineReducers({
user,
settings,
});
const persistConfig = {
key: "root",
storage,
whitelist: ["settings"],
};
export default persistReducer(persistConfig, Reducers);
设置减速器:
import * as types from "../types";
const DEFAULT_STATE = {
lang: "en",
};
const Settings = (state = DEFAULT_STATE, action) => {
switch (action.type) {
case types.SET_ARABIC:
return {
...state,
lang: "ar",
};
case types.SET_ENGLISH:
return {
...state,
lang: "en",
};
default:
return state;
}
};
export default Settings;
这是选择器:
import { createSelector } from 'reselect';
const selectSettings = state => state.settings;
export const selectLang = createSelector(
selectSettings,
settings => settings.lang
);
顺便说一下,只有当我在页面中插入 getServerSideProps 而不插入它时才会出现这个问题,persist redux 工作正常
解决方案
推荐阅读
- python - 在函数内停止程序(python)
- ruby-on-rails - ruby on rails 心理测量应用程序
- c# - Rabbitmq RPC - amq.gen 太多
- git - 是否可以将多个本地文件夹连接到 Github 中的一个存储库?
- json - Angular6 Div 围绕来自同一用户的数组
- javascript - 单击其中的下拉菜单消失
- consul - spring cloud consul config app使用哪些端口与consul通信?
- regex - 正则表达式 - 提取字符串
- java - 如何更改继承类中的集合类型?
- tinymce - 从 tinymce 向页面添加内容