setup是Vue 3组件逻辑的真正起点,执行时机早于beforeCreate,用于初始化响应式数据、注册生命周期钩子,并为实例构造做准备;此时this为undefined,props已解析但data/methods尚未创建。

setup 是 Vue 3 组件逻辑的真正起点,它不是“生命周期钩子”,而是一个在组件实例化之前就被调用的函数。它的执行时机比 beforeCreate 还早,这是 Vue 3 响应式系统设计决定的——所有响应式能力(ref、reactive、computed 等)都依赖 setup 的提前介入才能初始化。
setup 为什么必须在 beforeCreate 之前?
因为 Vue 内部需要先运行 setup,才能完成以下关键准备:
- 解析并创建响应式数据(如 ref(0) 触发 reactive system 初始化)
- 收集依赖、建立追踪关系,为后续渲染和更新打基础
- 把 setup 返回的变量/方法注入到组件实例上下文中
- 只有这些做完,Vue 才能继续走完实例构造流程,然后触发 beforeCreate
setup 和 beforeCreate/created 的实际关系
在 Vue 2 中,beforeCreate 和 created 是两个分离的钩子;Vue 3 把它们的职责合并进了 setup:
- beforeCreate 对应 setup 开始处:props 已解析,但 this 不存在,data/methods 尚未定义
- created 对应 setup 执行完毕后:响应式数据已挂载到实例,计算属性、侦听器已注册,但 DOM 还没生成
所以你不会在 setup 里访问 this,也不能直接调用 methods 或读取 data —— 它们还没被创建出来。
怎么验证这个顺序?
最直观的方式是加 console.log:
- <script setup> 里的顶层代码(如 const count = ref(0))最先执行</script>
- 接着是 onBeforeCreate(如果用了 Options API)或 beforeCreate 钩子
- 然后是 onCreated 或 created
你会发现 setup 里的打印一定出现在 beforeCreate 之前,哪怕只差几毫秒,顺序也严格固定。
这个设计带来的影响
理解 setup 的超前性,能帮你避开常见错误:
- 不能在 setup 里访问 this、$data、$methods 等实例属性
- 异步请求可以发起,但响应处理要谨慎——数据可能在 mounted 前就赋值完成
- 生命周期钩子(如 onMounted)必须在 setup 内同步注册,否则不生效


















