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

2. 解决思路
一种是state里的数据全部是通过请求来触发action或mutation来改变

一种是将state里的数据保存一份到本地存储(localStorage、sessionStorage、cookie)中

很显然,第一种方案基本不可行,除非项目很小或者vuex存储的数据很少。而第二种可以保证刷新页面数据不丢失且易于读取。

3. 解决过程
首先得选择合适的客户端存储

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

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

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

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

然后是怎么用sessionStorage来保存state里的数据。

第一种方案

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

第二种方案

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

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

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

具体的代码如下:

export default {
  name: 'App',
  created () {
    //在页面加载时读取sessionStorage里的状态信息
    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))
    })
  }
}
————————————————
版权声明:本文为CSDN博主「赵天明」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/guzhao593/article/details/81435342

vuex的state数据丢失相关推荐

  1. vuex刷新state数据丢失问题

    用vuex来做全局的状态管理时, 发现当刷新网页后,保存在vuex实例store里的数据会丢失. 1. 产生原因 其实很简单,因为store里的数据是保存在运行内存中的,当页面刷新时,页面会重新加载v ...

  2. uniapp、vue,vuex中state改变,getters不动态改变的完美解决方案!

    uniapp.vue,vuex中state改变,getters不动态改变的完美解决方案! 参考文章: (1)uniapp.vue,vuex中state改变,getters不动态改变的完美解决方案! ( ...

  3. vuex刷新页面数据丢失怎么解决_你是否真正了解Vuex

    很久不写文章了,断了有一年多.这期间加入了新的团队做leader,认识新的朋友,迎接新的挑战.本应该坐下来整理自己的所见与所得,但又担心是否会起到作用,是否大家会认同.就像以前有一个朋友问我写这么多入 ...

  4. 在vue组件中使用vuex的state状态对象的5种方式

    下面是store文件夹下的state.js和index.js内容 state.js //state.js const state = {headerBgOpacity:0,loginStatus:0, ...

  5. Do not mutate vuex store state outside mutation handlers.

    组件代码: selectItem(item,index) {this.selectPlay({list: this.songs,index}) }, ...mapActions(['selectPla ...

  6. 棘手的问题input:当在严格模式中使用 Vuex 时,在属于 Vuex 的 state 上使用 v-model,input

    棘手的问题input:当在严格模式中使用 Vuex 时,在属于 Vuex 的 state 上使用 v-model,input 用"Vuex 的思维"去解决这个问题的方法是:给 &l ...

  7. uniapp中利用监视vuex中state数据配合uview实现登录消息提示

    先看效果图 登录成功或者退出成功都能够给用户提示,提示用户体验! uview的顶部消息提示详情可见u-top-tips 设计思路 首先是页面的布局 是将顶部消息提示写在了个人详情页内 <u-to ...

  8. Vuex的State核心概念

    Vuex的State核心概念 State提供唯一的公共数据源,所有共享的数据都要统一放到Store的 State中进行存储. //创建store数据源,提供唯一公共数据 const store = n ...

  9. 解决this._data.$$state...“Error: [vuex] do not mutate vuex store state outside mutation handlers.“ 报错

    今天遇到了这样一个报错: [Vue warn]: Error in callback for watcher "function () {return this._data.$$state; ...

最新文章

  1. 短信验证码、图形验证码、邮件验证的自动化测试
  2. 【Tool】Augmentor和imgaug——python图像数据增强库
  3. ASP.NET Core中使用MediatR实现命令和中介者模式
  4. java web服务_将Java服务公开为Web服务
  5. 什么不是预防计算机病毒的方法,预防计算机病毒的方法是什么
  6. 基于JavaSwing+Mysql点餐系统设计和实现
  7. HTML学习笔记--HTML的语法【1】
  8. POJ 1811 Prime Test
  9. 如何用Python破解验证码,适合新手练手
  10. 内存分析_Redis内存爆炸增长?你需要知道这一套Redis内存分析方法
  11. 413 Request Entity Too Large 异常记录
  12. How Not to Crash #2: Mutation Exceptions 可变异常(不要枚举可变的集合)
  13. Ajax Loading进度条gif在线生成网站Preloaders.net
  14. SecureCRT软件安装
  15. 二级分销跟差价收益有区别吗?
  16. 内存地址中的16进制最小单位是1bit,1Byte?
  17. hostapd wpa_supplicant madwifi详细分析(七)——hostapd整体梳理
  18. 金庸感人的经典爱情对白
  19. ERROR: Cannot determine archive format of /tmp/pip-req-build-2uc6o_he 解决方案
  20. 计算机网络第一弹——基础概念

热门文章

  1. Mybatis-Plus多表关联查询的使用
  2. c语言中余数恒等于1,费马小定理_KANGMANG201102_新浪博客
  3. 如何把word文件压缩到最小
  4. uboot2021.10-nandflash-3.initr_nand
  5. 2,JESD204为什么值得关注?
  6. 训练网络时的错误记录
  7. 教你如何查看linux版本
  8. C语言 CJSON使用实例
  9. gensim corpora的简单使用
  10. log4j/log4e的使用