【Vue3】Composition API vs Options API —— 什么场景该选哪个

一句话结论

小页面用 Options,大逻辑用 Composition。

不是什么 "Composition 取代 Options",两个都是 Vue 官方一等公民,选对场景比选对 API 重要。


Options API --- 房间分区清晰

每个功能都有固定格子:datamethodscomputedwatch

vue 复制代码
<script>
export default {
  data() {
    return { count: 0 }
  },
  methods: {
    increment() { this.count++ }
  },
  computed: {
    doubled() { return this.count * 2 }
  }
}
</script>

🚀 适合:

  • 简单页面(表单、弹窗、展示卡片)
  • 新人上手、团队习惯 Options
  • 组件逻辑 < 100 行

⚠️ 痛点:

一个功能横跨 data / methods / computed 三个格子,复杂组件里改一个功能要上下翻 5 次。


Composition API --- 按逻辑聚合

逻辑相关的代码堆在一起,想拆就拆。

vue 复制代码
<script setup>
import { ref, computed } from 'vue'

const count = ref(0)
const increment = () => count.value++
const doubled = computed(() => count.value * 2)
</script>

🚀 适合:

  • 复杂组件(500+ 行)
  • 多组件复用相同逻辑(鼠标跟踪、表单校验、请求状态)
  • TypeScript 项目(类型推断天然友好)

💡 面试加分玩法 --- 逻辑抽离:

ts 复制代码
// useMouseTracker.ts
import { ref, onMounted, onUnmounted } from 'vue'

export function useMouseTracker() {
  const x = ref(0)
  const y = ref(0)

  function update(e: MouseEvent) {
    x.value = e.clientX
    y.value = e.clientY
  }

  onMounted(() => window.addEventListener('mousemove', update))
  onUnmounted(() => window.removeEventListener('mousemove', update))

  return { x, y }
}
vue 复制代码
<!-- 使用 -->
<script setup>
import { useMouseTracker } from './useMouseTracker'
const { x, y } = useMouseTracker()
</script>

什么时候选哪个?一张表说清楚

场景 推荐 原因
简单表单/弹窗 Options 搭得快,不用动脑子
200+ 行的中型组件 都行 看团队习惯,别纠结
500+ 行大型组件 Composition 逻辑混在一起改不动了
跨组件复用逻辑 Composition useXxx() 天然可复用
TS 重度项目 Composition 类型推导不用写接口
新人有 Options 基础 Options 别为炫技增加学习成本
新上手的 Vue 新项目 Composition 现在是 Vue 主推方向

个人实战经验: 我的策略是"混用不混写"。一个组件里两个 API 可以并存 ------ 简单部分用 Options,复杂逻辑用 setup()。Composition 不是必须全盘抛弃 Options。

相关推荐
Asize1 小时前
AI 协作开发新范式:我用 SDD 做了个排版 npm 包
前端·人工智能
kyriewen2 小时前
我把今年流传的前端 AI 面试题整理了一遍——4 类场景题+回答框架(附速查表)
前端·面试·程序员
计算机魔术师3 小时前
国产多模态模型正面硬刚Opus旗舰:差距从30%缩到3%
前端
风骏时光牛马3 小时前
程序员进阶:深度思考,解锁职场成长的底层逻辑
前端
IT_陈寒3 小时前
用了Proxy才发现以前的JavaScript白写了
前端·人工智能·后端
爱丶不疚4 小时前
Eval: Agent 说的 Eval 是什么?从单测、TDD 到 Sentry 聊起
前端·ai编程·vibecoding
求道於盲4 小时前
python中的类型标注
前端
计算机魔术师4 小时前
从硅谷测试到全球铺开,ChatGPT广告的10亿美元秘密
前端
专业抄代码选手5 小时前
08|Fiber 上的 `useState`:状态终于属于具体组件
前端·javascript·react.js
默_笙5 小时前
😭 Vibe Coding 翻车实录:AI 编程为什么必须先写"剧本"
前端·javascript