vuex中存储的数据,刷新页面后导致数据丢失

一、问题

使用vuex存储全局数据后,刷新浏览器页面导致数据丢失

二、原因

刷新页面时,vue实例重新加载,因此导致store也随之被重置
store是用来存储组件状态的,而不是用来做本地数据存储的
对于不希望页面刷新之后被重置的数据,推荐使用本地存储来进行存储

vuex的状态储存是响应式的,当我们使用vuex进行全局状态管理时,vue组件从store中读取状态的时候,若store中的状态发生变化,那么相应的组件也会得到高效刷新,vuex存储的数据只是在页面中,相当于我们定义的全局变量,刷新之后,会发现之前获取的vuex状态的数据消失了,里面的数据就会恢复到初始化的状态。因为,刷新页面后,vuex会重新更新state

三、解决

方法一:

监听页面是否刷新,如果页面刷新了,将state对象存入到sessionStorage/localStorage中。
页面打开之后,判断sessionStorage/localStorage中是否存在state对象,如果存在,则说明页面是被刷新过的,将sessionStorage/localStorage中存的数据取出来给vuex中的state赋值。如果不存在,说明是第一次打开,则取vuex中定义的state初始值。
示例代码请在 App.vue 中

<template>
  <div id="app">
    <router-view />
  </div>
</template>

<script>
export default {
  name: 'App',
  created() {
    // 在页面加载时读取sessionStorage里的状态信息
    if (sessionStorage.getItem('store')) {
      this.$store.replaceState(
        Object.assign(
          {},
          this.$store.state,
          JSON.parse(sessionStorage.getItem('store'))
        )
      )
    }

    // 页面刷新时,将vuex里的信息保存到sessionStorage
    // 在页面刷新时先触发beforeunload事件
    window.addEventListener('beforeunload', () => {
      sessionStorage.setItem('store', JSON.stringify(this.$store.state))
    })
  },
}
</script>

方法二:

安装插件

vuex-persistedstate实现数据持久化,来解决使用vuex存储状态时页面刷新后数据消失的问题
vuex-persistedstate:在页面重新加载之间保持并重新补充Vuex状态

npm install --save vuex-persistedstate
import Vue from 'vue'
import Vuex from 'vuex'
import createPersistedState from 'vuex-persistedstate'

Vue.use(Vuex)
const store = new Vuex.Store({
  // 定义状态
  state: {
    isopen:'',
    isThirdAuthDev:false,
    isDataSourceDev:false,
    isDDioDev:false,
    ismappingBindDev1:false,
    ismappingBindDev2:false,
    id: '',
    nickname: '',
    username: '',
    password: '',
    remember: '',
    fieldsbind:[],
    bindList:{}
  },
  mutations: {
    // 相当于编写set方法
    setUser (state, data) {
      state.nickname = data
    },
    setUserId (state, data) {
      state.id = data
    },
    setUsername (state, data) {
      state.username = data
    },
    setPassword (state, data) {
      state.password = data
    },
    setRemember (state, data) {
      state.remember = data
    },
    clear (state) {
      for (const i in state) {
        delete state[i]
      }
    },
    setTest(state,data){
      if(data.isopen){
         state.isopen=data.isopen;
          
      }else if(data.isThirdAuthDev){
        state.isThirdAuthDev=data.isThirdAuthDev
         
      }else if(data.isDataSourceDev){
        state.isDataSourceDev=data.isDataSourceDev
        
      }else if(data.isDDioTestDev){
        state.isDDioDev=data.isDDioDev
        
      }else if(data.ismappingBindDev1){
         state.ismappingBindDev1=data.ismappingBindDev1
          
      }else if(data.ismappingBindDev2){
        state.ismappingBindDev2=data.ismappingBindDev2
      
     }
     console.log(state)
    },
    
  },
  actions: {
    // 写一些异步的操作
    // setUserAysnc (context, LoginUser) {
    //   context.commit('setUser', LoginUser)
    // }
  },
  modules: {},
  plugins: [
    createPersistedState({
      storage: window.localStorage,
      reducer (state) {
        return {
          id: state.id, // 持久化
          nickname: state.nickname,
          username: state.username,
          password: state.password,
          remember: state.remember,
          isopen:state.isopen,
          isThirdAuthDev:state.isThirdAuthDev,
          isDataSourceDev:state.isDataSourceDev,
          isDDioDev:state.isDDioDev,
          ismappingBindDev1:state.ismappingBindDev1,
          ismappingBindDev2:state.ismappingBindDev2,
        }
      }
    })
  ]
})
export default store

四、补充

cookie: 不适合存储较大的数据 (一段不超过4KB的小型文本数据)
localStorage: 用于长久保存整个网站的数据,保存的数据没有过期时间,直到手动去删除(永久存储)
sessionStorage: 临时保存同一窗口(或标签页)的数据,在关闭窗口或标签页之后将会删除这些数据(推荐)

GitHub 加速计划 / vu / vue
109
18
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:4 个月前 )
9e887079 [skip ci] 1 年前
73486cb5 * chore: fix link broken Signed-off-by: snoppy <michaleli@foxmail.com> * Update packages/template-compiler/README.md [skip ci] --------- Signed-off-by: snoppy <michaleli@foxmail.com> Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 1 年前
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐