关于uniapp项目中pinia的缓存问题

文章探讨了在使用Vue3的Pinia状态管理时,如何在退出操作后清除缓存但仍能观察到旧数据的问题。通过分析,发现getters中的初始化方法在删除缓存后未重新执行,提出将方法移至actions并修改调用方式以解决数据更新问题。
摘要由CSDN通过智能技术生成

问题描述

我们首先来描述一下问题

我们编写了一个pinia文件,在该文件中我们的state需要通过getters中的uni.getStorageSync方法(我们假设方法名为:initItem)来获取具体数据并将数据赋予state中的变量

我们在**界面中使用uni.setStorageSync设置了缓存信息,接着我们进行了类似于退出操作使用uni.removeStorageSync操作后,我们通过uni.reLaunch返回主页

而当我们来到主页后我们调用该pinia文件的initItem方法,并输出该state中的相应变量我们会发现该数据没有被置空,仿佛我们的uni.removeStorageSync没有起到作用一样

原因

我们可以在进行remove操作的地方进行console操作以查看remove操作后是否还存在该缓存例如:

uni.removeStorageSync(‘item’);             //我们先进行删除缓存操作
const useTest=useTestStore();
useTest.initItem;        //删除缓存后,我们调用getters中的初始化方法来进行变量初始化
console.log(“看看删了没”,uni.getStorageSync(‘item’),useTest.item);         //从结果来看我们会发现结果为:”看看删了没, ,’具体数据’ “

在运行了以上代码后,我们会发现uni.removeStorageSync(‘item’)是起到了作用的,但是当我们在index界面再次调用getters中的初始化方法以及再次输出useTest.item,我们会发现该数据依然存在

我们可以发现,在进行了删除操作后,uni.getStorageSync确实没有该缓存内容了,但是当我们进行跳转页面操作,再调用初始化操作时我们发现该缓存内容似乎依然存在,那么我们就可以从getters中的initItem方法着手了,我们在该方法中也进行console.log来测试在该方法中item的数据值以及缓存值(截止以上内容我们可以合理怀疑initItem在进行删除操作后并没有再次调用)

在再一次进行运行后,我们会发现initItem确实没有在进行删除操作后再一次运行,即便我们在删除操作后就调用了initItem以及在index界面的onLoad()里也调用initItem方法,他也依然没有再次执行(具体原因未知)

解决方案

或许是getters中我们编写的方法存在某种问题,当然了,我们现在假设我们的getters中的初始化方法编写无误,那么我们可以将该方法移至actions中去(原getters方法删除),接着我们在界面中的原initItem区域改为initItem()即可,这时我们就会发现该pinia中的item变量会随着我们进行的remove/get/set 操作而发生数据变化了

`pinia-plugin-persistedstate` 是一个 Vue.js 的 Pinia 插件,它允许你在 Vuex 库方便地添加持久化的状态管理功能。如果你想要在 UniApp(微信小程序)应用这种按需持久化的策略,需要注意 UniAppVue 的一些差异。 首先,UniApp 小程序本身有自己的数据管理和缓存机制,叫做 `wx.setStorage()` 和 `wx.getStorageSync()` 方法,用于在本地存储数据。然而,如果你想利用类似于 Vuex + Pinia 的结构来组织数据,并且希望将某些状态保存到本地,可以按照以下步骤操作: 1. **安装依赖**: 在 UniApp项目,先安装 Vue.js 或者 Vue3 的运行时库,然后安装 `pinia` 和 `pinia-plugin-persistedstate`。例如,通过 npm 安装: ``` npm install vue@next pinia @vue/pinia @vue/plugin-persistedstate ``` 2. **创建 Pinia store**: 创建一个 Pinia store 并配置 `persistedState`,指定哪些状态需要持久化。示例代码: ```javascript import { createStore } from '@vue/pinia' import { persistedState } from '@vue/plugin-persistedstate' const myStore = createStore({ id: 'my-store', plugins: [persistedState()], state() { return { // 需要持久化的状态 myImportantData: null, // 不需要持久化的其他状态... } }, actions: {}, mutations: {} }) ``` 3. **初始化 store**: 在小程序生命周期钩子(如 app.json 的 launchPage 初始化 store: ```javascript onLaunch(options) { myStore.$onCreate(() => { // 初始化从本地存储加载的状态 myStore.myImportantData = wx.getStorageSync('myImportantData') || initialValue }) // 渲染页面前检查并设置状态 myStore.$onBeforeMount(() => { // 如果存在本地数据,更新 store if (myImportantDataFromLocalStorage) { myStore.commit('setMyImportantData', myImportantDataFromLocalStorage) } }) } ``` 4. **保存数据**: 当你需要将数据保存到本地时,在合适的 action/mutations 调用 `commit('saveMyImportantData', myImportantData)`,之后可以调用 `wx.setStorageSync` 来持久化数据。 5. **清除数据**: 当不需要某个状态时,可以在组件卸载或者特定场景下调用 `myStore.dispatch('clearMyImportantData')`,然后在相应的 action 删除并清空本地存储。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值