问题:Pinia 持久化插件pinia-plugin-persistedstate,我在本地运行,一切正常,但是打包发测试,测试说某个功能无效,我一看,缓存里面没有数据
这就奇怪了啊,我本地一切正常啊,缓存也是好好地,为啥打包上线就无效了,线上也没报错啥的啊。我先从打包那边vite.congig.js看,也没啥问题,再网上搜索这插件本地正常,打包失效的问题,也没找到。折磨了我三天。
我想测试这个插件是不是真的打包上线失效了,就新建了个test.js文件测试
上线运行,结果是有效的,说明插件效果是有的,但为啥我另一个无效
我这边存的是route的数据,难道和这个有关
通过对插件的搜索了解:pinia-plugin-persistedstate 使用 JSON.stringify 和 JSON.parse 进行状态的序列化和反序列化,若状态数据里存在嵌套循环引用,会导致这两个方法出错
再对route查询了解:Route 对象包含循环引用属性,像 matched 数组中的组件引用,这会使 JSON.stringify 抛出错误,因为它无法处理循环引用。
ok,问题找到了,缓存route数据,里面matched数据会导致出现问题,需要过滤掉它
最后persist这么设置:
const useTagsViewStore = defineStore(
'tags-view',
{
state: () => ({
visitedViews: [],
cachedViews: [],
iframeViews: []
}),
actions: {
// 操作方法,我就不粘贴了
},
persist: {
storage: sessionStorage,
serializer: {
serialize: (value) => {
// 递归处理 state 中的 Route 对象
const processRoute = (route) => {
if (!route || typeof route !== 'object') return route;
// 提取需要的路由信息
const { fullPath, hash, href, meta, name, params, path, query, title } = route;
return { fullPath, hash, href, meta, name, params, path, query, title };
};
// 处理 visitedViews、cachedViews 和 iframeViews 中的 Route 对象
const processedState = {
...value,
visitedViews: value.visitedViews.map(processRoute),
iframeViews: value.iframeViews.map(processRoute),
};
return JSON.stringify(processedState);
},
deserialize: (value) => JSON.parse(value)
}
}
})
export default useTagsViewStore
困扰我3天的问题终于解决了,希望对你们有帮助,帮助到了的话帮我留个言吧,谢谢