在 Vue3 开发中,偶尔会遇到模板里调用的方法提示'不存在'的情况。这通常不是逻辑错误,而是作用域没搞对。特别是当你混合使用了 Options API 和 Composition API,或者直接从 AI 生成的代码里复制粘贴时,很容易忽略掉关键的暴露步骤。
简单来说,Composition API 里的变量不会自动变成全局可用的,除非你告诉 Vue 它们存在。下面我结合几种常见场景,帮你彻底理清这个问题。
核心差异:Options API vs Composition API
在 Options API 里,你把方法写在 methods 下就能直接用。但到了 Composition API,逻辑得包在 setup() 里,还得记得'交出来'。
1. Options API 写法
这种写法比较传统,适合 Vue2 迁移过来的老项目。
export default {
methods: {
productSpaceNotice() {
console.log("方法调用");
}
}
}
2. Composition API + setup() 函数
这是标准的 Composition API 写法。注意看最后,必须把方法通过 return 暴露出去,否则模板根本看不见。
export default {
setup() {
const productSpaceNotice = () => {
console.log("方法调用");
};
return { productSpaceNotice };
}
}
3.
现在最主流的写法。它简化了语法,不需要写 return,直接在脚本里定义的变量默认都会暴露给模板。
<script setup lang="ts">
const productSpaceNotice = () => {
console.log("方法调用");
};
</script>
为什么你的代码会报错?
看到 _ctx.stopCountdown is not a function 这种报错,基本就是 Vue 找不到这个方法。常见雷区有这几个:
- 用了
setup()却没在里面定义,或者定义了没return。 - 在
<script setup>组件里,却把方法写在了普通<script>块里。 - 项目里既有 Options API 又有 Composition API,风格不统一导致困惑。




