当前位置: 首页 > news >正文

Vue 响应式无限递归问题总结

Vue 响应式无限递归问题总结

问题现象

在项目中遇到了 “Maximum call stack size exceeded”(最大调用堆栈大小超出)错误,导致页面无法正常加载。

问题原因

1. 响应式对象的问题

  • Vue 的 Vuex 状态管理中的数据是响应式对象
  • 响应式对象包含特殊的 getter 和 setter,用于监听数据变化
  • 当访问响应式对象的属性时,会触发这些 getter

2. 循环引用导致无限递归

  • 在路由过滤函数中,直接访问 Vuex 中的菜单数据
  • 当访问menu.menuType时,触发 Vue 的响应式 getter
  • 由于某些原因(可能是数据结构或 Vue 版本问题),这个 getter 存在循环引用
  • 导致无限递归调用,最终堆栈溢出

3. 为什么之前能运行

  • 可能之前的菜单数据结构不同
  • 或者 Vue 的响应式系统配置有变化
  • 或者某个依赖更新导致了这个问题

解决方案

核心思路:移除响应式引用

使用 JSON 序列化和反序列化,将响应式对象转换为普通 JavaScript 对象:

// 修改前(有问题)functionfilterRoutesByMenus(routes,menus){constpageMenuNames=[];constextractPageMenuNames=(menuList)=>{menuList.forEach((menu)=>{if(menu.menuType==="2"){// 访问响应式对象,触发无限递归pageMenuNames.push(menu.name);}if(Array.isArray(menu.children)&&menu.children.length>0){extractPageMenuNames(menu.children);}});};extractPageMenuNames(menus);// 直接使用响应式对象// ...}// 修改后(正确)functionfilterRoutesByMenus(routes,menus){constpageMenuNames=[];// 使用 JSON 序列化移除响应式引用constsafeMenus=JSON.parse(JSON.stringify(menus||[]));constextractPageMenuNames=(menuList)=>{menuList.forEach((menu)=>{if(menu.menuType==="2"){// 访问普通对象,不会触发递归pageMenuNames.push(menu.name);}if(Array.isArray(menu.children)&&menu.children.length>0){extractPageMenuNames(menu.children);}});};extractPageMenuNames(safeMenus);// 使用普通对象// ...}

为什么这样解决有效

1. JSON 序列化的作用

  • JSON.stringify()将对象转换为 JSON 字符串,移除所有响应式特性
  • JSON.parse()将 JSON 字符串转换回普通 JavaScript 对象
  • 得到的对象是纯净的,没有任何 Vue 的响应式特性

2. 避免响应式触发

  • 普通对象的属性访问不会触发 Vue 的 getter
  • 不会存在循环引用问题
  • 代码可以正常执行,不会陷入无限递归

3. 保持功能不变

  • 菜单过滤逻辑完全相同
  • 只是改变了数据源的类型
  • 不影响业务逻辑

总结

核心问题:Vue 响应式对象在特定情况下会触发无限递归

解决方案:使用 JSON 序列化将响应式对象转换为普通对象

关键点

  • 响应式对象包含特殊的 getter/setter
  • 直接访问可能触发无限递归
  • JSON 序列化可以移除响应式特性
  • 普通对象不会触发 Vue 的响应式系统

这是一个常见的 Vue 响应式系统问题,通过移除响应式引用可以有效解决。

http://www.jsqmd.com/news/388301/

相关文章:

  • 2026年评价高的轻钢龙骨公司推荐:四川烤漆龙骨、四川矿棉板、四川轻钢龙骨、‌U型龙骨、轻钢龙骨吊顶、龙骨吊顶选择指南 - 优质品牌商家
  • 2026年波纹补偿器公司权威推荐:316 不锈钢金属软管、万向铰链式波纹补偿器、三元乙丙橡胶接头、丝扣橡胶接头选择指南 - 优质品牌商家
  • 草民电影网高清播放网站|在线电影电视剧在线观看平台
  • 极速影视免费在线观看|高清电影电视剧全集更新平台
  • 2026年评价高的伸缩器公司推荐:压力平衡型波纹补偿器/压盖式松套伸缩器/双法兰限位伸缩器/双球橡胶接头/可拆式双法兰传力伸缩器/选择指南 - 优质品牌商家
  • CK电影网高清播放平台|最新电影电视剧在线观看网站
  • 巴巴电影网高清影视平台|免费在线观看电影电视剧全集
  • 麻花影视在线观看平台|高清电影电视剧全集更新网站
  • 2026年金属软管厂家权威推荐榜:小拉杆波纹补偿器、快速接头金属软管、旁通式波纹补偿器、横向大拉杆波纹补偿器、波纹金属软管选择指南 - 优质品牌商家
  • 大数据与生物:基因数据分析
  • [数据结构]可持久化数组
  • 提示工程架构师团队指南:提示设计研究如何高效协作?3个流程+2个协作工具
  • 模型量化在工业质检AI应用中的优化实践
  • 2026年烤漆龙骨公司权威推荐:四川烤漆龙骨、四川矿棉板、四川轻钢龙骨、抗菌矿棉板、轻钢龙骨吊顶、防潮矿棉板、龙骨吊顶选择指南 - 优质品牌商家
  • AI伦理合规不踩雷!架构师必学的理论落地方法论
  • 2026年隔墙龙骨厂家权威推荐榜:抗菌矿棉板/条形矿棉板/矿棉吸音板/矿棉板吊顶施工/矿棉装饰吸声板/轻钢龙骨吊顶/选择指南 - 优质品牌商家
  • 2026年防火矿棉板厂家推荐:抗菌矿棉板、矿棉吸音板、矿棉板吊顶施工、矿棉装饰吸声板、轻钢龙骨吊顶、防潮矿棉板选择指南 - 优质品牌商家
  • 2026年矿棉板厂家最新推荐:‌U型龙骨、售楼处、四川烤漆龙骨、四川矿棉板、四川轻钢龙骨、抗菌矿棉板、条形矿棉板选择指南 - 优质品牌商家
  • 2026年龙骨厂家最新推荐:四川轻钢龙骨/抗菌矿棉板/矿棉吸音板/矿棉板吊顶施工/矿棉装饰吸声板/轻钢龙骨吊顶/选择指南 - 优质品牌商家
  • 2026年铝方通吊顶公司权威推荐:木纹铝方通/氟碳铝单板/铝单板吊顶/铝方通铝方管/雕花铝单板/冲孔铝单板/双曲铝单板/选择指南 - 优质品牌商家
  • 2026年转印铝方通厂家权威推荐榜:铝方通吊顶、铝方通铝方管、雕花铝单板、U型铝方通、双曲铝单板、喷涂铝单板、幕墙铝单板选择指南 - 优质品牌商家
  • 智能客服机器人服务商深度评测:2026年如何选择你的AI伙伴? - 2026年企业推荐榜
  • SpringBoot+Vue 教学资料管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL
  • SpringBoot+Vue 个性化定制智慧校园管理系统平台完整项目源码+SQL脚本+接口文档【Java Web毕设】
  • 2026年评价高的U型铝方通公司推荐:冲孔铝单板、双曲铝单板、喷涂铝单板、四川铝单板、四川铝方通、型材铝方通、幕墙铝单板选择指南 - 优质品牌商家
  • 2026年专业制冷设备维修服务商综合盘点 - 2026年企业推荐榜
  • Java Web BS老年人体检管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • 芯片工程师如何缓解上班焦虑?
  • 【2025最新】基于SpringBoot+Vue的房地产销售管理系统管理系统源码+MyBatis+MySQL
  • Python:生成器函数