Vuex/Pinia实现数据持久化存储另一种解决方案:vuex页面刷新数据丢失问题

方案一

配合本地storage或cookies,在更新数据时同时将数据保存在本地,state在初始化时先从本地缓存读怪初始值。如登录时保存token:

export default new Vuex.Store({
  state: {
    token: window.sessionStorage.getItem('token') //初始或页面刷新后从本地读取
  },
  mutations: {
    saveToken(state, data) {
      state.token = data
      window.sessionStorage.setItem('token', data) // 同时保存在sessionStorage 
    }
  }
})

方案二

对于vuex可使用第三方插件,如vuex-persistedstate实现

方案三

方案一不足之处,当需再存一个用户登录信息时,如userInfo,则需在state里添加userInfo,相当于复制一个state里的token和mutations里的saveToken(),即

export default new Vuex.Store({
  state: {
    token: window.sessionStorage.getItem('token'), //初始或页面刷新后从本地读取
    userInfo: window.sessionStorage.getItem('userInfo')
  },
  mutations: {
    saveToken(state, data) {
      state.token = data
      window.sessionStorage.setItem('token', data) // 同时保存在sessionStorage 
    },
    saveUserInfo(state, data) {
      state.userInfo = data
      window.sessionStorage.setItem('userInfo', data)
    }
  }
})

当需要存储更多数据,可在浏览器刷新前将整个state保留起来,刷新完页面加载完成后再将本地值设回给state。可以App.vue中添加如下代码:

export default {
  created() {
    this.getStore()
  },
  methods: {
    beforeunload() {
//当浏览器刷新或关闭时将state存到本地,可根据实际需求使用sessionStorage或localStorae或者是cookies
      window.sessionStorage.setItem('store', JSON.stringify(this.$store.state))
    },
    getStore() {
//初始进来时如果存在store,则设置state的值
      const store = window.sessionStorage.getItem('store')
      if (store) {
        this.$store.replaceState(
            Object.assign(
                this.$store.state,
                JSON.parse(store)
            )
        )
      }
      //读取后这里可以将store从本地存储中删除
      window.sessionStorage.remove('store')
    }
  },
  mounted() {
    //当浏览器刷新或关闭时触发
    window.addEventListener("beforeunload", this.beforeunload)
  },
  beforeDestroy() {
    window.removeEventListener("beforeunload", this.beforeunload)
  }
}

如使用的是Vue3或者是Pinia存储时,都可以使用同样的原理进行存储,只是写法上有差异

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Pinia是Vue.js 3.x官方推荐的状态管理库,主要用于组织和管理应用中的可复用状态。它本身不直接支持数据持久,包括本地存储(localStorage, sessionStorage)或 IndexedDB。但是,你可以结合Pinia使用一些第三方库或者Vue的内置API来实现数据的本地存储。 如果你想在Pinia实现数据持久,你可以这样做: 1. 使用Vue的` localStorage.getItem` 和 `localStorage.setItem` API: 当组件卸载时,你可以将Pinia store的状态同步到本地存储,加载时再从存储中读取恢复状态。 ```javascript // store.js import { reactive } from 'vue' export const useStore = defineStore('myStore', { state() { return reactive({ myData: localStorage.getItem('myData') || {} }) }, mutations: { saveData(state) { localStorage.setItem('myData', state.myData) }, }, actions: { async loadOrSaveData() { const data = await someAsyncFunction() // 获取或计算数据 this.myData = data this.saveData() }, }, }) ``` 2. 第三方库:如Vuex-persistedstate,这是一个用于Vuex状态持久的插件,可以方便地与Pinia集成。 ```javascript import createPersistedState from 'vuex-persistedstate' // ... storeEnhancers: [createPersistedState()] ``` 3. 如果你需要更复杂的数据存储(如键值对、对象或数组),可以考虑使用IndexedDB或适配其API的库,比如vue-localstorage-indexeddb。 重要的是,确保在处理数据存储时考虑到用户隐私和数据版本控制,特别是在生产环境中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值