店铺:

import { configureStore } from "@reduxjs/toolkit";

//SLICES
import mainLayoutReducer from "./mainLayoutSlice";
import userDataReducer from "./userDataSlice";
import schedulePeriodReducer from "./schedulePeriodSlice";
import loadingReducer from "./loadingSlice";
import draftDataSlice from "./draftDataSlice";

// API
import { tmsApi } from "../api";
import { daDataApi } from "../api/thirdPartyApis/daDataApi";

import {
  persistReducer,
  FLUSH,
  REHYDRATE,
  PAUSE,
  PERSIST,
  PURGE,
  REGISTER,
} from "redux-persist";

import storage from "redux-persist/lib/storage";

const persistConfig = {
  key: "root",
  storage,
};

const persistedMainLayoutReducer = persistReducer(
  persistConfig,
  mainLayoutReducer
);

const persistedDraftReducer = persistReducer(
  persistConfig,
  draftDataSlice
);

const persistedLoadingReducer = persistReducer(persistConfig, loadingReducer);

const store = configureStore({
  reducer: {
    // PERSISTED SLICES
    mainLayout: persistedMainLayoutReducer,
    loading: persistedLoadingReducer,
    draftData: persistedDraftReducer,
    // schedulePeriod: persistedSchedulePeriodReducer,

    // SLICES
    userData: userDataReducer,
    schedulePeriod: schedulePeriodReducer,

    // API
    [tmsApi.reducerPath]: tmsApi.reducer,
    [daDataApi.reducerPath]: daDataApi.reducer,
  },
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware({
      serializableCheck: {
        ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER],
      },
    })
      .concat(tmsApi.middleware)
      .concat(daDataApi.middleware),
});

export default store;

切片:

import { createSlice } from "@reduxjs/toolkit";

const initialState = {
  draftData: null,
};

export const draftDataSlice = createSlice({
  name: "draftData",
  initialState,
  reducers: {
    setDraftData: (state, action) => {
      state.draftData = action.payload;
    },
    clearDraftData: (state) => {
      state.draftData = null;
    },
  },
});

export const { setDraftData, clearDraftData } = draftDataSlice.actions;

export default draftDataSlice.reducer;

组件:

const isDraft = location.search;

const draftData = useSelector((state) => state.draftData.draftData);

const formik = useFormik({
  initialValues: isDraft
    ? draftData
    : {
      ...mainInfoValues(employeeInfo),
      ...vehicleInfoValues(employeeInfo),
      ...docsValues(employeeInfo),
    },
  onSubmit: // here onSubmit func
)}

useEffect(() => {
  dispatch(setDraftData(values));
}, [values]);

return(
  <form onSubmit={handleSubmit}>
    <Section overflow="inherit">
      {(() => {
        switch (step) {
          case 1:
            return (
              <MainInfo
                values={values}
                handleChange={handleChange}
                setFieldValue={setFieldValue}
                setValues={setValues}
                touched={touched}
                errors={errors}
                handleBlur={handleBlur}
                isStepOneEmpty={isStepOneEmpty}
                resetForm={resetForm}
                handleStep={handleStep}
              />
            );

          case 2:
            return (
              <VehicleInfo
                values={values}
                handleChange={handleChange}
                setFieldValue={setFieldValue}
                setValues={setValues}
                touched={touched}
                errors={errors}
                handleBlur={handleBlur}
                isStepTwoEmpty={isStepTwoEmpty}
                resetForm={resetForm}
                handleStep={handleStep}
              />
            );

          case 3:
            return (
              <AttachDocs
                values={values}
                handleChange={handleChange}
                setFieldValue={setFieldValue}
                setValues={setValues}
                touched={touched}
                errors={errors}
                handleBlur={handleBlur}
                isStepThreeEmpty={isStepThreeEmpty}
                resetForm={resetForm}
                handleStep={handleStep}
              />
            );

          default:
            break;
        }
      })()}
    </Section>
  </form>
)

我试图保存值从formik到持久切片,一切正常,直到重定向到另一个页面并刷新它.当我回来时,我的切片是空的,但如果用form刷新当前页面,一切正常,切片不是空的.

步骤:

  1. 在形式上对值进行一些更改
  2. 切片已满
  3. 重定向到另一页
  4. 刷新页
  5. 返回页面
  6. 切片为空

推荐答案

Issue

我认为问题在于您的持久化归约器都使用相同的持久性key属性,因此它们最终会互相冲突.

const persistConfig = {
  key: "root", // <-- key => "persist:root"
  storage,
};

const persistedMainLayoutReducer = persistReducer(
  persistConfig, // <-- key <= "persist:root"
  mainLayoutReducer
);

const persistedDraftReducer = persistReducer(
  persistConfig, // <-- key <= "persist:root"
  draftDataSlice
);

const persistedLoadingReducer = persistReducer(
  persistConfig, // <-- key <= "persist:root"
  loadingReducer
);

Solution Suggestions

for each 切片缩减器使用单独的持久性键

const rootPersistConfig = {
  key: "root", // <-- key => "persist:root"
  storage,
};

const persistedMainLayoutReducer = persistReducer(
  rootPersistConfig, // <-- key <= "persist:root"
  mainLayoutReducer
);

const draftPersistConfig = {
  key: "draft", // <-- key => "persist:draft"
  storage,
};

const persistedDraftReducer = persistReducer(
  draftPersistConfig, // <-- key <= "persist:draft"
  draftDataReducer
);

const loadingPersistConfig = {
  key: "loading", // <-- key => "persist:loading"
  storage,
};

const persistedLoadingReducer = persistReducer(
  loadingPersistConfig, // <-- key <= "persist:loading"
  loadingReducer
);

const store = configureStore({
  reducer: {
    // PERSISTED SLICES
    mainLayout: persistedMainLayoutReducer,
    loading: persistedLoadingReducer,
    draftData: persistedDraftReducer,
    // schedulePeriod: persistedSchedulePeriodReducer,

    // SLICES
    userData: userDataReducer,
    schedulePeriod: schedulePeriodReducer,

    // API
    [tmsApi.reducerPath]: tmsApi.reducer,
    [daDataApi.reducerPath]: daDataApi.reducer,
  },
  ...
});

使用单一持久化配置,并将您想要持久化的reducers列入白名单/黑名单.

const rootReducer = combineReducers({
  // PERSISTED SLICES
  mainLayout: mainLayoutReducer,
  loading: loadingReducer,
  draftData: draftDataReducer,
  // schedulePeriod: schedulePeriodReducer,

  // SLICES
  userData: userDataReducer,
  schedulePeriod: schedulePeriodReducer,

  // API
  [tmsApi.reducerPath]: tmsApi.reducer,
  [daDataApi.reducerPath]: daDataApi.reducer,
});

const persistConfig = {
  key: "root",
  storage,
  // Only persist these root reducers
  whitelist: ["mainLayout", "loading", "draftData"],
};

const persistedRootReducer = persistReducer(
  persistConfig,
  rootReducer
);

const store = configureStore({
  reducer: persistedRootReducer,
  ...
});

Javascript相关问答推荐

如何修复循环HTML元素附加函数中的问题?

Cookie中未保存会话数据

如何在Angular中插入动态组件

如何在mongoose中链接两个模型?

如何用拉威尔惯性Vue依赖下拉?

数字时钟在JavaScript中不动态更新

用于编辑CSS样式的Java脚本

PDF工具包阿拉伯字体的反转数字

类构造函数不能在没有用With Router包装的情况下调用

如何将数组用作复合函数参数?

自定义确认组件未在vue.js的v菜单内打开

有效路径同时显示有效路径组件和不存在的路径组件

如何在Press上重新启动EXPO-AV视频?

在D3条形图中对具有相同X值的多条记录进行分组

未捕获语法错误:Hello World中的令牌无效或意外

将相关数据组合到两个不同的数组中

将Auth0用户对象存储在nextjs类型脚本的Reaction上下文中

当S点击按钮时,我如何才能改变它的样式?

在执行console.log(new X())时记录一个字符串

如何从Reaction-Redux中来自API调用的数据中筛选值