本节摘要:Vue 提供 Options API 与 Composition API 两套组件逻辑写法。前者按 data/methods 分组、上手直观,后者按功能点组织、逻辑复用更顺。本节对比两者给出选型判断,并呼应 React 函数组件与 Hooks 的角色。
本节阅读目标
阅读完本节,你应当能够:
同一个"计数"组件用两套 API 各写一次。
Options API:
<script> export default { data() { return { count: 0 }; }, methods: { add() { this.count += 1; }, }, }; </script> <template><button @click="add">次数 {{ count }}</button></template>
Composition API(script setup):
<script setup> import { ref } from 'vue'; const count = ref(0); function add() { count.value += 1; } </script> <template><button @click="add">次数 {{ count }}</button></template>
Options 把所有数据放 data、方法放 methods、生命周期放各钩子,是一种"按类型归类"的组织;Composition 则把围绕一个功能点的状态、方法、副作用写在一起,是一种"按功能归类"的组织。
Options 的门槛低,结构一眼可读,方便看"这个组件有哪些数据、哪些方法",适合简单组件与新手。但一旦逻辑变多,同一个跨国流程的方法被 data/methods/watch 拆散,读起来得跨片找。Composition 允许把相关逻辑靠在一起、再抽成可复用的组合式函数,对应 5.5 节讲的复用抽象,复杂应用更顺手。
| 维度 | Options | Composition |
|---|---|---|
| 组织方式 | 按类型(data/methods) | 按功能点 |
| 上手难度 | 低,直观 | 略高,需理解组合概念 |
| 逻辑复用 | 靠 mixins(易踩雷) | 组合式函数天然可复用 |
| 适用规模 | 简单、教学 | 中大型、需强复用 |
空谈组织方式不够直观,用一个"带搜索过滤的列表"各写一遍,最能体会差别。Options 版本把所有东西按类型归拢:
<script> export default { data() { return { keyword: '', list: [], filtered: [] }; }, computed: { doFilter() { return this.list.filter((x) => x.includes(this.keyword)); }, }, methods: { load() { this.list = ['林','月','风']; } }, mounted() { this.load(); }, }; </script>
Composition 版本把同一功能点收拢在一个区域:
<script setup> import { ref, computed, onMounted } from 'vue'; const keyword = ref(''); const list = ref([]); const filtered = computed(() => list.value.filter((x) => x.includes(keyword.value))); function load() { list.value = ['林', '月', '风']; } onMounted(load); </script>
看到最后一组对应就明白了:Options 把 filtered、list、keyword 这三个围绕"搜索"的量,被按 data/computed 分到两处;Composition 则让它们全挨在一起,谁依赖谁一眼能看出。逻辑一多,这种"按功能靠拢"的价值就体现出来——你不用在文件两端来回跳着拼装一段完整的心智。

对应于 React:Options 的体感有点像比较好上手的写法,而 Composition 与 React 函数组件 + Hooks 的"把逻辑抽成可复用单元"是同类的走向。
判断时先问自己一句"这份逻辑以后要不要给别的组件用":答案是要,Composition 的组合式函数搬出来就复用;答案只是本组件内的简单改数,Options 就已足够。别为了"新一点"而选 Composition——它真正的优势只在逻辑要跨组件复用时才兑现,日常小改反而多绕一层思考成本。
无论哪套 API,背后都稳稳站着同一个响应式系统。下一节展开它:数据绑定与响应式原理,看 ref/reactive 与依赖追踪怎么让"改数据界面跟着变"落地。