第一章:忆往昔峥嵘岁月稠——Vue 2 的 “this.$http” 黄金时代
还记得在 Vue 2 的美好旧时光吗?那时候,我们想用一个库,比如今天的主角——那个号称“基于 Promise 的、贼好用的 HTTP 客户端” Axios,是怎么做的?
简单得令人发指!在 main.js 里,我们通常是这么“骚操作”的:
// Vue 2 经典操作 main.js
import Vue from 'vue'
import App from './App.vue'
import axios from 'axios'
// 骚操作来了!挂在 Vue 的原型上
Vue.prototype.$http = axios
new Vue({
render: h => h(App),
}).$mount('#app')
就这么一行 Vue.prototype.$http = axios,我们就完成了一次伟大的“全局注册”。从此以后,在整个 Vue 帝国的任何角落,无论是京城(根组件)还是偏远山村(深层子组件),你都可以通过 this.$http 呼风唤雨,发起任何 HTTP 请求。
<!-- 在任何 Vue 2 组件中 -->
<script>
export default {
methods: {
async fetchUserData() {
// 看,多么自然,多么顺手!
const response = await this.$http.get('/api/user/123');
this.user = response.data;
}
}
}
</script>
这感觉,就像你给你家所有的门都配了同一把万能钥匙,去哪儿都畅通无阻。this 就是那把钥匙,$http 就是门上那个唯一的锁眼。
但是!(凡事就怕个但是)
Vue 3 驾着七彩祥云来了,它对着 this 说:“你,已经不是从前那个少年了。”
第二章:时代的眼泪——Vue 3 为何要对 “Vue.prototype” 下手?
Vue 3 引入了一个革命性的东西——Composition API 和 setup 函数。这玩意儿好是好,但它有一个“致命”的特点:在 setup 函数内部,你访问不到 this!
对,你没听错,在 setup 里,this 的值是 undefined。
为什么?因为 Vue 3 的设计思想是“逻辑复用”和“更好的 TypeScript 集成”。setup 在组件实例被完全创建之前就执行了,此时的 this 还没指向当前组件实例。如果把逻辑都挂在 this 上,那在 setup 里就彻底歇菜了,这不符合 Vue 3 的“人设”。
所以,那个我们曾经无比依赖的 Vue.prototype,在 Vue 3 的 setup 世界里,直接“失业”了。
那么问题来了:Axios 这位老员工,我们该如何安置?难道要在每个组件里 import axios from 'axios' 吗?那也太不“Vue”了,代码冗余,而且配置起来麻烦死。
别急,Vue 3 官方早就给我们准备好了两套新的“安置方案”,一套是“精准投放”,另一套是“全局广播”。

最低0.47元/天 解锁文章
6088

被折叠的 条评论
为什么被折叠?



