首頁  >  文章  >  web前端  >  淺談Vue.use到底是什麼?

淺談Vue.use到底是什麼?

青灯夜游
青灯夜游轉載
2020-10-26 17:50:152890瀏覽

淺談Vue.use到底是什麼?

Vue.use到底是什麼鬼、下面這篇文章就來跟大家介紹一下Vue.use。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

我們在使用Vue做專案開發的時候,看到不少輪子都是透過Vue.use來進行使用,感覺甚是高大上。

不過Vue.use到底是什麼鬼?不妨來看個究竟。

其實這些輪子都可以稱之為插件,它的功能範圍沒有嚴格的限制,一般包含以下幾種:

    ##新增全域方法或屬性。如:
  1. vue-custom-element
  2. 新增全域資源:指令/過濾器/過渡/元件等。如
  3. vue-touch
  4. 透過全域混入來新增一些元件選項。如
  5. vue-router
  6. 新增
  7. Vue 實例方法,透過將它們加入 Vue.prototype 上實作。
  8. 一個函式庫,提供自己的 API,同時提供上述的一個或多個功能。如
  9. vue-router
無論大小,外掛程式要實現的功能無非就是上述這幾種。但是,這並不妨礙我們創造出複雜的插件,不過我們還是希望給用戶一個簡單的使用方法,他不需要關注插件內部做了些什麼。固Vue提供了use方法,專門在

new Vue()之前使用外掛程式。

不管是官方提供的外掛(例如

vue-routervuex),或是第三方的外掛程式(例如ElementUIant)都是採用了此方式,不外乎外掛內部的功能不同而已。當然,還有其他許多此類插件,awesome-vue 就集合了大量由社群貢獻的插件和函式庫。

接下來,我們就來看下這個神秘的

use方法是如何實現的。

Vue.js 的外掛程式應該要揭露一個 install 方法。這個方法的第一個參數是Vue 建構器,第二個參數是一個可選的選項對象,用來傳入插件的配置:

MyPlugin.install = function (Vue, options) {
  // 1. 添加全局方法或属性
  Vue.myGlobalMethod = function () {
    // 逻辑...
  }
  // 2. 添加全局资源
  Vue.directive('my-directive', {
    bind (el, binding, vnode, oldVnode) {
      // 逻辑...
    }
    ...
  })
  // 3. 注入组件选项
  Vue.mixin({
    created: function () {
      // 逻辑...
    }
    ...
  })
  // 4. 添加实例方法
  Vue.prototype.$myMethod = function (methodOptions) {
    // 逻辑...
  }
  // 5. 注册全局组件
  Vue.component('myButton',{
    // ...组件选项
  })
}
Vue.use(MyPlugin,{
  // ...options
})

一個插件內部大概就是如上所示,其實也不外乎上述那幾種東西,甚是簡單。接下來我們就來看下真實的案例

ElementUI:

const components = [ Pagination, Dialog, Autocomplete/* 此处由于篇幅省略若干个组件 */];
const install = function(Vue, opts = {}) {
  locale.use(opts.locale);
  locale.i18n(opts.i18n);
  // 注册全局组件
  components.forEach(component => {
    Vue.component(component.name, component);
  });
  Vue.use(InfiniteScroll);
  Vue.use(Loading.directive);
  // 添加实例方法
  Vue.prototype.$ELEMENT = {
    size: opts.size || '',
    zIndex: opts.zIndex || 2000
  };
  // 添加实例方法
  Vue.prototype.$loading = Loading.service;
  Vue.prototype.$msgbox = MessageBox;
  Vue.prototype.$alert = MessageBox.alert;
  Vue.prototype.$confirm = MessageBox.confirm;
  Vue.prototype.$prompt = MessageBox.prompt;
  Vue.prototype.$notify = Notification;
  Vue.prototype.$message = Message;
};
/* istanbul ignore if */
if (typeof window !== 'undefined' && window.Vue) {
  install(window.Vue);
}
export default {
  version: '2.13.0',
  locale: locale.use,
  i18n: locale.i18n,
  install,
  CollapseTransition,
  Loading,
  Pagination,
  Dialog,
  Autocomplete,
  // ...other components
};

我們不難發現,其實自己來實作一個外掛也是超級簡單,只要對外暴露一個

install方法即可,使用Vue.use的時候,會呼叫這個方法。所以我們只要將要實現的內容放到install內部即可。這樣的好處就是外掛程式需要一開始呼叫的方法都封裝在install裡面,更加精簡和可拓展性更高。

大家可能也注意到,這裡的

install其實是將所有的元件全部引入了。作為一個龐大的插件庫,這樣可能會有一些效能問題。用過的ElementUI的同學都知道,它是支援按需引入的,其實在上面的範例中也可以發現一些蛛絲馬跡。

const components = [ Pagination, Dialog, Autocomplete/* 此处由于篇幅省略若干个组件 */];
// ....省去中间内容
export default {
  version: '2.13.0',
  locale: locale.use,
  i18n: locale.i18n,
  install,
  CollapseTransition,
  Loading,
  Pagination,
  Dialog,
  Autocomplete,
  // ...other components
};

這裡將每個組件都單獨都導出了,而在每個組件內部,也類似的暴露了

install來組件每個組件,這樣就可以單獨 Vue.use每個元件,從而實現按需引入的目的。

import Alert from './src/main';
/* istanbul ignore next */
Alert.install = function(Vue) {
  Vue.component(Alert.name, Alert);
};
export default Alert;

除了上述內容之外,還有幾點值得我們注意一下:

    外掛程式傳入的如果是一個對象,則執行其
  • install方法,如果是函數,則執行它自身,並bind thisnull,然後傳入額外的參數
  • if (typeof plugin.install === 'function') {
      plugin.install.apply(plugin, args);
    } else if (typeof plugin === 'function') {
      plugin.apply(null, args);
    }
    如果外掛程式沒有被註冊過,那麼註冊成功之後會為外掛程式增加一個
  • installed的屬性,其值為trueVue.use方法內部會偵測外掛程式的installed屬性,以避免重複註冊外掛程式

Vue.use其實並不神秘,內部還是我們平常使用的這些東西,僅僅只是給他們套上了一層高端的外衣而已。我們在開發中,也可以嘗試使用這種方式,不僅簡單,而且有逼格。

相關推薦:


2020年前端vue面試題大匯總(附答案)

vue教程推薦:2020最新的5個vue.js影片教學精選

更多程式相關知識,請造訪:

程式設計入門! !

以上是淺談Vue.use到底是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:bwrong。如有侵權,請聯絡admin@php.cn刪除