我在一个有多个状态切片的React应用程序中使用react-redux和redux-persistent。这是一个简单的应用程序,包含ui
、todolist
、notes
和todolist-projects
等切片。除了todolist
片之外,所有的状态片都是持久的。
下面是我的store/index.js
,我在其中初始化了存储和持久化器:
import { legacy_createStore as createStore } from "redux";
import { persistStore, persistReducer } from "redux-persist";
import { rootReducer } from "./rootReducer";
import storage from "redux-persist/lib/storage";
const persistConfig = {
key: "root",
storage,
};
const persistedReducer = persistReducer(persistConfig, rootReducer);
export const store = createStore(
persistedReducer,
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
);
export const persistor = persistStore(store);
我在GitHub的一个问题中读到了一些关于key
的prop有时需要设置为"primary"
而不是"root"
。在Chrome DevTools的localStorage调试区域中,我注意到todolist
切片似乎确实存在于persist:primary
部分。(见下面的屏幕截图。)x1c 0d1x
我尝试将key
从"root"
更改为"primary"
,但这似乎不起作用。看起来没什么区别。
你可以在CodeSandbox上看到这个项目
1条答案
按热度按时间5uzkadbs1#
问题
state.todolist
被持久化到localStorage,正如您的屏幕截图所示。不过,我在你的沙箱中发现了一些代码问题。NavBar
使用原始锚(<a>
)标记而不是react-router-dom
Link
组件来实现导航操作。这些将重新加载页面并重置任何本地React组件状态。Todolist
组件使用了错误的对象引用比较来根据当前state.ui.currTodoProject
值筛选选定的state.todolist
状态。这些都是对象,在状态被JSON序列化到localStorage中,然后JSON反序列化回到Redux存储中之后,它们将不再具有浅引用相等性......它们是全新的不同的物体。建议方案
更新
NavBar
以使用Link
组件。更新
Todolist
通过_id
属性比较项目对象 *。也不需要将todolist复制到任何本地状态,只需从选定的todolist
状态计算当前currTodos
值。如果计算这个派生的状态是昂贵的,使用
useMemo
钩子来记忆计算的值。事实上,几乎任何时候你看到自己在写useState
/useEffect
钩子组合,这就是useMemo
的用途。