我的持久化状态工作正常,但在从函数访问Store并使用预加载的状态参数进行一些测试后,它不能持久化.它在第一次呈现时会恢复消重状态,但没有任何内容被访问或持久保存到浏览器.我认为当状态更新时,没有什么会导致store 重现,但如何解决呢?

store

export default function setupStore (preloadedState?: PreloadedState<RootState>) {
  const store  = configureStore({
    reducer: persistedReducer,
    preloadedState,
    devTools: process.env.NODE_ENV !== 'production',
    middleware: getDefaultMiddleware => 
      getDefaultMiddleware({
        serializableCheck:  {
          ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER],
        }
      }).concat(logger),
  })
  return store 
}

export const persistor = persistStore(setupStore())

//根削减器

export const rootPersistConfig = {
  key: 'root',
  storage: storage,
  whitelist: ['dealerStoreReducer'],//soon later,
  stateReconciler: autoMergeLevel2 ,
  // version: 1,
}
  
export const dealerStorePersistConfig = {
  key: 'dealerStore',
  storage: storage,
  whitelist: ['cartItems','adminStore'],
  // version: 1,
  //blacklist: ['dealerStoreReducer'],//soon later,
  stateReconciler: autoMergeLevel2 ,
}

export type DealerStoreReducer = initialStatedealerStore & PersistPartial;

const rootReducer = combineReducers({
  labels: labelsReducer,
  dealers: dealersReducer,
  user: usersReducer,
  orders: ordersReducer,
  orderItems: orderItemsReducer,
  dealerStore: persistReducer<initialStatedealerStore, any>(dealerStorePersistConfig, dealerStoreReducer),
})

export type RootReducer = ReturnType<typeof rootReducer>;
export const persistedReducer = persistReducer<RootReducer >(rootPersistConfig, rootReducer) 

export default rootReducer

指标

root.render(
  <Provider store ={setupStore()}>
    <BarsContextProvider>
      <PersistGate loading={null} persistor={persistor}>
        <BrowserRouter>
          <App />
        </BrowserRouter>
      </PersistGate>
    </BarsContextProvider>,
  </Provider>,
);

推荐答案

不清楚您到底在对specific个Store实例做什么,但根据您所展示的代码,您已经实例化了103个两个不同的Store对象.一个是在创建persistor时,另一个是在将存储传递给react-redux Provider组件时.

Store.js

export default function setupStore (preloadedState?: PreloadedState<RootState>) {
  const store = configureStore({
    reducer: persistedReducer,
    preloadedState,
    devTools: process.env.NODE_ENV !== 'production',
    middleware: getDefaultMiddleware => 
      getDefaultMiddleware({
        serializableCheck:  {
          ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER]
        }
      }).concat(logger),
  });
  return store;
}

export const persistor = persistStore(setupStore()); // <-- store instance #1

Index.js

root.render(
  <Provider store={setupStore()}> // <-- store instance #2
    <BarsContextProvider>
      <PersistGate loading={null} persistor={persistor}>
        <BrowserRouter>
          <App />
        </BrowserRouter>
      </PersistGate>
    </BarsContextProvider>,
  </Provider>,
);

要解决这个问题,您只需要实例化一个应用程序中使用的store 实例.

您可以导出setupStore函数以用于测试/ETC,然后还可以导出实例化的storepersistor:

Store.js

export default function setupStore (preloadedState?: PreloadedState<RootState>) {
  const store = configureStore({
    reducer: persistedReducer,
    preloadedState,
    devTools: process.env.NODE_ENV !== 'production',
    middleware: getDefaultMiddleware => 
      getDefaultMiddleware({
        serializableCheck:  {
          ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER]
        }
      }).concat(logger),
  });
  return store;
}

export const store = setupStore(); // <-- store instance

export const persistor = persistStore(store); // <-- store instance passed in

Index.js

root.render(
  <Provider store={store}> // <-- same store instance
    <BarsContextProvider>
      <PersistGate loading={null} persistor={persistor}> // <-- also used here
        <BrowserRouter>
          <App />
        </BrowserRouter>
      </PersistGate>
    </BarsContextProvider>,
  </Provider>,
);

Or you can just export the setupStore utility and instantiate the store and persistor in the Index.js file.

Store.js

export default function setupStore (preloadedState?: PreloadedState<RootState>) {
  const store = configureStore({
    reducer: persistedReducer,
    preloadedState,
    devTools: process.env.NODE_ENV !== 'production',
    middleware: getDefaultMiddleware => 
      getDefaultMiddleware({
        serializableCheck:  {
          ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER]
        }
      }).concat(logger),
  });
  return store;
}

Index.js

const store = setupStore(); // <-- instantiate store
const persistor = persistStore(store); // <-- pass store instance

root.render(
  <Provider store={store}> // <-- same store instance
    <BarsContextProvider>
      <PersistGate loading={null} persistor={persistor}> // <-- also used here
        <BrowserRouter>
          <App />
        </BrowserRouter>
      </PersistGate>
    </BarsContextProvider>,
  </Provider>,
);

Javascript相关问答推荐

为什么在获取回调内设置状态(不会)会导致无限循环?

如何通过onClick为一组按钮分配功能;

是否有方法在OpenWeatherMap API中获取过go 的降水数据?

使用JavaScript在ionic Web应用程序中更新.pane和.view的背景 colored颜色

使用TMS Web Core中的HTML模板中的参数调用过程

GrapeJS -如何保存和加载自定义页面

useNavigation更改URL,但不呈现或显示组件

我可以从React中的出口从主布局调用一个处理程序函数吗?

嵌套异步JavaScript(微任务和macrotask队列)

仅针对RTK查询中的未经授权的错误取消maxRetries

单击ImageListItemBar的IconButton后,在Material—UI对话框中显示图像

你怎么看啦啦队的回应?

用于在路径之间移动图像的查询

扩展类型的联合被解析为基类型

为什么我的按钮没有从&q;1更改为&q;X&q;?

匹配一个或多个可选重复的特定模式

如何在独立的Angular 应用程序中添加Lucide-Angel?

使用可配置项目创建网格

使用Library chart.js在一个带有两个y轴的图表中绘制两个数据集

Reaction-在同一页内滚动导航(下拉菜单)