Vue3 computed 属性相互依赖导致栈溢出?如何解决?

vue3 computed 属性相互依赖导致栈溢出?如何解决?

vue3 computed 中的代码导致栈溢出?

问题:

一段 vue3 代码中使用 computed 导致了栈溢出,原因不明确。

// index.vue// customcalendar.vaueconst props = defineprops({  checkdate: {    type: array,    default() {      return [];    },  },});const mindate = computed(() => {  if (props.checkdate.length) {    let newarr = props.checkdate.sort((a, b): number => a.gettime() - b.gettime());    return new date(+newarr[0] as number);  } else {    return new date();  }});const maxdate = computed(() => {  if (props.checkdate.length) {    let newarr = props.checkdate.sort((a, b): number => b.gettime() - a.gettime());    return new date(+newarr[0] as number);  } else {    return new date();  }});const curyear = ref(new date().getfullyear());const curmonth = ref(new date().getmonth());watch(() => maxdate.value, (newval: date | null) => {  if (newval) {    curyear.value = newval.getfullyear();    curmonth.value = newval.getmonth();  }}, {  immediate: true,});

答案:

该问题是由相互依赖的 computed 属性导致的无限循环引起的。

mindate 和 maxdate computed 属性都依赖于 props.checkdate 数组。如果 checkdate 数组发生变化,这两个属性都会重新计算。在重新计算过程中,它们又会对 checkdate 数组进行排序,这可能导致它们相互触发重新计算,形成无限循环。

以下是对代码的修改,以解决此问题:

立即学习“前端免费学习笔记(深入)”;

import { ref, computed, watch, onMounted } from 'vue';const props = defineProps({  checkDate: {    type: Array,    default() {      return [];    },  },});// 新增一个响应式属性来存储排序后的数组const sortedCheckDates = ref([]);const minDate = computed(() => {  if (sortedCheckDates.value.length) {    return new Date(sortedCheckDates.value[0].getTime());  } else {    return new Date();  }});const maxDate = computed(() => {  if (sortedCheckDates.value.length) {    return new Date(sortedCheckDates.value[sortedCheckDates.value.length - 1].getTime());  } else {    return new Date();  }});// 监听checkDate的变化,并更新sortedCheckDateswatch(() => props.checkDate, (newVal) => {  sortedCheckDates.value = newVal.sort((a, b) => a.getTime() - b.getTime());});const curYear = ref(new Date().getFullYear());const curMonth = ref(new Date().getMonth());watch(() => maxDate.value, (newVal) => {  if (newVal) {    curYear.value = newVal.getFullYear();    curMonth.value = newVal.getMonth();  }}, {  immediate: true,});onMounted(() => {  // 初始化sortedCheckDates  sortedCheckDates.value = props.checkDate.sort((a, b) => a.getTime() - b.getTime());});

此修改通过引入一个额外的响应式属性 sortedcheckdates 来存储排序后的 checkdate 数组,解决了 computed 属性之间的相互依赖性。现在,当 checkdate 数组发生变化时,sortedcheckdates 数组将更新,并由 computed 属性使用它,从而避免了无限循环。

以上就是Vue3 computed 属性相互依赖导致栈溢出?如何解决?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1497823.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 19:52:46
下一篇 2025年12月19日 19:52:59

相关推荐

  • Vue 2 中异步操作的并行执行与结果获取

    本文深入探讨了在javascript `async/await`函数中,尤其是在vue 2环境下,如何正确地并行发起多个异步请求并获取它们的解析结果。文章解释了直接 `await` 一个 promise 变量而不重新赋值的常见误区,以及由此导致的 `typeerror`,并提供了捕获 promise…

    2025年12月20日
    000
  • Vue 3 中 Proxy 对象的数据访问与父子组件通信指南

    本文旨在解决%ignore_a_1% 3应用中父子组件间异步数据传递时遇到的proxy对象访问难题。通过剖析vue 3响应式原理,并提供父子组件代码的修正示例,详细阐述了如何正确处理异步数据加载、利用生命周期钩子、使用`v-if`进行条件渲染,以及在子组件中正确接收和访问props,确保数据能够被顺…

    2025年12月20日 好文分享
    000
  • Vue 3 异步数据处理与 Proxy 对象访问指南

    本文深入探讨 vue 3 中处理异步数据时遇到的 `proxy(object)` 访问难题。我们将详细解析其出现原因,并提供一套完整的解决方案,包括父子组件间数据传递的最佳实践、正确的生命周期钩子使用、条件渲染以及数据初始化策略,确保您能顺畅地获取并使用响应式数据,避免常见的 `undefined`…

    2025年12月20日
    000
  • 如何构建一个支持多语言的前端国际化方案?

    答案:构建前端国际化方案需选用react-i18next等成熟库,统一管理多语言JSON资源,支持动态切换与持久化,结合路由实现SEO友好和格式化翻译。 构建一个支持多语言的前端国际化方案,关键在于统一管理文本资源、动态切换语言、适配组件展示,并确保可维护性和扩展性。以下是具体实现思路和步骤。 1.…

    2025年12月20日
    000
  • 使用 JavaScript 动态更新 HTML 元素内容:更清晰、更高效的方法

    本文介绍了如何使用 JavaScript 动态加载外部 HTML 文件,从而更清晰、更高效地更新大型 HTML 元素的内容。通过将内容分离到单独的文件中,可以避免在 JavaScript 代码中嵌入大量 HTML 代码,提高代码的可读性和可维护性。文章提供了详细的步骤和示例代码,帮助开发者轻松实现此…

    好文分享 2025年12月20日
    000
  • JavaScript地理信息系统

    JavaScript GIS利用Web技术实现地图展示与空间分析,主流库包括Leaflet、OpenLayers、Mapbox GL JS和Google Maps API,支持地图加载、标记添加、GeoJSON渲染、交互操作及后端集成,可结合React、Vue等框架应用于城市规划、物流追踪、环境监测…

    2025年12月20日
    000
  • 前端自动化测试架构设计

    前端自动化测试架构需分层覆盖单元、组件、E2E和视觉回归测试,采用Vitest、Playwright等工具统一配置,集成CI/CD实现覆盖率报告与结果追踪,并通过页面对象模型、data-testid定位及定期维护提升可维护性。 前端自动化测试架构设计的核心是确保代码质量、提升开发效率,并在持续集成流…

    2025年12月20日
    000
  • 服务端渲染原理与同构应用开发

    服务端渲染(SSR)通过在服务器生成完整HTML提升首屏速度与SEO,同构架构使代码可在服务端与客户端共享;其流程包括路由匹配、组件渲染、HTML生成与状态注入,浏览器接收后即时展示并由客户端框架“激活”交互;关键挑战在于规避浏览器API、生命周期差异、数据预取同步及样式处理,Next.js、Nux…

    2025年12月20日
    000
  • 获取 nipple.js 虚拟摇杆数据:位置、距离与方向

    本文详细介绍了如何使用 nipple.js 库获取虚拟摇杆的实时位置、距离和方向数据。通过监听摇杆的“move”事件,开发者可以轻松提取摇杆中心、摇杆手柄位置以及移动距离和角度等关键信息,克服了官方文档缺乏实践示例的难题,为游戏或交互式应用开发提供了清晰的实现指导。 理解 nipple.js 的数据…

    2025年12月20日
    000
  • Vue 2 中 await 的正确用法:处理并行请求与获取返回值

    本文深入探讨了 javascript 中 `async/await` 的核心机制,特别是在 vue 2 环境下如何正确获取 `await` 表达式的返回值,以及如何高效地处理多个并行异步请求。文章纠正了一个常见误区:`await promise;` 仅暂停执行,并不会将 promise 的解析值赋回…

    2025年12月20日
    000
  • 如何使用JavaScript的DOM解析器解码HTML实体编码的字符串

    本文详细介绍了在javascript中如何高效地将html实体编码(如`é`)转换为其对应的普通字符(如`é`)。通过利用浏览器内置的dom解析器,即创建临时dom元素并结合`innerhtml`和`innertext`属性,可以实现简洁且强大的解码功能。文章还提供了将此方法封装为可复用工具函数的示…

    2025年12月20日
    000
  • 获取Nipple.js摇杆实时数据的方法

    本教程详细介绍了如何使用`nipple.js`库获取虚拟摇杆的实时位置、距离和方向信息。通过监听摇杆的`”move”`事件,开发者可以轻松捕获并处理摇杆的动态数据,实现精确的用户输入控制,适用于游戏开发或交互式界面。 在使用nipple.js创建虚拟摇杆时,开发者经常需要获取…

    2025年12月20日
    000
  • JavaScript桌面应用开发实践

    Electron和Tauri是JavaScript开发桌面应用的主流框架。Electron基于Chromium和Node.js,生态成熟,适合快速开发跨平台应用;Tauri采用Rust后端,体积小、性能高,适合追求轻量高效的项目。开发时需区分主进程(管理窗口和系统API)与渲染进程(Web界面),通…

    2025年12月20日
    000
  • 函数式响应式编程实践

    函数式响应式编程通过数据流建模事件与状态变化,核心是信号与变换。使用map、filter、merge、scan等无副作用操作组合信号,实现如搜索建议等功能时可借助debounce、switchMap控制请求频率与取消,逻辑集中且易维护。主流工具包括RxJS、Most.js、Bacon.js,适用于前…

    2025年12月20日
    000
  • JavaScript状态管理模式比较

    答案:现代前端状态管理需根据项目规模和技术栈选择合适方案。从小型项目的全局对象与事件总线,到中大型应用的Redux、Pinia,再到轻量级React工具Zustand与Jotai,各模式在可维护性、复杂度和开发效率间权衡,核心是确保状态可预测、易调试与持续维护。 在现代前端开发中,状态管理是构建复杂…

    2025年12月20日
    000
  • JavaScript ESLint规则定制

    自定义ESLint规则可提升代码质量,首先通过配置文件设置规则如禁止var;其次使用插件扩展语法支持,如Vue;再者可编写自定义规则文件禁止alert等;最后集成到编辑器与CI流程确保执行。 在团队开发中,代码风格的一致性非常重要。ESLint 是一个强大的 JavaScript 代码检查工具,除了…

    2025年12月20日
    000
  • JavaScript代码分割技术详解

    代码分割是将JavaScript大文件拆分为小块按需加载的技术,通过构建工具如Webpack实现,可按路由、功能或第三方库进行分割,结合预加载优化性能,提升首屏速度与用户体验。 在现代前端开发中,JavaScript代码分割(Code Splitting)是提升应用加载性能的关键手段。它通过将大型打…

    2025年12月20日
    000
  • JavaScript虚拟DOM性能对比

    虚拟DOM性能因框架而异,React采用双端diff但依赖key优化,Preact体积小速度快,Vue 3结合编译优化与响应式系统提升效率,Solid.js通过编译时消除运行时diff,各框架在更新粒度、内存开销与实际场景表现上差异显著。 虚拟DOM(Virtual DOM)是现代前端框架提升渲染性…

    2025年12月20日
    000
  • 前端监控系统设计与错误追踪

    前端监控系统的核心目标是及时发现并定位用户遇到的JavaScript错误、资源加载失败和性能异常等问题。通过全局错误监听、Promise异常捕获、资源加载错误监听及框架级错误处理(如Vue、React)实现全面错误捕获;结合基础环境数据、页面状态与轻量级行为链路收集上下文信息,并借助Source M…

    2025年12月20日
    000
  • 前端日志系统设计与实现

    前端日志系统是排查问题、监控体验和优化性能的关键工具,需具备采集、分级、上报、存储与展示能力。首先定义日志级别(debug、info、warn、error、fatal),线上通常只上报warn及以上以控制数据量;结合自动采集(JS错误、Promise异常、资源加载失败、框架错误钩子、性能指标)与手动…

    2025年12月20日
    000

发表回复

登录后才能评论
关注微信