Vue3 刷新后,pinia存储的数据丢失怎么解决

本文介绍了在Vue项目中使用Pinia进行数据持久化存储的方法,通过pinia-plugin-persist插件将store的数据写入localStorage。同时,对比了依赖注入的全局变量策略,讨论了其在刷新后数据保持和更新的原理及适用场景。
摘要由CSDN通过智能技术生成

这个问题有两种解决办法:

  • 一是使用pinia的持久化存储
  • 一是使用vue的依赖注入

刷新后,通过pinia存储的vue store数据丢失,实际上是因为Vue原组件卸载、新组件重新挂载导致的,vue store是挂载在组件上的,当刷新导致组件卸载,那么原有的数据也就会同时丢失。

1.pinia持久化存储

持久化存储,实际上是pinia在组件卸载时,写入Localstorage。Vue项目中使用持久化存储的过程为:

  • 安装并在sotre处注入持久化插件
import piniaPluginPersist from 'pinia-plugin-persist'

const store = createPinia()
store.use(piniaPluginPersist) // 使用插件

export default store

在配置上述代码前,首先需要执行npm install pinia-plugin-persist --save,安装插件。

  • 在需要持久化的store中添加persist
import { defineStore } from 'pinia'
 
export const useMyStore = defineStore({
  id: 'myStore',
  state: () => ({
    data: null
  }),
  persist: true, // 添加 persist 属性

这样,在页面刷新后,myStore的值就不会消失。

2.依赖注入

第二种方法是以来注入,它通过在顶层框架中注入一个需要在全局使用的变量,这样,在所有顶层组件的子孙组件中都可以通过依赖注入使用该变量。使用方法为:

  • 变量提供组件
// 1. 引入symbol类型的key
import { userInfoSymbolKey } from '../utils/keys'

// 2. 获取store中存储的变量 
const userInfo = computed(() => useClientidStore().loginUserInfo)

// 3. 在挂载生命周期中,调用获取用户信息的方法
onMounted(() => {
  useStore().setUserState() 
})

// 4. 提供数据
provide(userInfoSymbolKey, { userInfo })
  • 变量注入组件
import { userInfoSymbolKey } from '../../utils/keys' // 引入key
const { userInfo } = inject(userInfoSymbolKey) as any // 注入变量

这样,就可以在组件中使用userInfo变量了。

在这里插入图片描述

依赖注入其实是通过顶层组件的每次加载都会向其内部注入相应的值来实现的。因为,不论底层组件如何刷新、卸载、挂载,对于顶层组件而言,都会随着底层组件每个动作的执行进行一遍卸载和挂载的过程。所以,这种方法实质是在每次组件更新时都重新请求数据或向组件中塞入新变量来达到变量看起来保持没消失的效果,实际上,每次刷新原来的变量都发生了变化,我们刷新后使用的,是顶层组件重新获取并向下传递的新数据而已。所以,对于这种方式,有两种场景非常适用:

  • 需要重新判断权限。如修改用户权限后,刷新后用户权限发生变化,需要在多个子组件中使用该权限变量时,依赖注入就只需要调用一次接口就行,可供后面的所有子组件使用。
  • 可能没有数据改变,但必须给多个下级组件使用时。

但是,使用该方法时需要注意:

  • 如果是通过调用接口获取数据,那么,在根组件挂载生命周期中需要调用该方法,保证每一次的组件重新挂载都能够获取到最新的数据
  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
解决方案如下:当在Vue项目中使用pinia进行状态管理时,刷新页面会导致pinia中的数据丢失。一个解决方法是在刷新页面之前先将数据存储到localStorage中,然后在初始化pinia时,将存储在localStorage中的数据读取出来重新赋值给pinia的状态。具体的实现步骤如下: 1. 在pinia的mutations中,在修改状态的同时,使用`window.localStorage.setItem`方法将数据存储到localStorage中。例如: ```javascript orderList(s, d) { s.orderList = d; window.localStorage.setItem("orderList", JSON.stringify(s.orderList)); }, ``` 2. 在初始化pinia时,可以在store的构造函数中读取localStorage中的数据,并重新赋值给pinia的状态。例如: ```javascript import { createStore } from 'pinia'; export const useStore = createStore({ state: () => ({ orderList: JSON.parse(window.localStorage.getItem("orderList")) || [], menuList: JSON.parse(window.localStorage.getItem("menuList")) || [], }), ... }); ``` 这样,在刷新页面之后,pinia的状态就可以从localStorage中恢复,并且数据不会丢失了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [解决VUE页面刷新数据丢失「建议收藏」](https://blog.csdn.net/cddcj/article/details/126251117)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [vite+vue3+pinia+vuex4动态路由解决刷新页面丢失](https://blog.csdn.net/z3133464733/article/details/130119492)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值