setup 在 created 之前执行,因 setup 是组件实例化前首个可介入函数,此时 this 不存在且响应式系统尚未初始化;created 则在实例创建完成、响应式数据挂载后触发。

因为 setup 是组件实例化前的第一道逻辑入口,它发生在 Vue 内部构造组件实例对象之前,而 created 是实例对象创建完成、响应式系统初步就绪后才触发的钩子。
setup 真正的执行位置:在 new VueComponent() 之前
Vue 3 初始化一个组件时,并不是先 new 出实例再执行 setup。相反,setup 是 Vue 内部创建组件实例前调用的第一个用户可介入函数。此时:
- 组件实例(this)根本不存在,无法访问 data、methods、computed 等选项式 API 的属性
- ref、reactive 等响应式 API 正是在 setup 中被调用,才触发内部 reactive system 的初始化流程
- 所有在
<script setup></script>或setup()中声明的响应式变量,都在这个阶段完成定义和依赖追踪准备
created 的本质:实例已建好,但 DOM 还没挂载
created 钩子属于 Options API 生命周期的一部分,它的触发前提是:
- Vue 已完成对组件配置对象的解析
- 已通过 new 创建了组件实例(即 this 指向可用)
- data 已转换为响应式、methods 已绑定、computed/watch 已注册完毕
- 但此时模板尚未编译,$el 为空,DOM 不可访问
换句话说,created 是 setup 执行完、响应式数据注入实例、生命周期系统接管之后,才被推入队列执行的下一个钩子。
执行顺序的实证链路
从源码行为和调试可观测的顺序是:
从零开始编排 SpringBoot+Vue 全栈项目工作流,适用于新建全栈项目或完整脚手架请求,触发后依次调用 product‑spec‑builder(需求调研)等模块。
-
<script setup></script>中的代码 → 立即执行(如const count = ref(0)) - → 触发
beforeCreate(极少使用,几乎无实际用途) - → 响应式数据挂载到实例、计算属性/侦听器初始化完成 →
created - → 模板编译、VNode 生成 →
beforeMount - → 元素插入 DOM →
mounted
你可以用 console.log 验证:在 <script setup></script> 里打印,一定早于 onBeforeCreate 和 onCreated 中的打印。
为什么这样设计?核心是解耦与提前控制权
Vue 3 把 setup 设计得最早,不是为了“抢时间”,而是为了达成三个关键目标:
- 彻底剥离 this 依赖:避免开发者误用未初始化的 this,强制用组合式 API 显式声明依赖
- 让响应式系统成为第一公民:ref/reactive 不再是“给实例加属性”,而是先构建响应式状态,再交由 Vue 管理
-
支持静态分析与 Tree-shaking:
<script setup></script>是编译时语法糖,Vue 编译器可在构建阶段提取逻辑,无需运行时代理或 this 绑定开销
这种设计让逻辑组织更接近函数式编程范式——输入(props/emits)、输出(返回值暴露给模板)、副作用(onMounted 等钩子中处理),边界清晰,不易出错。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










