You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 15:55:26