如今产品上有个需求:单页应用走到某个具体的页面,而后点击刷新后,刷新的页面要与刷新前的页面要保持一致。vue
这时候就须要咱们保存刷新以前页面的状态。vuex
在这个Vue单页应用中,王二是用Vuex做为状态管理的,一开始王二的思路是将Vuex里的数据同步更新到localStorage里。函数
即:一改变vuex里的数据,便触发localStorage.setItem
方法,参考以下代码:性能
import Vue from "vue"
import Vuex from "vuex"
Vue.use(Vuex)
function storeLocalStore (state) {
window.localStorage.setItem("userMsg",JSON.stringify(state));
}
export default new Vuex.Store({
state: {
username: "王二",
schedulename: "标题",
scheduleid: 0,
},
mutations: {
storeUsername (state,name) {
state.username = name
storeLocalStore (state)
},
storeSchedulename (state,name) {
state.schedulename = name
storeLocalStore (state)
},
storeScheduleid (state,id) {
state.scheduleid = Number(id)
storeLocalStore (state)
},
}
})
复制代码
而后在页面加载时再从localStorage里将数据取回来放到vuex里,因而王二在 App.vue
的 created
钩子函数里写下了以下代码:网站
localStorage.getItem("userMsg") && this.$store.replaceState(JSON.parse(localStorage.getItem("userMsg")));
//考虑到第一次加载项目时localStorage里没有userMsg的信息,因此在前面要先作判断
复制代码
这样就能比较圆满的解决问题了。ui
以上的解决方法因为要频繁地触发 localStorage.setItem
方法,因此对性能很不友好。并且若是一直同步vuex里的数据到localStorage里,咱们直接用localStorage作状态管理好了,彷佛也没有必要再用vuex。this
这时候王二想,若是有什么方法可以监听到页面的刷新事件,而后在那个监听方法里将Vuex里的数据储存到localStorage里,那该多好。spa
很幸运,还真有这样的监听事件,咱们能够用 beforeunload
来达到以上目的,因而王二在 App.vue
的 created
钩子函数里写下了以下代码:code
//在页面加载时读取localStorage里的状态信息
localStorage.getItem("userMsg") && this.$store.replaceState(JSON.parse(localStorage.getItem("userMsg")));
//在页面刷新时将vuex里的信息保存到localStorage里
window.addEventListener("beforeunload",()=>{
localStorage.setItem("userMsg",JSON.stringify(this.$store.state))
})
复制代码
这样的话,彷佛就比较完美了。事件
2018年03月27日补充:
王二在使用上述方法时,遇到了一个问题,就是:在开发阶段,若是在Vuex里添加新的字段,则新的字段不能被保存到localStorage里,因而上述代码修改以下:
//在页面加载时读取localStorage里的状态信息
localStorage.getItem("userMsg") && this.$store.replaceState(Object.assign(this.$store.state,JSON.parse(localStorage.getItem("userMsg"))));
//在页面刷新时将vuex里的信息保存到localStorage里
window.addEventListener("beforeunload",()=>{
localStorage.setItem("userMsg",JSON.stringify(this.$store.state))
})
复制代码
原文地址:王玉略的我的网站