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

在Zustand Store中更新嵌套类StoragePolicySettings时出现undefined问题

解决Zustand中StoragePolicySettings更新时appliesToOptions变为undefined的问题

问题根源

  • 直接访问store.storagePolicySettings获取当前状态可能存在过期状态问题,异步操作中状态可能已更新,导致基于旧状态扩展的新对象丢失属性
  • 若StoragePolicySettings是类实例,对象扩展运算符...可能无法正确复制类的所有属性(比如非自有可枚举属性、getter/setter)

解决方案1:用函数式更新获取最新状态

把直接访问store状态改为在set回调里获取最新的前置状态,确保更新基于最新值:

async function initializeData() {
  const [computerGroups, ...otherVars] = await Promise.all([
    getComputerGroups(),
    // 其他API调用
  ]);

  store.setStoragePolicySettings((prevSettings) => ({
    ...prevSettings,
    appliesToOptions: computerGroups,
  }));
}

解决方案2:优化store的更新方法(推荐)

修改store中的setStoragePolicySettings方法,支持部分属性更新,不用手动扩展整个对象:

type Store = {
  storagePolicy: StoragePolicyDto;
  setStoragePolicy: (policy: StoragePolicyDto) => void;

  storagePolicySettings: StoragePolicySettings;
  setStoragePolicySettings: (
    partialSettings: Partial<StoragePolicySettings>
  ) => void;
};

export const useStore = create<Store>((set) => ({
  storagePolicy: new StoragePolicyDto(),
  setStoragePolicy(storagePolicy: StoragePolicyDto) {
    set((state) => ({
      ...state,
      storagePolicy: storagePolicy,
    }));
  },
  storagePolicySettings: new StoragePolicySettings(),
  setStoragePolicySettings(partialSettings: Partial<StoragePolicySettings>) {
    set((state) => ({
      ...state,
      storagePolicySettings: {
        ...state.storagePolicySettings,
        ...partialSettings,
      },
    }));
  },
}));

调用时只传需要更新的属性就行:

async function initializeData() {
  const [computerGroups, ...otherVars] = await Promise.all([
    getComputerGroups(),
    // 其他API调用
  ]);

  store.setStoragePolicySettings({ appliesToOptions: computerGroups });
}

解决方案3:处理类实例的属性复制

如果StoragePolicySettings是类实例,扩展运算符无法正确复制属性时,用Object.assign创建新实例:

store.setStoragePolicySettings((prevSettings) => {
  const newSettings = new StoragePolicySettings();
  Object.assign(newSettings, prevSettings);
  newSettings.appliesToOptions = computerGroups;
  return newSettings;
});

内容的提问来源于stack exchange,提问作者Alexander Satchell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:13:22