Vue3 引入 Composition API 后,组件逻辑复用和代码组织更加灵活。本文对比两种写法,并给出实际迁移策略。
逻辑复用困难:Options API 通过 mixins 复用逻辑易导致命名冲突和来源不清晰。
代码碎片化:同一功能的代码被迫分散在 data、methods、mounted 等选项中。
类型推导差:对 TypeScript 支持不够友好。
export default { data() { return { count: 0, doubled: 0 }; }, mounted() { this.doubled = this.count * 2; }, methods: { increment() { this.count++; this.doubled = this.count * 2; } } }
<script setup>)<script setup> import { ref, computed, onMounted } from 'vue' const count = ref(0) const doubled = computed(() => count.value * 2) function increment() { count.value++ } onMounted(() => { console.log('组件已挂载') }) </script>
将鼠标追踪逻辑封装成 useMouse,任意组件都可复用。
// composables/useMouse.js import { ref, onMounted, onUnmounted } from 'vue' export function useMouse() { const x = ref(0) const y = ref(0) function update(e) { x.value = e.pageX y.value = e.pageY } onMounted(() => window.addEventListener('mousemove', update)) onUnmounted(() => window.removeEventListener('mousemove', update)) return { x, y } }
新项目:优先使用 Composition API + <script setup>
旧项目:渐进式迁移,在单个组件内尝试将相关逻辑聚合成 setup() 函数,再逐步抽离为组合式函数。
不推荐:在 Options API 内部混用 setup() 返回值,除非作为过渡。