Vue3 Composition API 和 Options API 的区别?为什么要有 Composition API?
Options API(选项式)
<script>
export default {
data() {
return { count: 0, name: '' }
},
computed: {
double() { return this.count * 2 }
},
methods: {
increment() { this.count++ }
},
mounted() {
console.log('mounted')
}
}
</script>Composition API(组合式)
<script setup>
import { ref, computed, onMounted } from 'vue'
const count = ref(0)
const name = ref('')
const double = computed(() => count.value * 2)
function increment() {
count.value++
}
onMounted(() => {
console.log('mounted')
})
</script>为什么需要 Composition API
1. 逻辑复用更灵活
// 自定义 Hook(composable)
function useCounter(initial = 0) {
const count = ref(initial)
const increment = () => count.value++
const decrement = () => count.value--
return { count, increment, decrement }
}
// 任何组件中使用
const { count, increment } = useCounter(10)Options API 的复用靠 mixin,有命名冲突、来源不清晰的问题。
2. 逻辑组织更好
Options API 中相关逻辑分散在 data、methods、computed、watch 中:
// 搜索功能分散在各处
export default {
data() { return { keyword: '', results: [] } },
computed() { return { filtered() { /*...*/ } } },
methods: { search() { /*...*/ } },
watch: { keyword() { /*...*/ } }
}Composition API 可以将相关逻辑放在一起:
function useSearch() {
const keyword = ref('')
const results = ref([])
const filtered = computed(...)
const search = () => {...}
watch(keyword, search)
return { keyword, results, filtered, search }
}3. 更好的 TypeScript 支持
- Options API 的
this类型推断复杂 - Composition API 天然友好,类型推断更准确
对比
| 特性 | Options API | Composition API |
|---|---|---|
| 代码组织 | 按选项分组 | 按逻辑分组 |
| 逻辑复用 | mixin | composable 函数 |
| this | 需要理解 this | 无 this |
| TS 支持 | 一般 | 优秀 |
| 学习曲线 | 低 | 中 |
| 适合 | 小项目 | 中大型项目 |
并非取代
- Vue3 仍然支持 Options API
- 可以混用
<script setup>是 Composition API 的编译宏语法糖,推荐使用