computed 未更新的根本原因是依赖未被正确追踪:必须显式读取响应式数据(如 props.yAxisData.map())、确保引用变化(避免 push,改用新数组赋值)、避免守卫语句跳过依赖读取、正确导入 vue 的 computed。

因为 computed 没有重新执行,不是 emit 本身的问题,而是它依赖的响应式数据没“动”——Vue 的响应式系统只认引用变化和 getter 访问,不认内容变更或非响应式赋值。
✅ 依赖必须被显式读取且是响应式的
computed 函数体内必须真实访问(即读取)每一个响应式依赖,否则 Vue 不会把它加入依赖列表。
- 写
localMarkCode.value✅(触发 getter,完成依赖收集) - 但只写
props.yAxisData❌(只是引用传递,没触发响应式追踪) - 正确做法:在 computed 内部用
props.yAxisData.map(...)或props.yAxisData.length等方式真正读一遍
✅ props 数据必须是“可响应式更新”的引用
父组件传来的 yAxisData 如果是静态数组、直接 push 修改、或异步赋值未替换引用,Vue 就无法感知变化。
- ❌ 错误:
this.yAxisData.push(newItem)—— 引用没变,computed 不触发 - ✅ 正确:
this.yAxisData = [...this.yAxisData, newItem]或ref([...])包裹初始值 - 如果数据来自 API,确保用
ref([])初始化,并用新数组赋值,而非原地修改
✅ 避免 computed 内部产生副作用或隐式跳过
computed 是纯函数,设计上不该含 log、emit、API 调用等操作;但更关键的是:一旦内部逻辑提前 return,后续依赖就不会被读取。
- 像
if (!props.yAxisData) return []这类守卫语句,若条件为真,localMarkCode.value可能根本没被读到 → 依赖收集失败 - 建议把守卫移到前面,或确保所有分支都访问关键依赖,例如先读
localMarkCode.value再判断 - 不要在 computed 里调用
emit或修改外部状态——这不仅违背设计,还可能干扰依赖追踪
✅ 检查 computed 是否从正确入口导入
极少数情况下,computed 被错误地从 @vue/reactivity 导入,而非 vue 主包,会导致响应式链路失效。
- ❌ 错误导入:
import { computed } from '@vue/reactivity' - ✅ 正确导入:
import { computed } from 'vue' - 尤其在混用 Composition API 和自定义 reactivity 工具时,容易误引

















