Vue页面刷新后store数据丢失

原因:
store本意不是用来存储数据的,而是存储组件状态。
但是因为存取速度比sessionStorage快。所以还是有人用来存数据。比如我。
那么这个重置的问题要咋搞呢?
解决办法:
使用window的beforeunload事件将store中的数据存储到sessionStorage中。
然后再声明周期函数created()中将session的数据替换掉vue中的store数据
不过这里有一个要注意异步的问题。因为js是异步执行机制。所以必须要等到session中的数据存储到store中之后才能执行涉及该store数据的代码,不然全部都是undefined。
可以通过promise对象来进行同步化

具体代码:

// 先建立seesion工具来统一调用
// util_session.js
import store from '../vuex/store'
// 用于sessionStorage替换store函数。
export function sessionReplaceStore (name) {
  return new Promise((resolve, reject) => {
    if (sessionStorage.getItem(name)) {
      // 替换state状态
      store.replaceState(
        Object.assign(
          {},
          store.state,
          JSON.parse(sessionStorage.getItem(name))
        )
      )
      resolve(true)
    } else {
      resolve(false)
    }
  })
}

// vue文件
// xxxx.vue
// 无关的内容就不写了
<script>
import {sessionReplaceStore} from '../../utils/util_session'

created () {
    // 页面刷新时恢复store数据
    var that = this
    sessionReplaceStore('store').then(reslove => {
    // 执行需要获取store数据有关的代码
      console.log(that.$store.state.stock)
    }
    // 发生页面销毁事件前将store数据存储至sessionStoreage中
    window.addEventListener('beforeunload', () => {
      sessionStorage.setItem('store', JSON.stringify(this.$store.state))
    })
  }
</script>

这样就可以了。

代码说明:

promise():javascript异步操作的处理结果

参考文档: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise

store.replaceState(): 用来替换store中的state数据

参考文档:https://vuex.vuejs.org/zh/api/#replaceState

Object.assign(): 对象合并函数。将第二,第三参数的对象合并保存至第一参数的对象中。并且返回该对象。

参考文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@凌晨三点半

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值