使用vuex的问题记录解决刷新页面state数据消失

12次阅读

共计 1184 个字符,预计需要花费 3 分钟才能阅读完成。

在实际的 vue 项目中,当我们的应用遇到多个组件之间的共享问题时,通常会用到 Vuex(一个状态管理的插件,可以解决不同组件之间的数据共享和数据持久化),解决组件之间同一状态的共享问题。

因子:

  • Vuex 优势:相比 sessionStorage,存储数据更安全,sessionStorage 可以在控制台被看到。
  • Vuex 劣势:在刷新页面后,vuex 会重新更新 state,所以,存储的数据会丢失。

言而总之:
实际问题:在 vue 项目中,使用 Vuex 做状态管理时,调试页面时,刷新后 state 上的数据消失了,该如何解决?

解决思路:将 state 中的数据放在浏览器 sessionStorage 和 localStorage
解决办法

  1. 存储到 localStorage

通过监听页面的刷新操作,即 beforeunload 前存入本地 localStorage, 页面加载时再从本地 localStorage 读取信息
在 App.vue 中加入下面代码

created(){
    // 在页面刷新时将 vuex 里的信息保存到 localStorage 里
        window.addEventListener("beforeunload",()=>{localStorage.setItem("messageStore",JSON.stringify(this.$store.state))
        })
        
    // 在页面加载时读取 localStorage 里的状态信息
        localStorage.getItem("messageStore") && this.$store.replaceState(Object.assign(this.$store.state,JSON.parse(localStorage.getItem("messageStore"))));
  }
  1. 使用 vuex-persistedstate 插件

安装插件:npm install vuex-persistedstate –save
配置:
在 store 的 index.js 中,手动引入插件并配置

import createPersistedState from "vuex-persistedstate"
const store = new Vuex.Store({
  // ...
  plugins: [createPersistedState()]
})

该插件默认持久化所有 state,当然也可以指定需要持久化的 state:

import createPersistedState from "vuex-persistedstate"
const store = new Vuex.Store({
  // ...
  plugins: [createPersistedState({
      storage: window.sessionStorage,
      reducer(data) {
          return {
          // 设置只储存 state 中的 myData
          myData: data.myData
        }
     }
  })]

正文完
 0