当前位置: 首页 > news >正文

setup 函数在 Vue 3 中的作用是什么?什么时候会执行

文章目录

  • 前言
    • ✅ 一、`setup()` 函数的作用是什么?
    • ✅ 二、`setup()` 什么时候执行?
    • ✅ 三、`setup()` 的参数
    • ✅ 四、`setup()` 中不能做什么?
    • ✅ 五、常见用法示例
    • ✅ 六、总结(适合背诵或面试回答)
  • `<script setup>` 是 **Vue 3.2+ 推出的语法糖**
    • ✅ 一句话总结:
    • ✅ 二、它能干什么?
    • ✅ 三、核心特性与优势
    • ✅ 四、与 `defineComponent + setup()` 对比
    • ✅ 五、defineProps 和 defineEmits 示例
    • ✅ 六、何时应该用 `<script setup>`?
    • 🧠 面试总结推荐回答


前言

setup() 函数是 Vue 3 中 Composition API 的核心入口,它在组件生命周期中扮演了非常关键的角色。


✅ 一、setup() 函数的作用是什么?

setup() 是在组件创建之前执行的一个初始化函数,用来:

功能类别作用简述
响应式状态声明创建 refreactive 等响应式变量
逻辑封装封装业务逻辑为函数(或导入 composables)
生命周期注册使用 onMountedonUnmounted 等注册生命周期逻辑
计算属性使用 computed() 定义依赖状态的衍生值
props & emit接收组件的 props,并通过 emit 触发自定义事件
返回模板绑定对象返回的数据/方法可以直接在模板 <template> 中使用

✅ 二、setup() 什么时候执行?

setup() 会在 组件初始化 时(比 created 更早)执行 一次,并且只执行一次。

执行顺序如下:

beforeCreate -> setup() -> created -> beforeMount -> mounted

⚠️ 注意:在 setup() 中不能访问 this,因为组件实例还未创建完成。


✅ 三、setup() 的参数

setup(props, context) {// props 是只读的响应式对象// context 包含三个属性:attrs、slots、emit
}
参数类型说明
props响应式传入组件的 props,不能解构(会失去响应式)
context普通对象包含 attrs(非 props)、slotsemit 等辅助项

✅ 四、setup() 中不能做什么?

  • ❌ 不能访问 this,因为组件实例还没创建。
  • ❌ 不能使用 datamethodscomputed(Options API 的写法)。
  • ❌ 不建议直接修改 props(它是只读响应式的)。

✅ 五、常见用法示例

import { defineComponent, ref, onMounted } from 'vue'export default defineComponent({props: {title: String},setup(props, { emit }) {const count = ref(0)const increment = () => {count.value++emit('update', count.value)}onMounted(() => {console.log('组件挂载', props.title)})return { count, increment }}
})

✅ 六、总结(适合背诵或面试回答)

setup() 是 Vue 3 中组件逻辑的统一入口,在组件创建前执行,用于定义响应式状态、逻辑封装、生命周期注册、事件触发等,是 Composition API 的核心支点。


<script setup>Vue 3.2+ 推出的语法糖

是对 setup() 函数的简化写法,专为提高开发效率和代码可读性而设计。


✅ 一句话总结:

<script setup> 就是把 setup() 函数**“自动内联展开”,省略 defineComponent()return {} 等冗余写法,让你写的每一行代码自动在 setup 环境中执行**。


✅ 二、它能干什么?

等价于你自己手写的:

export default defineComponent({setup() {// ...return {}}
})

变成了这样👇:

<script setup>
import { ref } from 'vue'const count = ref(0)
function increment() {count.value++
}
</script><template><button @click="increment">{{ count }}</button>
</template>

✅ 三、核心特性与优势

特性说明
自动注册为 setup()所有代码都是在 setup() 中执行的,不用再写 setup() 函数
不需要 return所有声明的变量/函数,自动暴露给模板 <template> 使用
支持宏命令提供 <script setup> 独有指令:defineProps()defineEmits()
更少的样板代码不需要写 import { defineComponent }setup(), return {}
更强的类型推导更好配合 TypeScript 使用

✅ 四、与 defineComponent + setup() 对比

对比项<script setup>defineComponent + setup()
写法简洁性✅ 更简洁、无样板代码❌ 模板多
模板中变量自动暴露✅ 自动暴露,无需 return❌ 需要手动 return
TypeScript 类型推导✅ IDE 更智能✅ 支持但稍显繁琐
可读性✅ 更易读❌ 模板化程度高
灵活性(命名组件)❌ 不支持写 name 字段(需额外用 defineOptions)✅ 可以显式命名

✅ 五、defineProps 和 defineEmits 示例

<script setup lang="ts">
const props = defineProps<{ title: string }>()
const emit = defineEmits<{(e: 'update', value: number): void
}>()function click() {emit('update', 42)
}
</script>

✅ 六、何时应该用 <script setup>

场景是否推荐用 <script setup>
Vue 3 + TypeScript 项目✅ 强烈推荐
单文件组件 + 简洁逻辑✅ 更高效
组件逻辑复杂,需要分离✅ 可以拆分成 composables
需要用 JSX❌ 不支持 <script setup> JSX
迁移自 Vue 2✅ 可逐步迁移简化

🧠 面试总结推荐回答

<script setup> 是 Vue 3.2 引入的 SFC 编译器语法糖,本质上是 setup 函数的展开,去掉了样板代码、提高了开发效率,自动暴露变量给模板、支持 defineProps/Emits,特别适合 TypeScript 项目与组合式逻辑拆分。


相关文章:

  • 打成jar 包以后,运行时找不到文件路径?
  • WebRTC 服务器之SRS服务器性能优化配置
  • 在 GitLab 中部署Python定时任务
  • 私有仓库 Harbor、GitLab
  • 云计算训练营笔记day02(Linux、计算机网络、进制)
  • UE5 材质淡入淡出
  • 【工具使用-数据可视化工具】Apache Superset
  • 超表面加工流程
  • 前端知识-forwardRef
  • 区块链+数据库:技术融合下的应用革新与挑战突围
  • Kubernetes笔记(1)Kubernetes入门
  • 解锁RAG:AI 2.0时代的“知识外挂”是如何炼成的?
  • 开源之夏2025-VisActor 社区题目及参赛者选/培介绍
  • 当K8S容器没有bash时7种高阶排查手段
  • ESP32_IDF_idf.py指令详解
  • 阿里云前端Nginx部署完,用ip地址访问却总访问不到,为什么?检查安全组是否设置u为Http(80)!
  • Element-Plus-X开源程序是Vue3 + Element-Plus 开箱即用的企业级AI组件库前端的解决方案
  • 判断两个结构是否相同的一种方法
  • EasyRTC嵌入式音视频通信SDK技术,助力工业制造多场景实时监控与音视频通信
  • k8s service的类型
  • 国际上首次,地月空间卫星激光测距试验在白天成功实施
  • 这个部位最容易变老,却被很多姑娘忽视了
  • 马克思主义理论研究教学名师系列访谈|石书臣:思政课是落实立德树人的关键
  • “五一”假期出入境人数达1089.6万人次,同比增长28.7%
  • 证券时报头版:巴菲特留给投资界的珍贵启示
  • 马克思主义理论研究教学名师系列访谈|王公龙:做好马克思主义研究,既要“钻进去”又要“跳出来”