记一次Vue中$route序列号报错

 更新时间:2023年04月16日 16:58:20   作者:daytoywhy  
本文主要介绍了记一次Vue中$route序列号报错,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

第一次写文章,也当作工作中遇到问题的一次分享。

由于Vuex在浏览器刷新是会丢失数据,所以我在项目里使用了Vuex持久化存储的功能,我这边实现的方案是监听页面刷新的事件,将Vuex中的数据存到sessionStorage中,在页面初始化的时候再将sessionStorage中的数据设进Vuex中,具体代码如下

create(){
      //在页面加载时读取sessionStorage里的状态信息
    if (sessionStorage.getItem("store")) {
      this.$store.replaceState(
        Object.assign(
          {},
          this.$store.state,
          JSON.parse(sessionStorage.getItem("store"))
        )
      );
       sessionStorage.removeItem("store");
    }

    //在页面刷新时将vuex里的信息保存到sessionStorage里
    window.addEventListener("beforeunload", () => {
      sessionStorage.setItem("store", JSON.stringify(this.$store.state));
    });
}

这样一个简单的Vuex持久化储存的功能就实现了,浏览器刷新后我们也能读取到Vuex中储存的数据,但是突然有一天,这个功能失效了,页面也没有报错,经过我的一番摸索,最终将问题锁定在了Vuex中储存的$route对象上

$Route路由对象属性

$Route对象上有以下这几个属性

  • path:字符串,对应当前路由的路径,总是解析为绝对路径,如 "/foo/bar"
  • params:一个 key/value 对象,包含了动态片段和全匹配片段,如果没有路由参数,就是一个空对象
  • query:一个 key/value 对象,表示 URL 查询参数。例如,对于路径 /foo?user=1,则有 $route.query.user == 1,如果没有查询参数,则是个空对象
  • hash:当前路由的 hash 值 (带 #) ,如果没有 hash 值,则为空字符串
  • fullPath:完成解析后的 URL,包含查询参数和 hash 的完整路径
  • matched:一个数组,包含当前路由的所有嵌套路径片段的路由记录 。路由记录就是 routes 配置数组中的对象副本 (还有在 children 数组)

问题就出在了$route这个路由对象上,我们在页面刷新时要将Vuex中的数据转换成字符串,再进行储存

    //在页面刷新时将vuex里的信息保存到sessionStorage里
    window.addEventListener("beforeunload", () => {
      sessionStorage.setItem("store", JSON.stringify(this.$store.state));
    });

而store中如果有$route就会报错,这是因为$route包含了一些非序列话的属性,例如函数、循环引用等;
当使用JSON.stringify($route)时,可能会报错TypeError: Converting circular structure to JSON,这是因为$route对象包含循环引用,即对象内部存在相互引用,导致JSON.stringify()无法序列化这个对象,从而抛出这个错误。

解决方法

为了解决这个问题,你可以将$route对象转换成一个新的纯JavaScript对象,然后再进行序列化。可以使用Object.assign()方法来实现这一点,如下所示:

JSON.stringify(Object.assign({}, $route))

这个方法会创建一个新的JavaScript对象,将$route的属性复制到这个新对象中,并返回这个新对象。由于这个新对象只包含纯JavaScript数据,因此可以安全地序列化它。

到此这篇关于记一次Vue中$route序列号报错的文章就介绍到这了,更多相关Vue $route序列号报错内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解vue element plus多语言切换

    详解vue element plus多语言切换

    这篇文章主要为大家介绍了vue element plus多语言切换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • Vue实现背景更换颜色操作

    Vue实现背景更换颜色操作

    这篇文章主要介绍了Vue实现背景更换颜色操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • vue+element tabs选项卡分页效果

    vue+element tabs选项卡分页效果

    这篇文章主要为大家详细介绍了vue+element tabs选项卡分页效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • 详解Vue.js搭建路由报错 router.map is not a function

    详解Vue.js搭建路由报错 router.map is not a function

    这篇文章主要介绍了详解Vue.js搭建路由报错 router.map is not a function,非常具有实用价值,需要的朋友可以参考下
    2017-06-06
  • vue.js轮播图组件使用方法详解

    vue.js轮播图组件使用方法详解

    这篇文章主要为大家详细介绍了vue.js轮播图组件使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • vue中注册组件的两种方式详解(全局注册&& 局部注册)

    vue中注册组件的两种方式详解(全局注册&& 局部注册)

    vue 是一个完全支持组件化开发的框架, 组件之间可以进行相互的引用,这篇文章主要介绍了vue中注册组件的两种方式详解(全局注册&& 局部注册),需要的朋友可以参考下
    2023-06-06
  • BuildAdmin elementPlus自定义表头添加tooltip方法示例

    BuildAdmin elementPlus自定义表头添加tooltip方法示例

    这篇文章主要介绍了BuildAdmin elementPlus 自定义表头,添加tooltip实现方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)

    一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)

    这篇文章主要介绍了前后端分离及Vue.js入门,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • vue深拷贝的3种实现方式小结

    vue深拷贝的3种实现方式小结

    当使用同一个对象产生冲突时,可以使用lodash包,对该对象进行深拷贝,从而使操作的对象为不同的对象,这篇文章主要给大家介绍了关于vue深拷贝的3种实现方式,需要的朋友可以参考下
    2023-02-02
  • vue3 证件识别上传组件封装功能

    vue3 证件识别上传组件封装功能

    证件图片识别上传根据业务需要,经常涉及到证件上传,例如身份证上传、银行卡、营业执照等信息,根据设计师的设计,单独封装了一个上传组件,这篇文章主要介绍了vue3 证件识别上传组件封装,需要的朋友可以参考下
    2023-05-05

最新评论