前端 vue单页面应用刷新网页后vuex的state数据丢失的解决方案(转载)

最近接手了一个项目,前端后端都要做,之前一直在做服务端的语言、框架和环境,前端啥都不会啊。

突然需要前端编程,两天速成了JS和VUE框架,可惜还是个半吊子。然后遇到了一个困扰了一整天的问题。一直调试都没办法解决。

最后找到一个极好的解决思路解决了问题。https://blog.csdn.net/guzhao593/article/details/81435342

 

遇到的问题:

由于vue框架设计出来的APP实际上全部设置在同一个html上,跳转是通过路由实现的,

所以,有的控件并不会在跳转时刷新,如果有数据存放在session中,没办法保证没有刷新的控件能及时更新属性值。除非手动F5。

vuex的的作用就是设置一个store,来管理这些需要动态更新的数据。

控件通过computed的绑定,可以保证在store中的数据更新后,控件上对应的数据及时更新。

但是,store的数据是保存在内存中的,当手动F5时,页面会重新加载vue实例,store的数据就全部恢复初始值了,这样就会出现数据丢失的问题。

 

 

解决思路:

将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));
    });
  }

 

posted @ 2019-06-12 23:52  AXiangCoding  阅读(839)  评论(0编辑  收藏  举报