Redux-Persist 与 Redux-Toolkit的使用

284 阅读1分钟

Redux-Toolkit解决了Redux的配置使用过于繁琐,Redux-Persist则是解决持久化存储(刷新丢失数据的问题)

  1. 安装redux-persist
npm install redux-persist

2、 重构 index.js

//store/index.js
import { configureStore } from "@reduxjs/toolkit";
import menuToggleReducer from "./menuToggleSlice.js";
import userDataReducer from "./userDataSlice.js";
import { persistReducer, persistStore } from "redux-persist";
import { combineReducers } from "@reduxjs/toolkit";
import storage from "redux-persist/lib/storage";
const persistConfig = {
  key: "root",
  storage,
};
let rootReducers = combineReducers({
  menuToggle: menuToggleReducer,
  userData: userDataReducer,
});

const persistedReducer = persistReducer(persistConfig, rootReducers);
const store = configureStore({
  reducer: persistedReducer,
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware({
      serializableCheck: {
        ignoredActions: ["persist/PERSIST"],
      },
    }),
});
const persistor = persistStore(store);
export { store, persistor };

3、menuToggleSlice

// store/menuToggleSlice.js
import { createSlice } from "@reduxjs/toolkit";

// 定义初始state
const initialState = {
  menuStatus: false,
  menuBreadcrumbData: [],
};

export const menuToggleSlice = createSlice({
  name: "menuToggle",
  initialState,
  reducers: {
    changeMenuToggle: (state) => {
      state.menuStatus = !state.menuStatus;
    },
    changeMenuBreadcrumbData: (state, { payload }) => {
      state.menuBreadcrumbData = payload;
    },
  },
});

// 为每个 case reducer 函数生成 Action creators
export const { changeMenuToggle, changeMenuBreadcrumbData } =
  menuToggleSlice.actions;

export default menuToggleSlice.reducer;

4、userDataSlice

// store/userDataSlice.js
import { createSlice } from "@reduxjs/toolkit";

// 定义初始state
const initialState = {
  userInfo: {},
};

export const userDataSlice = createSlice({
  name: "userData",
  initialState,
  reducers: {
    editUserData: (state, { payload }) => {
      state.userInfo = { ...state.userInfo, ...payload };
    },
  },
});

// 为每个 case reducer 函数生成 Action creators
export const { editUserData } = userDataSlice.actions;

export default userDataSlice.reducer;

如果报错什么,注意就是

let rootReducers = combineReducers({
  menuToggle: menuToggleReducer,
  userData: userDataReducer,
});

记住先使用combineReducers进行包裹后才行


import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App.jsx";
// stroe
import { store, persistor } from "./store/index.js";
import { Provider } from "react-redux";
import { PersistGate } from "redux-persist/integration/react";
// 全局样式
import "./style/base.scss";
import "./style/App.scss";

ReactDOM.createRoot(document.getElementById("root")).render(
  <Provider store={store}>
    <PersistGate loading={null} persistor={persistor}>
      <App />
    </PersistGate>
  </Provider>
);