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

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

1. 为什么需要 setup?

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

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

2. setup 的角色与执行时机

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

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

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

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

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

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" 实例尚未创建,this 为 undefined
"reactive 可直接替换整个对象" 重新赋值会丢失响应性
"script setup 中需要手动 return" 顶层绑定自动暴露

11. 总结

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

相关推荐
2分钟速写快排4 小时前
孔乙己的茴字有多少种写法?|AI 对话实时通信的三种实现
前端·javascript·github
Penge6666 小时前
JavaScript:BOM 详解
前端
梯度下降者6 小时前
Nuxt框架
vue.js·服务端渲染·全栈开发·混合渲染·nuxt框架
Penge6666 小时前
Vite vs Webpack:前端构建工具原理与实战
前端
Penge6666 小时前
前端包管理工具:npm、Yarn、pnpm 快速入门
前端
Penge6667 小时前
Sass 了解
前端
Penge6667 小时前
Webpack 打包从 0 到 1 实战笔记
前端
Penge6667 小时前
Webpack 入门:是什么、为什么需要、怎么使用?
前端
Penge6667 小时前
Ant Design(Antd)了解
前端
wangruofeng8 小时前
同一行代码,百种渲染:Asuka、React Native 与 Flutter 跨平台渲染机制深度拆解
前端·github