vue单页应用如何在页面刷新时保留状态数据

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

1、问题

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

这时候就须要咱们保存刷新以前页面的状态。vuex

2、一种解决方案

在这个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.vuecreated 钩子函数里写下了以下代码:网站

localStorage.getItem("userMsg") && this.$store.replaceState(JSON.parse(localStorage.getItem("userMsg")));

//考虑到第一次加载项目时localStorage里没有userMsg的信息,因此在前面要先作判断
复制代码

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

3、另外一种解决方案

以上的解决方法因为要频繁地触发 localStorage.setItem 方法,因此对性能很不友好。并且若是一直同步vuex里的数据到localStorage里,咱们直接用localStorage作状态管理好了,彷佛也没有必要再用vuex。this

这时候王二想,若是有什么方法可以监听到页面的刷新事件,而后在那个监听方法里将Vuex里的数据储存到localStorage里,那该多好。spa

很幸运,还真有这样的监听事件,咱们能够用 beforeunload 来达到以上目的,因而王二在 App.vuecreated 钩子函数里写下了以下代码: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))
    })
复制代码

原文地址:王玉略的我的网站

相关文章
相关标签/搜索