哈喽大家好,我是大布布将军!
上期咱们扒完了 Vue 3 的响应式原理,我看后台有不少兄弟留言:"布布将军,原理我是懂了,但这 Composition API (组合式 API)到底好在哪?我用 Vue 2 的 Mixin 不也挺香吗?"
听到 Mixin 这个词,我手里拿着的保温杯差点没拿稳。
说实话,当年写 Vue 2 的时候,我觉得 Mixin 简直是黑科技------一段代码,到处复用,感觉自己就是代码界的"复用大师"。但随着项目越来越大,Mixin 逐渐露出了它的獠牙,变成了传说中的 "Mixin 地狱" 。
今天,咱们就来一场硬核对比,看看 Vue 3 的 Composition API 是怎么把 Mixin 按在地上摩擦的。

一、Mixin 的"三大罪状":如果你恨一个人,就让他维护 Mixin
假设你接手了一个"祖传"项目,打开一个 .vue 文件,看到了这一幕:
//
export default {
mixins: [PageMixin, AuthMixin, ScrollMixin, LogMixin], // 😱 这四个大佬里到底有什么?
data() {
return {
showModal: false
}
},
mounted() {
this.refreshPage(); // 👈 谁能告诉我,这个方法是哪个 Mixin 里的?
console.log(this.userInfo); // 👈 这个变量又是谁定义的?
}
}
这时候,你的脑瓜子是不是嗡嗡的?
罪状 1:来源不明(隐式依赖)
在上面的代码里,this.refreshPage() 可能是 PageMixin 里的,也可能是 AuthMixin 里的。如果想知道它的逻辑,你得把这 4 个 Mixin 文件全部打开找一遍。 这就好比你去吃自助餐,厨师把所有菜都倒进一个大缸里搅匀了端给你,你根本不知道嘴里这块肉是猪肉还是牛肉。
罪状 2:命名冲突(Name Clashing)
悲剧发生了:
PageMixin里有个 data 叫isLoading。ScrollMixin里也有个 data 叫isLoading。 结果: 它们会悄无声息地合并(覆盖),导致你的逻辑莫名其妙地炸掉。最可怕的是,控制台可能还不会报错,直到上线后用户投诉:"为什么我滑到底部加载更多的时候,整个页面重置了?"
罪状 3:滚雪球式的复杂度
当你为了复用逻辑,在 Mixin A 里又引用了 Mixin B,Mixin B 里又引用了 Mixin C... 恭喜你,你创造了一个逻辑黑洞。任何人都别想轻易修改里面的代码,动一行,挂一片。
✨ 二、Composition API 的"降维打击":清清白白做人
Vue 3 带来的 Composition API(配合 setup 或 <script setup>),用一种函数式的思维彻底解决了上面的问题。
我们来看看,同样的逻辑,用 Composables(组合式函数) 是怎么写的: