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

如何在Pinia中持久化存储Set类型数据?

如何在Pinia Store中存储Set类型并支持持久化

问题核心是JSON序列化不支持Set类型,pinia-plugin-persistedstate-2默认用JSON处理状态,会把Set转成空对象{},从本地存储恢复后就不再是Set实例,导致调用has()等方法报错。

下面是两种可行的解决方法:

方法1:自定义序列化/反序列化函数(推荐)

在Store的persist配置里,自定义序列化和反序列化逻辑,将Set转成数组存储,恢复时再转回Set:

type Hi = { h: Set<string> }

const useHi = defineStore("hi", {
  state: (): Hi => ({ h: new Set<string>() }),
  persist: {
    serializer: {
      // 序列化:把Set转成数组再转JSON
      serialize: (state) => JSON.stringify({
        ...state,
        h: Array.from(state.h)
      }),
      // 反序列化:把数组转回Set
      deserialize: (str) => {
        const parsedState = JSON.parse(str)
        return {
          ...parsedState,
          h: new Set(parsedState.h)
        }
      }
    }
  }
})

这样处理后,本地存储里存的是数组,恢复到Pinia状态时自动转为Set实例,调用hi.h.has("21")就正常了。

方法2:使用beforeRestore钩子

在Store的actions里定义beforeRestore钩子,在状态从本地存储恢复前,手动将存储的数组转为Set:

type Hi = { h: Set<string> }

const useHi = defineStore("hi", {
  state: (): Hi => ({ h: new Set<string>() }),
  persist: true, // 开启持久化
  actions: {
    beforeRestore() {
      // 从本地存储读取保存的状态
      const savedState = localStorage.getItem("hi")
      if (savedState) {
        const parsed = JSON.parse(savedState)
        // 将数组转回Set
        this.h = new Set(parsed.h)
      }
    }
  }
})

这种方式适合需要在恢复前做额外逻辑的场景,不过自定义序列化的方式更简洁统一。

内容的提问来源于stack exchange,提问作者Quinten C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:31:06