记一次Vue中$route序列号报错
作者:daytoywhy 发布时间:2024-05-02 17:04:03
第一次写文章,也当作工作中遇到问题的一次分享。
由于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数据,因此可以安全地序列化它。
来源:https://juejin.cn/post/7222253330504368184


猜你喜欢
- 在进行爬虫爬取淘宝商品信息时候,利用selenium来模拟浏览器进行爬取时遇到了这个问题:selenium.common.exception
- matplotlib官网 matplotlib库默认英文字体添加黑体(‘SimHei')为绘图字体代码:plt.rcPar
- AjaxUpload.js文件的代码,供大家参考,具体内容如下/** * AJAX Upload ( http://valums.com/
- 近期,一直在研究MySQL数据库,经常修改配置文件,导致MySQL数据库无法使用,不得不反复重装MySQL数据库。以下是在Windows7
- 在Windows系统中,mysql登录的时候出现了这样的错误:ERROR 1045: Access denied for user:
- Python实现12306火车票抢票系统效果图如下所示:具体代码如下所示:import urllib.request as request
- 50个常用sql语句 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(
- 鼠标双击滚动屏幕,单击停止滚动,很多小说新闻网站都有这个很人性化的功能,阅读起小说、新闻来很方便,不用手动拉滚动条。js代码如下:<h
- 本文主要针对Golang的内置库 net/http 做了简单的扩展,通过添加中间件的形式实现了管道(Pipeline)模式,这样的好处是各模
- 一提到数字图像处理,可能大多数人就会想到matlab,但matlab也有自身的缺点:1、不开源,价格贵2、软件容量大。一般3G以上,高版本甚
- 如何使用pytorch加载并读取COCO数据集 环境配置基础知识:元祖、字典、数组利用PyTorch读取COCO数据集利用PyTorch读取
- 字符串类型代码的执行字符串类型代码的执行函数有三个,都是Python的内置函数。eval()执行字符串类型的代码,并返回最终结果。exec(
- 可用性研究表明,当响应时间超过一秒钟时,用户便能够有所察觉。虽然在反馈系统中,当用户需要等待时,更好的解决方案的是应该采用确定性的进度条。但
- 场景针对园区停车信息,需要对各个公司提供的停车数据进行整合并录入自家公司的大数据平台数据的录入无外乎就是对数据的增删改查下面上一个常规的写法
- 前言return语句用于退出函数,向调用方返回一个表达式。return在不带参数的情况下(或者没有写return语句),默认返回None。N
- SQLServer错误5120:先用widows用户登录附加再分离重新用sa附加就行了 不行的话,绝招:你先用SQLServer
- Python 多线程的实例详解一)线程基础1、创建线程:thread模块提供了start_new_thread函数,用以创建线程
- quicktool/view.py文件修改视图函数index(),渲染一个home.html模板from django.shortcuts
- 命名空间: 每一个作用域变量存储的位置,或者解释为 存储作用域中变量的字典。作用: 获取想查看某个作用域中的变量名、变量值。使用方法: lo
- 本文介绍了jquery在vue脚手架中的使用方式示例,分享给大家,具体如下:1:在各个vue文件中使用<script>impor