Zustand持久化中间件用初始状态覆盖持久化存储问题求助
Zustand持久化中间件用初始状态覆盖持久化存储问题求助
我现在卡在上一个Zustand持久化的问题上快疯了!我用MMKV做Zustand的存储,修改用户设置后能看到MMKV里确实更新了,但每次关掉App再打开,或者刷新页面,状态就被打回初始值了。
我特意做了测试:
- 把代码里的
initialState去掉后,MMKV里的内容是这样的:
{ "version": 1 }
- 在App里调整完通知设置后,MMKV变成了:
{ "state": { "notifications": { "bookings": false, "messages": false } }, "version": 1 }
结果一重启App,MMKV又变回第一个结果了,明显是初始状态把持久化的内容给覆盖了。
下面是我的代码,有没有大佬能帮我找找问题?
const initialState = { settings: { notifications: { bookings: false, messages: false, }, }, }; const zustandStorage: StateStorage = { setItem: (name, value) => { return storage.set(name, value); }, getItem: (name) => { let value = storage.getString(name); return value ?? null; }, removeItem: (name) => { return storage.delete(name); }, }; // 我本来想提前取出存储的内容,但好像没起作用 const storage = zustandSorage.getItem('user_settings'); export const createSettingsSlice: StateCreator< Settings, [], [['zustand/persist', unknown]] > = persist( (set, get) => ({ ...initialState, // 我怀疑这里是不是直接把初始值硬塞进去了? setInitialState: () => { checkNotifications() .then(async ({ status }) => { if (status === 'granted') { set( produce((state) => { (state.settings.notifications.bookings = storage?.state.notifications.bookings), (state.settings.notifications.messages = storage?.state.notifications.messages); }) ); } else { set( produce((state) => { (state.settings.notifications.bookings = false), (state.settings.notifications.messages = false); }) ); } }); }, setNotification: (value: 'MESSAGES' | 'BOOKINGS') => { set( produce((state) => { (state.settings.notifications.bookings = value === 'BOOKINGS' ? !state.settings.notifications.bookings : state.settings.notifications.bookings), (state.settings.notifications.messages = value === 'MESSAGES' ? !state.settings.notifications.messages : state.settings.notifications.messages); }) ); }, resetNotification: () => { set(() => initialState); }, }), { name: 'user_settings', storage: createJSONStorage(() => zustandStorage), partialize: (state) => state.settings, version: 1 } );
我自己琢磨了几个可能的问题点,但不确定对不对:
- 是不是在创建slice的时候直接展开
...initialState,导致Zustand初始化时优先用这个值,而不是去读持久化存储? - 我提前获取
storage的方式不对,zustandSorage.getItem返回的是字符串,我没解析成对象,而且时机太早,可能Zustand还没初始化存储,所以拿到的是空值? setInitialState方法里用storage?.state.notifications.bookings的时候,storage是字符串,根本没有state属性,所以这里其实是undefined,导致又把值设成了false?
有没有大佬能指点一下?我想要的效果是:App启动时优先用持久化存储里的设置,如果没有的话再用初始状态,而不是每次都被初始状态覆盖回去。
备注:内容来源于stack exchange,提问作者wind_kind
相关产品推荐
相关产品推荐

