Vue script setup 宏

Vue3 script setup 中常见编译期宏的职责边界,以及 defineProps、defineEmits、defineModel 之间的关系。

#tech / dev / frame #resource / vue3 #type / synthesis #status / growing

[!info] related notes

Vue script setup 宏

definePropsdefineEmitsdefineModel 这些能力放在一起理解更合适,因为它们都不是普通运行时函数,而是 script setup 下的编译期宏。

一句话定义

script setup 宏是 Vue 在单文件组件编译阶段识别和转换的特殊语法入口,用来声明 props、emit、双向绑定等组件边界信息。

为什么这组能力要放在一起理解

  • 它们都服务于组件接口声明
  • 都依赖 script setup 的编译期处理
  • 看起来像函数,职责却更接近“组件声明语法”

几个最常见的宏

defineProps

  • 声明组件接收哪些 props
  • 本质上在声明输入边界

defineEmits

  • 声明组件会发出哪些事件
  • 本质上在声明输出边界

defineModel

  • v-model 这类双向绑定入口写得更直接
  • 本质上仍然是在组织 prop 和事件约定

应该怎么理解它们和运行时逻辑的区别

  • 它们不是普通业务函数
  • 不应该把它们理解成随时可调用的工具方法
  • 更应该把它们看成组件接口的一部分声明语法

常见误区

  • 以为这些宏和普通 Composition API 函数完全一样
  • 只会背写法,不理解它们对应的组件边界
  • defineModel 理解成全新的双向绑定机制,而不是对既有约定的更直接表达

最短记忆方式

defineProps 管输入,defineEmits 管输出,defineModel 管双向绑定入口。

面试要点

来自 vue-script-setup-macros-interview-question 的面试视角整理。

一句话回答

definePropsdefineEmitsdefineModel 都是 script setup 下的编译期宏,用来声明组件输入、输出和双向绑定入口;它们看起来像函数,但更接近组件边界的声明语法。

最稳的回答主线

  • 先说共同点:都是 script setup
  • 再说职责分工:props 是输入,emits 是输出,model 是双向绑定入口
  • 再说本质:它们不是普通业务函数,而是组件接口声明
  • 最后补一句:理解边界比死记写法更重要

面试里容易加分的一句

如果只记 defineProps 怎么写,却没意识到它和 defineEmitsdefineModel 一起构成了组件对外接口,那这题通常只能答到语法层。

常见追问

  • defineModelv-model 的关系是什么
  • 为什么说这些宏不是普通运行时函数
  • 什么时候只用 props/emit,什么时候引入 model

最短记忆方式

它们不是业务函数,而是在声明组件的输入输出边界。

创建于 2026/3/19 更新于 2026/5/27