zoukankan      html  css  js  c++  java
  • vue单页应用在页面刷新时保留状态数据的方法

    在Vue单页应用中,如果在某一个具体路由的具体页面下点击刷新,那么刷新后,页面的状态信息可能就会丢失掉。这时候应该怎么处理呢?如果你也有这个疑惑,这篇文章或许能够帮助到你

    一、问题

    现在产品上有个需求:单页应用走到某个具体的页面,然后点击刷新后,刷新的页面要与刷新前的页面要保持一致。

    这时候就需要我们保存刷新之前页面的状态。

    二、一种解决方案

    在这个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的信息,所以在前面要先做判断

    这样就能比较圆满的解决问题了。

    三、另一种解决方案

    以上的解决方法由于要频繁地触发 localStorage.setItem 方法,所以对性能很不友好。而且如果一直同步vuex里的数据到localStorage里,我们直接用localStorage做状态管理好了,似乎也没有必要再用vuex。

    这时候王二想,如果有什么方法能够监听到页面的刷新事件,然后在那个监听方法里将Vuex里的数据储存到localStorage里,那该多好。

    很幸运,还真有这样的监听事件,我们可以用 beforeunload 来达到以上目的,于是王二在 App.vue 的 created 钩子函数里写下了如下代码:

     //在页面加载时读取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))
      })

    原文链接:https://blog.csdn.net/aliven1/article/details/80743470
  • 相关阅读:
    windows10 + anaconda + tensorflow-1.5.0 + python-3.6 + keras-2.2.4配置和安装
    k-center问题-学习
    交换机+路由器 网络口连接桥接关系示意
    用scp命令来通过ssh传输文件,ssh推送.py程序到CentOS7服务器端出现lost connection错误
    codevs 1519 过路费 最小生成树+倍增
    10.18 noip模拟试题
    poj 3565 ants
    [国家集训队2011]种树 (神贪心~~)
    poj 1821 Fence 单调队列优化dp
    SPFA 小优化*2
  • 原文地址:https://www.cnblogs.com/aidixie/p/13419741.html
Copyright © 2011-2022 走看看