这两种是编写 Vue 组件的方式。Options API 按 选项类型(data、methods、computed)组织代码;Composition API 使用 ref、computed 和 等函数按 组织代码。
setup<script>
export default {
data() { return { count: 0 }; },
computed: { double() { return this.count * 2; } },
methods: { increment() { this.count++; } },
mounted() { console.log("mounted"); },
};
</script>
所有内容都分组到固定的分桶中(data、methods、computed、lifecycle)。简单易懂,但单个 功能 的逻辑会分散到这些分桶中。
<script setup>
import { ref, computed, onMounted } from "vue";
// all the logic for "counter" lives together
const count = ref(0);
const double = computed(() => count.value * 2);
function increment() { count.value++; }
onMounted(() => console.log("mounted"));
</script>
一个关注点的 state、computed、methods 和 lifecycle 放在一起,而 <script setup> 使其更简洁(没有 this,没有 return)。
Composition API 让你能够 提取并复用有状态逻辑 作为普通函数(composables):
// useCounter.js — reusable across any component
export function useCounter() {
const count = ref(0);
const increment = () => count.value++;
return { count, increment };
}
<script setup>
const { count, increment } = useCounter(); // reuse anywhere
</script>
这很好地解决了逻辑复用的问题,在 Options API 中这很尴尬(mixins 有命名冲突和来源不明确的问题)。
Options API → simpler mental model, fine for small components, familiar to beginners
Composition API → better for large components, TypeScript, and reusing logic (composables)
Composition API(结合 <script setup>)是新 Vue 3 项目的 推荐默认选择,特别是在使用 TypeScript 时。
Composition API 是 Vue 3 组织和复用组件逻辑的答案。
理解它按功能而非按选项类型组织代码,以及它如何支持 composables——与 Options API 基于选项的分桶形成对比——解释了现代 Vue 的风格,以及为什么复杂的组件和 TypeScript 代码库倾向于使用它。
两种 API 都得到完全支持;你甚至可以混合使用它们。