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

0 阅读3分钟

深入理解 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,返回一个对象暴露给模板。

export default {
  props: { title: String },
  setup(props, { emit }) {
    function handleClick() {
      emit('update');
    }
    return { handleClick };
  }
};

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

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

<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 钩子的映射关系:

具体对应关系如下表:

选项式 APIsetup 内钩子
beforeCreate不需要(setup 本身就是)
created不需要(setup 本身就是)
beforeMountonBeforeMount
mountedonMounted
beforeUpdateonBeforeUpdate
updatedonUpdated
beforeUnmountonBeforeUnmount
unmountedonUnmounted

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

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

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

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

// 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 高效开发的核心:按功能组织代码,而不是按选项类型