最近接手了一个项目,前端后端都要作,以前一直在作服务端的语言、框架和环境,前端啥都不会啊。html
忽然须要前端编程,两天速成了JS和VUE框架,惋惜仍是个半吊子。而后遇到了一个困扰了一成天的问题。一直调试都没办法解决。前端
最后找到一个极好的解决思路解决了问题。https://blog.csdn.net/guzhao593/article/details/81435342vue
遇到的问题:vuex
因为vue框架设计出来的APP实际上所有设置在同一个html上,跳转是经过路由实现的,编程
因此,有的控件并不会在跳转时刷新,若是有数据存放在session中,没办法保证没有刷新的控件能及时更新属性值。除非手动F5。后端
vuex的的做用就是设置一个store,来管理这些须要动态更新的数据。cookie
控件经过computed的绑定,能够保证在store中的数据更新后,控件上对应的数据及时更新。session
可是,store的数据是保存在内存中的,当手动F5时,页面会从新加载vue实例,store的数据就所有恢复初始值了,这样就会出现数据丢失的问题。app
解决思路:框架
将state里的数据保存一份到本地存储(localStorage、sessionStorage、cookie)中,刷新后从新从本地存储中读取出来,恢复现场。
解决过程:
首先得选择合适的客户端存储
localStorage是永久存储在本地,除非你主动去删除;
sessionStorage是存储到当前页面关闭为止;
cookie则根据你设置的有效时间来存储,但缺点是不能储存大数据且不易读取。
我选择的是sessionStorage,选择的缘由vue是单页面应用,操做都是在一个页面跳转路由,另外一个缘由是sessionStorage能够保证打开页面时sessionStorage的数据为空,而若是是localStorage则会读取上一次打开页面的数据。
由于咱们是只有在刷新页面时才会丢失store里的数据,那咱们能够在点击页面刷新时先将state数据保存到sessionStorage,而后才真正刷新页面。
beforeunload这个事件在页面刷新时先触发的。咱们把这个事件放在app.vue这个入口组件中,这样就能够保证每次刷新页面均可以触发。
具体的代码以下:
created() { 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)); }); }