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 Composition API
代码组织 按选项分组 按逻辑分组
逻辑复用 mixin composable 函数
this 需要理解 this 无 this
TS 支持 一般 优秀
学习曲线 低 中
适合 小项目 中大型项目

并非取代

同分类其他题目