vuex数据状态持久化问题
作者:前端小白在写bug
在VUE项目中,由于是单页应用,vuex中的数据在页面刷新时就会被清除,所以我们要考虑怎样让vuex中的数据持久保存在浏览器中,至少不能每次刷新时都丢失登录状态。
本文介绍VUE项目中常用到的两种vuex持久化的方法,底层实现原理一直,方法不太一样,可以在项目中根据实际来区分
方法一、浏览器监听+本地存储
我们可以监听浏览器的刷新,在页面刷新时将vuex内的数据保存在本地存储中(根据项目需要可以考虑保存在sessionStorage或者localStorage中)
在App.vue中,created生命周期写我们的监听方法
window.addEventListener("beforeunload", () => { sessionStorage.setItem("store", JSON.stringify(this.$store.state)) })
然后在进入到created生命周期时,去到sessionStorage/localStorage中的数据,将数据替换到vuex中
if(sessionStorage.getItem("store")) { this.$store.replaceState(Object.assign({}, this.$store.state, JSON.parse(sessionStorage.getItem('store')))) }
整体来说明一下代码
created() { // 页面加载时,读取sessionStorage中的状态信息 if(sessionStorage.getItem("store")) { this.$store.replaceState(Object.assign({}, this.$store.state, JSON.parse(sessionStorage.getItem('store')))) } // 在页面刷新时,将vuex中的信息保存到sessionStorage里 window.addEventListener("beforeunload", () => { sessionStorage.setItem("store", JSON.stringify(this.$store.state)) }) },
这个方法的好处是不需要借助其他三方组件库,实现vuex全量数据持久化,坏处是所有数据保存在本地,会有一些较敏感数据容易被查看到,另外如果做某些指定数据持久化时会比较麻烦,所以下面介绍第二种更为简单的方法
方法二、状态持久化插件
推荐使用 vuex-persistedstate 插件
使用方法
如下:
1、在项目中安装该插件
cnpm i --save vuex-persistedstate
2、在 src/store/index.js中引入该插件
import createPersistedState from 'vuex-persistedstate'
在vuex中使用
plugins: [createPersistedState()]
整体代码
如下:
import Vue from 'vue' import Vuex from 'vuex' import createPersistedState from 'vuex-persistedstate' Vue.use(Vuex) export default new Vuex.Store({ plugins: [createPersistedState({ storage: window.sessionStorage, // 默认位置是 localStorage reducer: (state) => { return { // 默认是全部缓存,在这里可以设置需要缓存的状态 token: state.token } } })], state: { token: '' }, mutations: { }, }
优点:
1、可以更便捷设置存储位置 为sessionStorage或者 localStorage中,默认为 localStorage
2、可以更便捷设置需要存储的内容,如当需要存储token时,只需要将token放入进入即可
总结
本文插件只简单概述了一下状态持久化插件的用法,还有更多用法并未用到,在此并未讲述,有兴趣的朋友可以此插件github地址做更多了解(当然还有很多其他很好用的插件和方法,本文只提到了我自己项目中使用过的)
好了,以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。