了解 Vue 中 Composition API 和 Options API 这两种核心编程范式的区别,这是掌握 Vue3 开发的关键------前者是 Vue3 主推的新范式,后者是 Vue2 的传统写法,核心差异体现在代码组织方式、逻辑复用、类型支持等方面。
一、核心定位与设计理念
| 特性 | Options API(选项式 API) | Composition API(组合式 API) |
|---|---|---|
| 设计理念 | 基于"选项划分"组织代码,按 data/methods/computed 等选项归类 |
基于"逻辑功能"组织代码,按业务逻辑拆分组合,更灵活 |
| 适配版本 | Vue2 核心,Vue3 兼容但非最优 | Vue3 主推,Vue2 需安装 @vue/composition-api 适配 |
| 核心关键词 | 选项、配置、隔离 | 组合、函数、复用 |
二、代码写法直观对比
1. 基础示例(实现"计数器"功能)
Options API 写法
vue
<template>
<div>{{ count }} <button @click="increment">+1</button></div>
</template>
<script>
export default {
// 状态:分散在不同选项中
data() {
return { count: 0 };
},
// 计算属性
computed: {
doubleCount() {
return this.count * 2;
}
},
// 方法
methods: {
increment() {
this.count++;
}
},
// 生命周期
mounted() {
console.log("计数器初始化完成");
}
};
</script>
Composition API 写法(<script setup> 语法糖)
vue
<template>
<div>{{ count }} <button @click="increment">+1</button></div>
</template>
<script setup>
import { ref, computed, onMounted } from 'vue';
// 1. 状态定义(响应式)
const count = ref(0);
// 2. 计算属性
const doubleCount = computed(() => count.value * 2);
// 3. 方法
const increment = () => {
count.value++;
};
// 4. 生命周期
onMounted(() => {
console.log("计数器初始化完成");
});
</script>
2. 核心差异解读
- 代码组织 :
- Options API:同一逻辑的代码(如计数器的状态、方法、计算属性)被拆分到
data/methods/computed等不同选项中,代码量越大,逻辑越分散("碎片化"); - Composition API:同一逻辑的代码集中在一起,比如计数器的所有相关代码都在一个代码块里,便于阅读和维护。
- Options API:同一逻辑的代码(如计数器的状态、方法、计算属性)被拆分到
- 响应式语法 :
- Options API:通过
this访问所有状态/方法,this指向组件实例,容易出现上下文混淆; - Composition API:通过
ref/reactive定义响应式数据,直接通过变量名访问,无this依赖,更贴合原生 JS 写法。
- Options API:通过
三、核心特性深度对比
1. 逻辑复用
这是两者最核心的差异之一,Composition API 彻底解决了 Options API 逻辑复用的痛点。
Options API 的逻辑复用:依赖 Mixin/extends
-
缺点:命名冲突、来源不清晰、逻辑嵌套混乱;
-
示例(Mixin 复用计数器逻辑):
javascript// mixins/counter.js export default { data() { return { count: 0 }; }, methods: { increment() { this.count++; } } }; // 组件中使用 export default { mixins: [counterMixin], // 引入Mixin mounted() { // 无法直观区分 count/increment 来自组件还是 Mixin console.log(this.count); } };
Composition API 的逻辑复用:自定义组合函数(Composables)
-
优点:逻辑封装成独立函数,命名可控、来源清晰、无冲突;
-
示例(封装计数器逻辑为组合函数):
javascript// composables/useCounter.js import { ref } from 'vue'; export function useCounter(initialValue = 0) { const count = ref(initialValue); const increment = () => count.value++; return { count, increment }; // 暴露需要的状态/方法 } // 组件中使用 <script setup> import { useCounter } from '@/composables/useCounter'; // 按需引入,命名清晰 const { count, increment } = useCounter(0); </script>
2. TypeScript 支持
-
Options API :对 TS 支持差,
this类型推导复杂,需大量手动类型声明;typescript// Options API + TS(繁琐) import { defineComponent } from 'vue'; export default defineComponent({ data() { return { count: 0 }; // 需手动声明 count 类型 }, methods: { increment(num: number) { this.count += num; // this 类型易出错 } } }); -
Composition API :天生适配 TS,类型推导自动完成,无需额外配置,写法和原生 TS 一致;
typescript// Composition API + TS(简洁) <script setup lang="ts"> import { ref } from 'vue'; const count = ref<number>(0); // 明确类型,自动推导 const increment = (num: number) => { count.value += num; // 无 this 问题,类型安全 }; </script>
3. 生命周期对应关系
Composition API 重构了生命周期钩子,更贴合"组合"理念,对应关系如下:
| Options API | Composition API(Vue3) |
|---|---|
beforeCreate |
无需(<script setup> 中代码执行时机等同于) |
created |
无需(同上) |
beforeMount |
onBeforeMount |
mounted |
onMounted |
beforeUpdate |
onBeforeUpdate |
updated |
onUpdated |
beforeUnmount |
onBeforeUnmount |
unmounted |
onUnmounted |
4. 代码体积与性能
- Options API:依赖组件实例的
this上下文,Vue 需做更多代理处理,体积稍大; - Composition API:基于函数式编程,无
this依赖,编译后代码更精简,Vue3 对其做了专门优化,性能更优。
四、适用场景
| 场景 | 推荐 API |
|---|---|
| 小型组件/快速原型 | Options API(写法简单) |
| 中大型项目/复杂逻辑 | Composition API(易维护、易复用) |
| TS 开发 | Composition API(原生支持) |
| 逻辑复用需求多 | Composition API(组合函数更优雅) |
| Vue2 老项目 | Options API(无需额外适配) |
总结
- 核心差异:Options API 按"选项"拆分代码,逻辑碎片化;Composition API 按"功能"组合代码,逻辑内聚,复用更优雅;
- 开发体验 :Composition API 无
this陷阱,TS 支持完善,是 Vue3 主推的写法; - 选型建议 :小型项目可混用 Options API,中大型项目优先用 Composition API(尤其是
<script setup>语法糖)。