深入理解 Vue 3 的 setup(含 Composition API)

深入理解 Vue 3 的 setup(含 Composition API)

1. 为什么需要 setup?

Vue 2 的选项式 API(datamethodscomputed 等)在处理小规模逻辑时清晰直观,但当组件功能复杂后,同一个逻辑关注点被分散在多个选项里 (数据在 data,修改方法在 methods,副作用在 mounted),导致代码可维护性大幅下降。

Vue 3 的 Composition API 通过 setup 函数将同一个功能的所有相关代码聚合在一起 ,让逻辑内聚、复用更方便。简单来说:setup** 是组件内组合式逻辑的入口,在这里你可以用响应式 API 自由组织代码,不再被选项"分割"。**

2. setup 的角色与执行时机

setup 函数在组件实例创建之前props 解析完成后立即执行。它是组件内使用 Composition API 的唯一入口 ,在 beforeCreate 之前调用。

执行阶段 说明
1. 解析 props 组件接收的属性已可用
2. 执行 setup 组合式逻辑在此集中运行,无法访问 this
3. 完成实例创建 模板编译、渲染

速记setupbeforeCreate 之前跑,没有 this,专注于响应式数据和逻辑的组合。

3. setup 的基本写法(非语法糖)

接收两个参数:propscontext,返回一个对象暴露给模板。

javascript 复制代码
export default {
  props: { title: String },
  setup(props, { emit }) {
    function handleClick() {
      emit('update');
    }
    return { handleClick };
  }
};

4. <script setup> 语法糖(推荐)

<script setup> 是 Vue 3.2+ 提供的编译时语法糖,顶层绑定自动暴露给模板。

vue 复制代码
<script setup>
import { ref } from 'vue';
const count = ref(0);
</script>
<template>
  <p>{{ count }}</p>
</template>

普通 setup<script setup> 的工作流对比:

5. 响应式核心:ref 与 reactive

API 适用类型 访问方式 本质
ref 任意值 .value(模板中自动解包) 内部将值包装为响应式对象
reactive 对象、数组 直接属性访问 返回 Proxy 代理

关键区别ref 可持有原始值,在 <script> 中必须 .value 操作;reactive 不可重新整体赋值。

6. 生命周期钩子

setup 内不能使用 mounted 等选项式钩子,需要用带 on 前缀的函数。下面这张图展示了选项式钩子与 setup 钩子的映射关系:

具体对应关系如下表:

选项式 API setup 内钩子
beforeCreate 不需要(setup 本身就是)
created 不需要(setup 本身就是)
beforeMount onBeforeMount
mounted onMounted
beforeUpdate onBeforeUpdate
updated onUpdated
beforeUnmount onBeforeUnmount
unmounted onUnmounted

7. 组件间的通信:defineProps 与 defineEmits

<script setup> 中用编译器宏声明:

vue 复制代码
<script setup>
const props = defineProps({ title: String });
const emit = defineEmits(['update']);
</script>

8. 逻辑复用:组合函数(Composables)

javascript 复制代码
// useMouse.js
export function useMouse() {
  const x = ref(0), y = ref(0);
  const update = (e) => { x.value = e.pageX; y.value = e.pageY; };
  onMounted(() => window.addEventListener('mousemove', update));
  onUnmounted(() => window.removeEventListener('mousemove', update));
  return { x, y };
}

10. 常见误区

误区 真相
"setup 里能使用 this" 实例尚未创建,thisundefined
"reactive 可直接替换整个对象" 重新赋值会丢失响应性
"script setup 中需要手动 return" 顶层绑定自动暴露

11. 总结

setup 是 Vue 3 Composition API 的入口,它将相关逻辑聚合在一起,突破了选项式 API 的碎片化困境。通过 refreactive 创建响应式数据,配合生命周期钩子与 watchEffect,你可以用更函数式的方式构建组件。掌握 setup,你就掌握了 Vue 3 高效开发的核心:按功能组织代码,而不是按选项类型

相关推荐
Front思22 分钟前
AI前端工程师需要具备能力+
前端·人工智能·ai
ZC跨境爬虫2 小时前
跟着 MDN 学CSS day_29:(掌握文本与字体样式的核心艺术)
前端·css·ui·html·tensorflow
李子琪。3 小时前
网络空间安全深度实战:CSRF 漏洞原理剖析与基于 Token 的纵深防御体系构建(全栈实验报告)
前端·安全·csrf
冰暮流星3 小时前
javascript之history对象介绍
前端·笔记
IT_陈寒4 小时前
Vite热更新失灵?你可能漏了这个配置
前端·人工智能·后端
丷丩4 小时前
MapLibre GL JS第19课:实时更新要素
前端·javascript·gis·map·mapbox·maplibre gl js
Mr.Daozhi4 小时前
RAG 进阶实战:跑通 Demo 后我连续翻了 6 次车,逐一修复才真正可用(含 Gradio Web 版)
前端·数据库·langchain·大模型·gradio·rag·科研工具
哆来A梦没有口袋4 小时前
干货精讲 | 初级CSS面试高频考题
前端·css·面试
掘金014 小时前
EmbedPDF Vue 版 完整正文文档 全网首发
前端
OpenTiny社区4 小时前
操作ArkTS页面跳转及路由相关心得
前端·typescript·web·opentiny