Pinia踩坑日记

Pinia 踩坑日记

Pinia使用起来跟vuex差不多,但是我相信大家有很多人都是跟我一样,vue2就使用vuex,vue3就使用Pinia,这导致有很多变动的坑要踩,这里我就记录一下我遇到的问题和解决方法。

一、Pinia踩坑之持久化

我觉得pinia优点之一就是持久化了,之前的项目我一直使用的是pinia-plugin-persist,恰巧那个项目并没有使用ts,使用起来并没有遇到什么问题,但是这次写项目的时候用了ts,在集成pinia的时候,使用持久化插件的时候出现了重载问题,大概是以下的问题。

没有与此调用匹配的重载。
  第 1 个重载(共 3 个),“(id: "dataStore", options: Omit<DefineStoreOptions<"dataStore", { xiaohu: string; userinfo: {}; asideWidth: string; tabList: { path: string; title: string; }[]; activeTab: string; }, {}, { handleAsideWidth(): void; getDefault(route: string): void; addTabs(tab: any): void; }>, "id">): StoreDefinition<...>”,出现以下错误。
    类型“{ persist: { enabled: boolean; strategies: { storage: Storage; paths: string[]; }[]; }; state: () => { xiaohu: string; userinfo: {}; asideWidth: string; tabList: { path: string; title: string; }[]; activeTab: string; }; actions: { ...; }; getters: {}; }”的参数不能赋给类型“Omit<DefineStoreOptions<"dataStore", { xiaohu: string; userinfo: {}; asideWidth: string; tabList: { path: string; title: string; }[]; activeTab: string; }, {}, { handleAsideWidth(): void; getDefault(route: string): void; addTabs(tab: any): void; }>, "id">”的参数。
      对象字面量只能指定已知属性,并且“persist”不在类型“Omit<DefineStoreOptions<"dataStore", { xiaohu: string; userinfo: {}; asideWidth: string; tabList: { path: string; title: string; }[]; activeTab: string; }, {}, { handleAsideWidth(): void; getDefault(route: string): void; addTabs(tab: any): void; }>, "id">”中。
  第 2 个重载(共 3 个),“(id: "dataStore", storeSetup: () => unknown, options?: DefineSetupStoreOptions<"dataStore", _UnwrapAll<Pick<unknown, never>>, Pick<unknown, never>, Pick<unknown, never>> | undefined): StoreDefinition<...>”,出现以下错误。
    类型“{ persist: { enabled: boolean; strategies: { storage: Storage; paths: string[]; }[]; }; state: () => { xiaohu: string; userinfo: {}; asideWidth: string; tabList: { path: string; title: string; }[]; activeTab: string; }; actions: { ...; }; getters: {}; }”的参数不能赋给类型“() => unknown”的参数。
      对象字面量只能指定已知属性,并且“persist”不在类型“() => unknown”中。ts(2769)
(property) persist: {
    enabled: boolean;
    strategies: {
        storage: Storage;
        paths: string[];
    }[];
}

首先经过我百度,发现pinia-plugin-persist这个插件对ts好像并没有支持,于是换成了pinia-plugin-persistedstate,但是还是有重载的问题,这个时候我就怀疑是persist这个持久化属性上有字段发生了变更,代码自动补全也验证了我的猜想,我就开始找相关文档,因为我一般都是先百度问题,解决不了才看官方文档的,一般小问题确实那一套解决起来很快,但是这种问题百度确实是浪费了很多时间。

image-20240908220316922

比如上面这个图黑框中的部分,误导了我很长时间,在新版pinia-plugin-persistedstate中,paths已经没有了。

Configuration | Pinia Plugin Persistedstate (prazdevs.github.io)

image-20240908220454859

变成了我红框中的部分,大家其实也可以通过vscode点到persist的类型声明那里知晓。

image-20240908220704648

换成pick就解决了重载的这个问题,然后持久化还会遇到一个问题,就是必须在路由守卫里持久化才生效。

image-20240908220843381

这个问题大家到时候试试就知道了,我确实尝试了只有这样才能实现持久化,其实不嫌麻烦大家可以自己手动localstorage存,我业务场景没有这个必要,所以还是放在了路由守卫那里。

持续踩坑中…

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anixuil

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值