解析Vue.use()是干什么的
start
- 前幾天使用了一個(gè)別人封裝的電子簽名組件:vueEsign。
- 在初始化的時(shí)候有這么一行代碼:
Vue.use(vueEsign)
- 之前使用element-ui,也需要使用
Vue.use()
- 這行代碼到底是什么?學(xué)習(xí)一下。
本文所有演示內(nèi)容,vue.js版本為2.6.14
1. Vue.use是什么,了解一下!?
1.1 main.js中的Vue.use()
import Vue from 'vue' import App from './App.vue' import router from './router' import vueEsign from 'vue-esign' Vue.use(vueEsign) Vue.config.productionTip = false new Vue({ router, render: h => h(App) }).$mount('#app')
1.2 簡(jiǎn)單解釋一下這里的import的邏輯,
- 如果
from
后面是路徑,直接沿路徑去尋找對(duì)應(yīng)文件。 - 如果
from
后面是一個(gè)名稱,那就引入是第三方模塊,會(huì)去node_modules
中尋找對(duì)應(yīng)名稱的文件夾。
node_modules
》 package.json
》 main屬性
1.3 Vue.use()代碼
找到對(duì)應(yīng)文件
對(duì)應(yīng)代碼
function initUse (Vue) { // 1. Vue.use是一個(gè)函數(shù) Vue.use = function (plugin) { // 2. 定義一個(gè)數(shù)組 如果this._installedPlugin不存在,會(huì)執(zhí)行`this._installedPlugins = [] var installedPlugins = (this._installedPlugins || (this._installedPlugins = [])); // 3. 判斷是否已經(jīng)注冊(cè)了,已經(jīng)注冊(cè)了直接return if (installedPlugins.indexOf(plugin) > -1) { return this } // 4.獲取其他參數(shù) 例如: Vue.use(plugin,a,b,c) 中的 a b c var args = toArray(arguments, 1); // 5.參數(shù)第一項(xiàng),加一個(gè)Vue實(shí)例進(jìn)去 args.unshift(this); // 6. plugin 有 install 這個(gè)方法 if (typeof plugin.install === 'function') { // 7. 執(zhí)行一下install,再把參數(shù)傳遞進(jìn)去 (可以看插件的install方法,接受第一個(gè)參數(shù),就是Vue實(shí)例) plugin.install.apply(plugin, args); } else if (typeof plugin === 'function') { // 8. 如果plugin 本身就是函數(shù) 直接執(zhí)行 plugin.apply(null, args); } // 9. 來(lái)一個(gè)數(shù)組存儲(chǔ)已經(jīng)注冊(cè)的插件 installedPlugins.push(plugin); return this }; }
2. 看一下 vueEsign 插件的install是什么?
node_modules\vue-esign\src\idnex.js
// 1. 引入一個(gè)vue組件,實(shí)際上就是一個(gè)對(duì)象 import vueEsign from './index.vue' // 2.對(duì)象install屬性是一個(gè)方法,它接受一個(gè)參數(shù) Vue vueEsign.install = function (Vue) { // 3. 判斷是否已經(jīng)安裝了這個(gè)插件(這里this指向?yàn)関ueEsign,在Vue.use中用apply改寫(xiě)的) if (this.installed) { return } this.installed = true // 4. 在Vue上注冊(cè)一下組件 Vue.component('vueEsign', vueEsign) } export default vueEsign
3.看一下 element-ui的install是什么?
node_modules\element-ui\src\index.js
// 1. 它也是一個(gè)函數(shù) const install = function(Vue, opts = {}) { // 2.讀取了部分其他本地化配置 locale.use(opts.locale); locale.i18n(opts.i18n); // 3.components就是element-ui的組件組成的數(shù)組,遍歷一下,在Vue上注冊(cè)了這些組件。 // (!!可以發(fā)現(xiàn)這里和另一個(gè)插件有相同點(diǎn),都是在install的第一個(gè)參數(shù)Vue上注冊(cè)組件,) components.forEach(component => { Vue.component(component.name, component); }); // 4. 這里的 Vue.use 原理是一樣的(可以對(duì)照截圖,它這里后續(xù)是在Vue上注冊(cè)了指令) Vue.use(InfiniteScroll); Vue.use(Loading.directive); // 5.下面都是在Vue原型上掛載屬性或方法 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; };
4. Vue.use() 總結(jié)
- 首先
Vue.use
本身是一個(gè)函數(shù); Vue.use
這個(gè)函數(shù)做了這些操作:
- 判斷插件是否注冊(cè);
- 如果插件自帶insatll屬性,執(zhí)行它,同時(shí)傳遞一個(gè)Vue構(gòu)造函數(shù)作為第一個(gè)參數(shù),以及use中的其他參數(shù);
- 如果插件本身就是函數(shù),執(zhí)行它,同時(shí)傳遞一個(gè)Vue構(gòu)造函數(shù)作為第一個(gè)參數(shù),以及use中的其他參數(shù)
- 記錄這個(gè)插件已經(jīng)注冊(cè);
3.暫時(shí)遇到的插件本身都是一個(gè)對(duì)象,然后install中都會(huì)拿到傳遞來(lái)的Vue構(gòu)造函數(shù)進(jìn)行一些綁定操作。例如綁定組件,例如在原型上添加方法。
5.為什么有的庫(kù)就不需要使用Vue.use
例如常見(jiàn)的aixos引入
import axios from 'axios' Vue.prototype.$axios=axios
axios本身是不依賴Vue去運(yùn)行的,axios本身就可以在瀏覽器端或者node端都能進(jìn)行http請(qǐng)求。
這里掛載到Vue原型的$axios屬性上,只是為了方便使用。
end
- 感覺(jué)就是
組件
需要和Vue構(gòu)造函數(shù)
進(jìn)行交互的時(shí)候,才需要Vue.use()。 - 本質(zhì)就是傳遞一個(gè) Vue構(gòu)造函數(shù) 給插件使用,僅此而已。
到此這篇關(guān)于Vue.use()是干什么的的文章就介紹到這了,更多相關(guān)Vue.use()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Vue實(shí)現(xiàn)移動(dòng)端左滑刪除效果附源碼
這篇文章主要介紹了使用Vue實(shí)現(xiàn)移動(dòng)端左滑刪除效果,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05詳解vue 在移動(dòng)端體驗(yàn)上的優(yōu)化解決方案
這篇文章主要介紹了vue 在移動(dòng)端體驗(yàn)上的優(yōu)化解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05vue+webpack實(shí)現(xiàn)異步加載三種用法示例詳解
這篇文章主要介紹了vue+webpack實(shí)現(xiàn)異步加載的三種用法,文中給大家提到了vue+webpack實(shí)現(xiàn)異步組件加載的代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-04-04Vue中代碼傳送(teleport)的實(shí)現(xiàn)
本文主要介紹了Vue中代碼傳送(teleport)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04解決vue打包后vendor.js文件過(guò)大問(wèn)題
這篇文章主要介紹了解決vue打包后vendor.js文件過(guò)大問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07vue使用cesium創(chuàng)建數(shù)據(jù)白模方式
這篇文章主要介紹了vue使用cesium創(chuàng)建數(shù)據(jù)白模方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10vue動(dòng)態(tài)設(shè)置img的src路徑實(shí)例
今天小編就為大家分享一篇vue動(dòng)態(tài)設(shè)置img的src路徑實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09