setup、script setup 和编译宏是什么关系?
先理解原理和示例,再练习完整口述与追问。
回答要点
setup 是组合式 API 的入口;script setup 是单文件组件的编译时语法简化,顶层绑定可供模板使用。defineProps、defineEmits、defineExpose 等是编译器宏,不是通用运行时函数。
原理拆解
setup 是组件初始化时执行的组合式入口,早于通常依赖 this 的 Options 访问方式;script setup 是编译期语法糖,顶层声明会按组件实例的 setup 逻辑组织,并使模板可直接引用。defineProps、defineEmits、defineExpose 等编译宏会被编译器识别,不是需要在浏览器运行时普通调用并产生所有行为的函数。
示例与推演
<script setup>
import { ref } from 'vue'
const props = defineProps({ title: String })
const emit = defineEmits(['save'])
const draft = ref('')
function save() { emit('save', draft.value) }
defineExpose({ save })
</script>
该片段展示 Vue3 写法;父级想通过模板 ref 调用 save,需要显式暴露,不能假设子所有顶层变量都公开。
易错点
编译宏的参数提升、可用类型和响应式 props 解构受版本约束。setup 中没有组件 this;也不能因为脚本顶层看起来简单就忘记 SSR 不存在 document。
参考回答可直接练习口述
setup 在创建组件时运行,用来组织组合式逻辑,没有常规组件实例 this。script setup 是单文件组件编译语法,编译器把顶层声明连接到模板,并转换 defineProps、defineEmits 等宏。宏不是运行时任意调用的工具函数;有些参数会被提升处理,不能引用只能在 setup 内部获得的局部值。
面试官可能继续问追问与完整解答展开收起
追问
setup 能访问组件 this 吗?为什么不能把宏随意放入普通工具文件或条件分支?
追问回答
setup 中不能用 this 访问 Options API 的 data 或 methods;需要的依赖用参数、注入或组合式 API 取得。编译宏必须位于编译器支持的单文件组件位置,移到普通 JS 模块或任意条件函数内不会得到同样的编译转换。