# 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 这个持久化属性上有字段发生了变更,代码自动补全也验证了我的猜想,我就开始找相关文档,因为我一般都是先百度问题,解决不了才看官方文档的,一般小问题确实那一套解决起来很快,但是这种问题百度确实是浪费了很多时间。
比如上面这个图黑框中的部分,误导了我很长时间,在新版 pinia-plugin-persistedstate
中,paths 已经没有了。
Configuration | Pinia Plugin Persistedstate (prazdevs.github.io)
变成了我红框中的部分,大家其实也可以通过 vscode 点到 persist 的类型声明那里知晓。
换成 pick 就解决了重载的这个问题,然后持久化还会遇到一个问题,就是必须在路由守卫里持久化才生效。
这个问题大家到时候试试就知道了,我确实尝试了只有这样才能实现持久化,其实不嫌麻烦大家可以自己手动 localstorage 存,我业务场景没有这个必要,所以还是放在了路由守卫那里。
持续踩坑中..........