Vuex刷新页面后数据丢失

产生原因:因为store里的数据是保存在运行内存中的,当页面刷新时,页面会重新加载vue实例,store里面的数据就会被重新赋值。

解决思路
1.Vuex的state里的数据全部是通过请求来触发action或mutation来改变。
2.将state里的数据保存一份到本地存储(localStorage、sessionStorage、cookie)中

这里我选择了的是sessionStorage,原因如下:

1.localStorage是永久存储在本地,除非你主动去删除;

2.sessionStorage是存储到当前页面关闭为止;

3.cookie则根据你设置的有效时间来存储,但缺点是不能储存大数据且不易读取。

而且vue是单页面应用,操作都是在一个页面跳转路由,另一个原因是sessionStorage可以保证打开页面时sessionStorage的数据为空,而如果是localStorage则会读取上一次打开页面的数据。

第一种方案:由于state里的数据是响应式,所以sessionStorage存储也要跟随变化。又由于vuex规定所有state里数据必须通过mutation方法来修改,所以第一种方案就是mutation修改state的同时修改sessionStorage对应存储的属性。

第二种方案:第一种方案确实可以解决问题,但这种方法很明显让人觉得怪异,都这样了,那不如直接用sessionStorage来做状态管理。

那怎么才能不用每次修改state时同时也要修改sessionStorage呢?这时我们可以换一个思路,因为我们是只有在刷新页面时才会丢失state里的数据,那有没有办法在点击页面刷新时先将state数据保存到sessionStorage,然后才真正刷新页面?

当然有,beforeunload这个事件在页面刷新时先触发的。那这个事件应该在哪里触发呢?我们总不能每个页面都监听这个事件,所以我选择放在app.vue这个入口组件中,这样就可以保证每次刷新页面都可以触发。





你可能感兴趣的:(Vuex刷新页面后数据丢失)