You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Vue模板中可访问$route,script setup中却提示未定义?

Vue模板与script setup中$route访问差异的内部原理

模板中能直接用$route的原因

Vue的模板在编译阶段会被转换成渲染函数,这个过程中Vue会自动处理模板内的标识符:

  • 所有以$开头的全局注入属性(比如$route、$store),编译后会被解析为通过组件实例的代理对象访问,也就是this.$route。
  • Vue Router通过全局混入(mixin)的方式,将$route注入到了所有组件的实例上,所以模板里写{{ $route.params.page }}时,实际是在访问组件实例上的$route属性,自然能正常运行。

script setup中直接用$route报错的原因

<script setup>是Vue 3推出的语法糖,它编译后对应组件的setup函数,这个函数的执行逻辑和组件实例是分离的:

  • setup函数本身没有绑定组件实例的this(除非通过getCurrentInstance()手动获取),所以全局注入到组件实例上的$route,并不会自动出现在setup函数的作用域中。
  • ESLint检查的是当前作用域内的标识符,$route没有在script setup的作用域里定义或导入,因此会抛出“未定义”的错误。

要在script setup中访问路由参数,正确的做法是使用Vue Router提供的Composition API:

import { useRoute } from 'vue-router'
const route = useRoute()
const pageNumber = route.params.page

useRoute()函数会通过Vue的依赖注入系统,获取到当前组件对应的路由对象,这是Composition API风格的正确访问方式。

核心差异总结

  • 模板的编译过程自动关联了组件实例的代理,能直接访问实例上的全局注入属性;
  • script setup的作用域是独立的,不会自动挂载这些全局注入属性,必须通过对应的Composition API或手动获取组件实例来访问。

内容的提问来源于stack exchange,提问作者dhiaagr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:13:17