在vue项目中用vuex来作全局的状态管理, 发现当刷新网页后,保存在vuex实例store里的数据会丢失。html
缘由:vue
由于store里的数据是保存在运行内存中的,当页面刷新时,页面会从新加载vue实例,store里面的数据就会被从新赋值初始化vuex
解决思路:api
将state的数据保存在localstorage、sessionstorage或cookie中(三者的区别),这样便可保证页面刷新数据不丢失且易于读取。浏览器
因为vue是单页面应用,操做都是在一个页面跳转路由,所以sessionStorage较为合适,缘由以下:cookie
vuex中state数据的修改必须经过mutation方法进行修改,所以mutation修改state的同时须要修改sessionstorage,问题却是能够解决可是感受很麻烦,state中有不少数据,不少mutation修改state就要不少次sessionstorage进行修改,既然如此直接用sessionstorage解决不就好了,为什么还要用vuex画蛇添足呢?
vuex的数据在每次页面刷新时丢失,是否能够在页面刷新前再将数据存储到sessionstorage中呢,是能够的,beforeunload事件能够在页面刷新前触发,可是在每一个页面中监听beforeunload事件感受也不太合适,那么最好的监听该事件的地方就在app.vue中。session
代码以下:app
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里 window.addEventListener("beforeunload",()=>{ sessionStorage.setItem("store",JSON.stringify(this.$store.state)) }) } }