外观
组合式 API 和选项式 API 差在哪?
选项式按选项种类拆开代码,组合式按功能把状态、计算和请求放在一起。组合式更好复用一段有状态的逻辑,也更适合 TypeScript 推断。小组件用选项式仍然清楚。
原理
vue
<script setup>
const count = ref(0)
const doubled = computed(() => count.value * 2)
function add() {
count.value += 1
}
</script>ref、computed、watch 在 setup 里调用,遵守和 React Hooks 类似的规则:写在顶层,不要写进条件。自定义函数以 use 开头,里面可以调用这些 API。每次调用 useXxx 都有自己的状态,不是单例,除非它去读写模块级变量。
选项式的 mixin 按选项合并,同名方法谁覆盖谁不直观,数据从哪个 mixin 来也不明显。组合函数把依赖写在参数里,返回值明确。
<script setup> 里的顶层绑定会暴露给模板,不用再 return。defineProps 和 defineEmits 是编译宏,不是运行时才存在的函数。
追问
组合函数和 React Hook 一样吗?
都是在设置阶段调用、不能放进条件。Vue 的响应式在读取时收集依赖,computed 会跟踪里面读到的 ref。React 的 useMemo 要自己写依赖数组。不要把闭包过期那套原样套到 Vue 上。
什么时候仍用选项式?
组件只有几行状态和方法,团队也更熟选项式。复杂页、要复用的请求和订阅,用组合式。
易错点
- 在事件回调里才调用
useXxx或computed。要写在setup的顶层。 - 组合函数把状态存在模块作用域,所有组件共享同一份,通常不是你要的。
- 既
return又在<script setup>里重复声明,两套脚本叠在一起。