最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue.use的原理和設(shè)計源碼探究

 更新時間:2023年02月09日 14:35:02   作者:給小葉倒茶  
這篇文章主要為大家介紹了Vue.use的原理和設(shè)計源碼探究詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

這段時間打算回顧一下Vue的全局方法,腦海里第一個跳出來的方法就是Vue.use,之所以會首先想到它,我覺得和我平時看的面試題相關(guān)~~~

Vue.use的原理是面試中常問的點(diǎn),因為相對于其他全局方法,Vue.use源代碼邏輯清晰,如果了解它,也就代表這個人是看過Vue源碼的?。?!

基本使用

在Vue官網(wǎng)中是這樣說明的:通過全局方法 Vue.use(plugin) 使用插件

首先要知道什么是插件,插件通常用來為 Vue 添加全局功能(過濾器、指令、組件),平時我們使用的UI組件、Axios、Vuex都是插件

Vue.use裝載插件的方式也很簡單

 import Vue from "vue"
 import Element from 'element-ui'
 Vue.use(Element)

并且在Vue官網(wǎng)還介紹了我們?nèi)绾稳ラ_發(fā)插件,只需要暴露一個install方法就可以,在如果Vue.use方法使用插件時,會主動調(diào)用install方法

install方法第一個參數(shù)是Vue構(gòu)造函數(shù),剩下的參數(shù)則是調(diào)用Vue.use方法時,除第一個參數(shù)以外的剩余參數(shù)

 import Vue from "vue"
 let MyPlugin = {
     install(_Vue) {
         console.log(_Vue === Vue)       // true
     }
 }
 Vue.install(MyPlugin)

源碼解析

廢話不說,直接上源碼~~~

 import type { GlobalAPI } from 'types/global-api'
 import { toArray, isFunction } from '../util/index'
 export function initUse(Vue: GlobalAPI) {
     // plugin:類型是 Function|any
   Vue.use = function (plugin: Function | any) { 
     // this是Vue構(gòu)造函數(shù)
     // _installedPlugins保存了已經(jīng)被過使用插件
     const installedPlugins = this._installedPlugins || (this._installedPlugins = []) 
     // 判斷當(dāng)前插件是否已經(jīng)被使用過
     if (installedPlugins.indexOf(plugin) > -1) {
       // 如果已經(jīng)被使用,就直接返回Vue構(gòu)造函數(shù)
       return this
     }
     // 獲取排除第一個參數(shù)之后所剩余的參數(shù)
     const args = toArray(arguments, 1)
     // 向頭部添加Vue構(gòu)造函數(shù)
     args.unshift(this)
     // 如果 plugin.install 是方法
     if (isFunction(plugin.install)) {
       // 執(zhí)行plugin.install方法
       plugin.install.apply(plugin, args)
     } 
     // 如果 plugin 是函數(shù)
     else if (isFunction(plugin)) {
       // 執(zhí)行plugin.install函數(shù)
       plugin.apply(null, args)
     }
     // plugin已經(jīng)被使用過了,添加到已使用緩存中
     installedPlugins.push(plugin)
     return this
   }
 }

源碼不一定都很很難,像Vue.use源碼是不是就很簡單

我們從源碼中得到以下信息:

  • Vue.use會防止重復(fù)加載同一個插件
  • Vue.use可以鏈?zhǔn)秸{(diào)用
  • plugin只有類型是函數(shù)或者對象的時候才有用,為函數(shù)時,直接運(yùn)行這個函數(shù);當(dāng)為對象時,會判斷對象中是否存在install方法,如果存在,就執(zhí)行這個方法

控制反轉(zhuǎn)

談?wù)摿?code>Vue.use使用和原理,那再講一講設(shè)計吧~~~

我們從框架設(shè)計者的角度出發(fā),現(xiàn)在需要允許Vue插件,你會怎樣設(shè)計喃?

 function show() {
     console.log("我是插件");
 }

現(xiàn)在需要把show方法添加到Vue原型上,如果沒有提供Vue.use方法,那就會這樣,開發(fā)者手動添加到原型上

 function show() {
     console.log("我是插件");
 }
 Vue.prototype.show = show

顯然這樣是不對,如果明天在有show2方法喃?不可能讓開發(fā)自己加呀,你就首先提出了Vue.use方法幫助開發(fā)者加載插件

 Vue.use = function (plugin) {
     if (typeof plugin === "object") {
         if (plugin.add) {
             plugin.add()
         }
         if (plugin.use) {
             plugin.use()
         }
     } else {
     }
 }

但是這又遇到一個難題,插件的類型多種多樣,有些插件暴露的是add方法,有些時候use,不可能都要適配吧!?。?/p>

所以這個時候你就通知所以插件開發(fā)商,讓他們插件都要向外暴露install方法,沒有這個方法的我們不管,所以問題也都解決了

回到正題,談設(shè)計,原本需要開發(fā)者實現(xiàn)的業(yè)務(wù),交給了Vue本身,開發(fā)者只需要提供插件,這種設(shè)計叫做控制反轉(zhuǎn)

也就是把代碼的控制權(quán)從開發(fā)者交給Vue本身,如果Vue.use注入插件也叫做依賴注入

以上就是Vue.use的原理和設(shè)計源碼探究的詳細(xì)內(nèi)容,更多關(guān)于Vue.use原理設(shè)計的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Vue使用pdf-lib實現(xiàn)為文件流添加水印并預(yù)覽

    Vue使用pdf-lib實現(xiàn)為文件流添加水印并預(yù)覽

    這篇文章主要為大家詳細(xì)介紹了Vue如何使用pdf-lib實現(xiàn)為文件流添加水印并預(yù)覽的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-03-03
  • 詳解Vue2.0組件的繼承與擴(kuò)展

    詳解Vue2.0組件的繼承與擴(kuò)展

    這篇文章主要介紹了詳解Vue2.0組件的繼承與擴(kuò)展,主要分享slot、mixins/extends和extend的用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • Vue3表單組件el-form校驗規(guī)則rules屬性示例詳解

    Vue3表單組件el-form校驗規(guī)則rules屬性示例詳解

    在el-form中正確使用rules校驗是非常重要的,rules使用不當(dāng)容易出現(xiàn)規(guī)則不生效、規(guī)則一直被觸發(fā)等各種現(xiàn)象,這篇文章主要給大家介紹了關(guān)于Vue3表單組件el-form校驗規(guī)則rules屬性的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • vue路由中前進(jìn)后退的一些事兒

    vue路由中前進(jìn)后退的一些事兒

    這篇文章主要給大家介紹了關(guān)于vue路由中前進(jìn)后退的一些事兒,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用vue路由具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Ant Design Vue日期組件的時間限制方式

    Ant Design Vue日期組件的時間限制方式

    這篇文章主要介紹了Ant Design Vue日期組件的時間限制方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • VueJS全面解析

    VueJS全面解析

    Vue.js(讀音 /vjuː/, 類似于 view) 是一套構(gòu)建用戶界面的漸進(jìn)式框架。與其他重量級框架不同的是,Vue 采用自底向上增量開發(fā)的設(shè)計。這篇文章主要介紹了VueJS全面解析的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • Ant Design Vue如何生成動態(tài)菜單a-menu

    Ant Design Vue如何生成動態(tài)菜單a-menu

    這篇文章主要介紹了Ant Design Vue如何生成動態(tài)菜單a-menu問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 記錄--使用el-time-picker默認(rèn)值遇到的問題

    記錄--使用el-time-picker默認(rèn)值遇到的問題

    這篇文章主要介紹了記錄--使用el-time-picker默認(rèn)值遇到的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • vue項目實現(xiàn)圖片上傳功能

    vue項目實現(xiàn)圖片上傳功能

    這篇文章主要為大家詳細(xì)介紹了vue項目實現(xiàn)圖片上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Vue路由監(jiān)聽實現(xiàn)同頁面動態(tài)加載的示例

    Vue路由監(jiān)聽實現(xiàn)同頁面動態(tài)加載的示例

    本文主要介紹了Vue基于路由監(jiān)聽實現(xiàn)同頁面動態(tài)加載的示例,重點(diǎn)在于切換路由的時候,重新拉取列表數(shù)據(jù),接下來看看實現(xiàn)方法吧
    2021-05-05

最新評論

江达县| 渭源县| 西和县| 南开区| 喀什市| 浦县| 扎鲁特旗| 临桂县| 清镇市| 深泽县| 东山县| 邯郸县| 徐汇区| 咸阳市| 邹城市| 博爱县| 抚松县| 皮山县| 宣威市| 榆林市| 宜良县| 松阳县| 古浪县| 大竹县| 嘉善县| 元氏县| 北海市| 高碑店市| 邵武市| 绥棱县| 香港 | 漯河市| 五大连池市| 东平县| 华亭县| 花莲县| 乌兰察布市| 兴文县| 云南省| 安阳县| 黑龙江省|