自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Vue 3:全局 API 被取消了?

開發(fā) 前端
Vue 的 2.x 版本有很多的全局 API 和 配置,他們會(huì)在全局范圍內(nèi)改變 Vue 的行為。

Vue 的 2.x 版本有很多的全局 API 和 配置,他們會(huì)在全局范圍內(nèi)改變 Vue 的行為。

  • 比如常見的全局 API 有:Vue.component / Vue.mixin / Vue.extend / Vue.nextTick;
  • 常見的全局配置有:Vue.config.silent / Vue.config.devtools / Vue.config.productionTip

比如(官方例子),如果你想創(chuàng)建一個(gè)全局的組件,你會(huì)用到 Vue.component:

 

  1. Vue.component('trump-sucks', { 
  2.   data: () => ({ position: 'America president', }), 
  3.   template: `<h1>Trump is the worst ${position}</h1>`; 
  4. }); 

或者聲明一個(gè)全局指令:

  1. Vue.directive('focus', { 
  2.   inserted: el => { 
  3.     console.log('聚焦!'); 
  4.     el.focus(); 
  5.   }, 
  6. }); 

這樣確實(shí)比較方便,但是會(huì)造成一些問題。首先要明確的一點(diǎn)是,Vue 2.x 在設(shè)計(jì)上并沒有 app(應(yīng)用)的概念。開發(fā)者在使用 Vue 2.x 是所謂的 app 不過是一個(gè)用 new Vue()創(chuàng)建的 Vue 實(shí)例罷了(呵,不過如此)。由同一個(gè) Vue 構(gòu)造函數(shù)創(chuàng)建的 Vue 實(shí)例都會(huì)共享來自構(gòu)造函數(shù)的全局配置。這將會(huì)導(dǎo)致:

在測(cè)試過程中,由于全局配置的存在,測(cè)試用例很容易就會(huì)被“污染”。開發(fā)者需要小心翼翼地將全局配置找一個(gè)地方存下來,在每次測(cè)試結(jié)束后將其還原,比如 Vue.config.errorHandler;一些 API 比如 Vue.use 和 Vue.mixin 甚至沒有避免其影響的辦法。這使得在測(cè)試中一旦涉及了插件,整個(gè)過程都會(huì)變得非常棘手。事實(shí)上,為了解決這個(gè)問題,vue-test-utils 不得不引入一個(gè)特殊的 API:createLocalVue:

  1. import { createLocalVue, mount } from '@vue/test-utls'
  2. const localVue = createLocalVue(); 
  3. localVue.use(MyPlugin); 
  4. mount(Component, { localVue }); 

還有一個(gè)避免不了的問題是,一旦頁(yè)面上有多個(gè) Vue 實(shí)例時(shí),它們的全局配置就很自然地共享了,但在很多時(shí)候開發(fā)者并不想要這樣的結(jié)果

  1. Vue.mixin({ 
  2.   mounted: () => { 
  3.     console.log('wubba lubba dub dub'); 
  4.   }, 
  5. }); 
  6.  
  7. const rick = new Vue({ el: '#rick' }); 
  8. const morty = new Vue({ el: '#morty' }); 

因此,為了規(guī)避這些問題,Vue 3 引入了應(yīng)用實(shí)例的概念。

全局 API: createApp

調(diào)用 createApp 會(huì)返回一個(gè) 應(yīng)用實(shí)例,沒錯(cuò),應(yīng)用實(shí)例這個(gè)概念是 Vue 3 中新引入的。

  1. import { createApp } from 'vue'
  2. const app = createApp(); 

應(yīng)用實(shí)例會(huì)暴露一個(gè)當(dāng)前全局 API 的子集。在這個(gè)重構(gòu)工作中,Vue 團(tuán)隊(duì)秉承的經(jīng)驗(yàn)法則是:任何會(huì)在全局范圍內(nèi)影響 Vue 行為的 API 都會(huì)被遷移至應(yīng)用實(shí)例中去。

2.x 的全局 API 3.x 的應(yīng)用實(shí)例 API Vue.config app.config Vue.config.productionTip 移除 Vue.config.ignoredElements app.config.isCustomElement Vue.component app.component Vue.directive app.directive Vue.mixin app.mixin Vue.use app.use

其他不會(huì)在全局影響 Vue 行為的 api 都已改造為具名導(dǎo)出的構(gòu)建方式(named exports),就像之前尤雨溪尤大在直播里說的那樣:為了支持 TreeShaking。

 

[[334669]]

掛載一個(gè)應(yīng)用實(shí)例

在使用 createApp(VueInstance) 得到一個(gè)應(yīng)用實(shí)例后,這個(gè)應(yīng)用實(shí)例就可以用來把整個(gè) Vue 跟實(shí)例掛載到頁(yè)面上了:

  1. import { createApp } from 'vue'
  2. import MyApp from './MyApp.vue'
  3.  
  4. const app = createApp(MyApp); 
  5. app.mount('#app'); 

在完成了這些改造之后,開篇我們提到的那些例子將會(huì)重寫成這樣:

 

  1. app.component('trump-sucks', { 
  2.   data: () => ({ position: 'America president', }), 
  3.   template: `<h1>Trump is the worst ${position}</h1>`; 
  4. }); 
  5.  
  6. app.directive('focus', { 
  7.   inserted: el => { 
  8.     console.log('聚焦!'); 
  9.     el.focus(); 
  10.   }, 
  11. }); 
  12.  
  13. // 至此,所有在 app 所包含的組件樹內(nèi)創(chuàng)建的 Vue 實(shí)例才會(huì)共享 trump-sucks 這個(gè)組件和 focus 這個(gè)指令,而 Vue 構(gòu)造函數(shù)并沒有被污染。 

多個(gè)應(yīng)用實(shí)例的配置共享

上文提到的“不是所有開發(fā)者都想要的全局配置共享”,在 Vue 3 中可以通過工廠函數(shù)的方式實(shí)現(xiàn):

  1. import { createApp } from 'vue'
  2. import CaiXuKun from './CXK.vue'
  3. import WuYiFan from './WYF.vue'
  4.  
  5. const createIdolApp = (IdolInstance) => { 
  6.  const idolApp = createApp(IdolInstance); 
  7.   idolApp.directive('sing-and-dance', { 
  8.    inserted: () => { 
  9.       console.log('I am cool!'); 
  10.     }, 
  11.   }); 
  12.  
  13. createIdolApp(CaiXuKun).mount('#caixukun'); 
  14. createIdolApp(WuYiFan).mount('#wuyifan'); 

這樣就能實(shí)現(xiàn)多個(gè)應(yīng)用實(shí)例的配置共享了:蔡徐坤和吳亦凡都有了一個(gè)叫做“唱跳”的 Vue 自定義指令。

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2021-07-29 12:05:18

Vue3Api前端

2020-09-19 21:15:26

Composition

2019-08-12 16:31:56

5G網(wǎng)絡(luò)運(yùn)營(yíng)商

2021-12-16 08:27:54

Vue3 插件Vue應(yīng)用

2020-10-20 09:51:51

Vue 3 的組合

2020-10-20 09:30:13

Vue 3 API 數(shù)據(jù)

2025-03-26 10:29:22

Vue3前端API

2021-06-01 05:22:18

Windows操作系統(tǒng)微軟

2024-03-01 11:32:22

Vue3APIVue.js

2020-06-12 10:12:07

蘋果 iOS微信

2022-07-13 10:07:31

vue3組件監(jiān)聽器

2022-06-13 08:39:21

Vue3API

2021-05-06 07:40:56

Vue3 Vue2 組件

2024-06-20 13:50:53

Vue 3API開發(fā)

2024-01-04 08:38:21

Vue3API慎用

2019-08-06 08:47:18

運(yùn)營(yíng)商流量套餐4G服務(wù)

2025-04-03 09:00:00

狀態(tài)同步架構(gòu)開發(fā)

2009-12-18 10:30:55

Fedora Core

2009-02-02 13:01:00

雅虎裁員

2021-07-01 14:52:17

Windows 11操作系統(tǒng)微軟
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)