在我的Zustand存储中,我尝试从本地存储中持久化的数据加载初始状态(我没有选择中间件,因为Next有一些我不想处理的问题):
const getInitialProject = (): Project => {
const project = loadCurrentProjectFromLs()
return (
project ?? {
projectName: '',
cards: [],
}
)
}
const useProjectStore = create<ProjectStore>((set, get) => ({
...getInitialProject(),
...
然而,页面的第一次呈现是在服务器上完成的,而不是在客户端(In React and Next.js constructor, I am getting "Reference Error: localstorage is not defined"),这意味着本地存储在那个时候是不可访问的。
这意味着我的代码不能正常工作,因为状态只能在第一次渲染后更新,但导致Zustand初始化的钩子在第一次渲染时被触发。
有没有更好的方法来解决这个问题,而不是使用useEffect
钩子,当localStorage变得可访问时更新存储?我希望逻辑是商店的一部分,而不是客户端,但我想不出比带计时器的循环更好的东西。
2条答案
按热度按时间vptzau2j1#
您可以使用中间件来保持状态。试试我为解决类似问题而创建的Persist and Sync中间件。
安装
然后将其添加到您的状态创建器中
🎉只需几行代码,你的状态就可以在标签/窗口之间完美同步,并且还可以使用localStorage持久化!
wgxvkvu92#
最后,我使用了一个带有useEffect的top布局文件,当LS可用时,它会在商店中触发加载函数。这样,函数至少不是页面的一部分,而是更广泛的基础设施(布局文件)。