pinia-plugin-persistedstate持久化插件的局限性出现的引用问题:pinia+pinia-plugin-persistedstate

文章讲述了在使用Pinia的组合式API和pinia-plugin-persistedstate进行状态持久化时,如何修复数据恢复后计算属性失去响应性的问题。作者通过创建ref变量、watch和重置响应式数据解决了这个问题。
摘要由CSDN通过智能技术生成

问题描述:在使用pinia-plugin-persistedstate恢复数据时,数据恢复后以来该数据的计算属性失去响应式。

先来看一下初始化数据:

let pageDataArr = reactive([]);
const pageDataArrLastElement = computed(() => {
    return pageDataArr.value[pageDataArr.value.length - 1];
})

红色的数据依赖于蓝色的数据,初始化时建立响应式,页面中引用红色数据。

当在引用该数据的页面中进行刷新操作后:

        pinia+pinia-plugin-persistedstate恢复数据的回调:

        

        数据成功恢复了,但是页面中用到的getter的数据响应式的绑定失效了

        

经过多番查阅资料外加自己分析,原因应该是当在pinia挂载之后插件恢复数据,恢复前的pageDataArr与恢复后的pageDataArr不是一个变量,但是在pageDataArrLastElement中引用的数据是前一个pageDataArr。

这个问题卡了我一整天。

在我的苦思冥想一遍一遍调试中,终于解决了。

解决办法:

const pageDataCache = ref([]);
let pageDataArr = ref([]);
watch(pageDataArr,(newValue) => {
    pageDataCache.value = newValue;
})
/**
* @description: 在数据恢复时用于重新建立数据响应式
* @return {*}
*/    
function restoreDataRerefer() {
    pageDataArr.value = pageDataCache.value;
}

首先新建一个pageDataCache变量——调试的时候随便起的,用watch监听pageDataArr同步两个变量中的数据,使用persistedstate缓存的时候只缓存pageDataCache变量。

afterRestore: (ctx) => {
    ctx.store.restoreDataRerefer()
    console.log(`刚刚恢复完:`,ctx.store.$id);
}

在persistedstate恢复完成回调中调用提前写好的回调函数restoreDataRerefer将缓存的数据给pageDataArrLastElement变量所绑定的那个pageDataArr。

并且要把本来的pageDataArr变量的reactive改成ref,就能恢复响应式了,不然只用reactive没办法赋值恢复响应式。

好了,问题就解决了,这怎么刷新页面也不会丢失响应式了

======================2024.3.20编辑========================================

如果你能看到这里说明你肯定遇到了这个问题,但是呢我编辑要说的是,在后面无意中的一次尝试发现,上面的更改全部可以推翻了。在问题出现的时候reactive的pageDataArr直接改成ref的就好,缓存问题就迎刃而解了。至于原因我也没有太明白,大概是ref赋值还能保持响应式但是reactive不可以吧,当pinia暴露出一个ref的响应式对象时暴露出的只是他的value而不是整个响应式对象。直接改为ref就可以避免因为赋值导致的响应式问题丢失了。

注意问题:

我使用的是pinia的组合式api,在做持久化的时候查了很多资料,感觉关于这方面的资料比较少,写一下我在使用该插件时遇到的问题:

首先第一个:组合式API怎么配置该插件

export const useUserStore = defineStore("user",() => {
    const userInfo = ref();
    function setUsetInfo(value) {
        userInfo.value = value;
    }
    return {
        userInfo,
        setUserInfo,
    }
},{
    persist: true
})

这里是举个例子,当使用pinia的组合式API时,配置插件写在defineStore的第三个参数中,具体的配置信息参见文档:https://prazdevs.github.io/pinia-plugin-persistedstate/zh/

第二个问题:persistedstate插件只会存储在return中暴露出去的数据,如果数据没有暴露出去的话就算写在paths中也不会缓存,函数也是一样,我上面提到的回调函数和中转缓存数据都要写到return中暴露出去。

由于这个问题卡了我很久,并且在网上也没有找到相关的案例,所以特此记录一下,第一次写博客各位大佬海涵。

最后贴上大佬的文章:

Pinia刷新会丢失数据 应该怎么解决_pinia刷新页面数据丢失怎么解决-CSDN博客

pinia + pinia-plugin-persistedstate + 组合式API 写法,持久化失效问题-CSDN博客

  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pinia 是一个用于 Vue.js 的状态管理库,它提供了一种简单且可扩展的方式来管理应用程序的状态。Pinia-plugin-persistedstate 是一个 Pinia 插件,它可以帮助你将应用程序的状态持久化到本地存储中,以便在刷新页面或重新加载应用程序时保持状态的一致性。 使用 pinia-plugin-persistedstate 插件进行持久化的步骤如下: 1. 安装插件: 你可以使用 npm 或者 yarn 来安装插件: ``` npm install pinia-plugin-persistedstate ``` 或者 ``` yarn add pinia-plugin-persistedstate ``` 2. 导入插件并注册: 在你的应用程序的入口文件中,导入 `pinia-plugin-persistedstate` 并将其注册到 Pinia 实例中: ```javascript import { createApp } from 'vue' import { createPinia } from 'pinia' import { createPersistedState } from 'pinia-plugin-persistedstate' const pinia = createPinia() pinia.use(createPersistedState()) const app = createApp(App) app.use(pinia) app.mount('#app') ``` 3. 配置插件: 你可以通过传递选项对象来配置插件,例如指定要持久化的状态模块、存储键名等: ```javascript pinia.use(createPersistedState({ key: 'my-app-state', // 存储键名,默认为 'pinia-state' paths: ['counter'], // 要持久化的状态模块,默认为全部模块 storage: localStorage // 存储引擎,默认为 localStorage })) ``` 4. 使用持久化的状态: 在你的组件中,你可以像使用普通的 Pinia 状态一样使用持久化的状态: ```javascript import { useStore } from 'pinia' export default { setup() { const store = useStore() // 读取持久化的状态 console.log(store.counter) // 修改持久化的状态 store.counter++ } } ``` 这样,你就可以使用 pinia-plugin-persistedstate 插件来实现 Pinia 状态的持久化了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值