VueJS學(xué)習(xí)之旅 06

上一節(jié)我們結(jié)合代碼和文檔,詳細(xì)介紹了Global Config,下面我們?cè)敿?xì)來(lái)看看Global API。


Global API

OK,結(jié)合官方文檔和代碼細(xì)節(jié),我們來(lái)看看這些 Global API 的具體用法:

  • Vue.set(object, key, value)

    文檔說(shuō)明:

    • 參數(shù):
      • {Object} object
      • {string} key
      • {any} value
    • 返回值:設(shè)置的值(從代碼細(xì)節(jié)中看,這個(gè)描述不是很?chē)?yán)謹(jǐn))
    • 用法:
      設(shè)置對(duì)象的屬性。如果對(duì)象是響應(yīng)式的,確保屬性被創(chuàng)建后也是響應(yīng)式的,同時(shí)觸發(fā)視圖更新。這個(gè)方法主要用于避開(kāi) Vue 不能檢測(cè)屬性被添加的限制。
      注意對(duì)象不能是 Vue 實(shí)例,或者 Vue 實(shí)例的根數(shù)據(jù)對(duì)象。

    源碼定義在 'src/core/observer/index.js' 文件中,基本邏輯為:

    1. 如果object是數(shù)組,將value插入到key對(duì)應(yīng)的位置,直接返回value
    2. 如果object對(duì)象自身含有key屬性,將該屬性值更新為vlaue。然后返回
    3. 如果object是Vue實(shí)例對(duì)象,或者是Vue實(shí)例對(duì)象的根數(shù)據(jù)對(duì)象,給出警告信息(開(kāi)發(fā)模式)然后直接返回,不做處理
    4. 如果object沒(méi)有被追蹤(observed),則為object增加或修改key屬性,之后返回
    5. 如果不是以上情況,則為object增加響應(yīng)式屬性,并觸發(fā)視圖更新。返回value。(這部分涉及到Vue的響應(yīng)式設(shè)計(jì)原理,后續(xù)會(huì)深入研究)
  • Vue.delete(object, key)

    文檔說(shuō)明:

    • 參數(shù):
      • {Object} object
      • {string} key
    • 用法:
      刪除對(duì)象的屬性。如果對(duì)象是響應(yīng)式的,確保刪除能觸發(fā)更新視圖。這個(gè)方法主要用于避開(kāi) Vue 不能檢測(cè)到屬性被刪除的限制,但是你應(yīng)該很少會(huì)使用它。
      注意對(duì)象不能是 Vue 實(shí)例,或者 Vue 實(shí)例的根數(shù)據(jù)對(duì)象

    源碼定義在 'src/core/observer/index.js' 文件中,基本邏輯為:

    1. 如果object是Vue實(shí)例對(duì)象,或者是Vue實(shí)例對(duì)象的根數(shù)據(jù)對(duì)象,給出警告信息(開(kāi)發(fā)模式)然后直接返回,不做處理
    2. 如果object對(duì)象自身沒(méi)有key屬性,直接返回不做處理
    3. 如果不是以上情況,直接刪除object的key屬性。如果object沒(méi)有被追蹤(observed),則直接返回,否則觸發(fā)視圖更新。
  • Vue.nextTick([callback, context])

    文檔說(shuō)明:

    • 參數(shù):
      • {Function} [callback]
      • {Object} [context]
    • 用法:
      在下次 DOM 更新循環(huán)結(jié)束之后執(zhí)行延遲回調(diào)。在修改數(shù)據(jù)之后立即使用這個(gè)方法,獲取更新后的 DOM。
      這里涉及到Vue的異步更新隊(duì)列,后續(xù)會(huì)深入研究。

    源碼定義在 'src/core/util/env.js' 文件中,使用閉包和立即執(zhí)行函數(shù)返回一個(gè) queueNextTick 函數(shù),從而實(shí)現(xiàn)了一個(gè)異步隊(duì)列機(jī)制。
    代碼看似復(fù)雜,其實(shí)本質(zhì)上就是以異步隊(duì)列的方式,使用給定上下文context來(lái)執(zhí)行callback函數(shù)。

  • Vue.use(plugin)

    文檔說(shuō)明:

    • 參數(shù):
      • {Object | Function} plugin
    • 用法:
      安裝 Vue.js 插件。如果插件是一個(gè)對(duì)象,必須提供 install 方法。如果插件是一個(gè)函數(shù),它會(huì)被作為 install 方法。install 方法將被作為 Vue 的參數(shù)調(diào)用。
      當(dāng) install 方法被同一個(gè)插件多次調(diào)用,插件將只會(huì)被安裝一次。

    源碼定義在 'src/core/global-api/use.js' 文件中,基本邏輯為:

    1. 如果plugin已經(jīng)安裝(通過(guò)plugin的installed屬性),則直接返回,不做處理
    2. 如果plugin.install是一個(gè)函數(shù),則執(zhí)行plugin.install(傳入的plugin為對(duì)象)。否則直接執(zhí)行plugin(傳入的plugin為函數(shù))。
    3. 將plugin的installed屬性設(shè)置為true
  • Vue.mixin(mixin)

    文檔說(shuō)明:

    • 參數(shù):
      • {Object} mixin
    • 用法:
      全局注冊(cè)一個(gè)混合,影響注冊(cè)之后所有創(chuàng)建的每個(gè) Vue 實(shí)例。插件作者可以使用混合,向組件注入自定義的行為。
      不推薦在應(yīng)用代碼中使用。

    源碼定義在 'src/core/global-api/mixin.js' 文件中,代碼非常簡(jiǎn)短,就是要向Vue.options合并其他選項(xiàng)。
    具體是通過(guò)調(diào)用 mergeOptions 函數(shù)實(shí)現(xiàn)的,有關(guān)的信息曾經(jīng)在 Global ConfigVue.config.optionMergeStrategies 部分介紹過(guò)。

  • Vue.extend(options)

    文檔說(shuō)明:

    • 參數(shù):
      • {Object} options
    • 用法:
      使用基礎(chǔ) Vue 構(gòu)造器,創(chuàng)建一個(gè)“子類(lèi)”。參數(shù)是一個(gè)包含組件選項(xiàng)的對(duì)象。
      data 選項(xiàng)是特例,需要注意 - 在 Vue.extend() 中它必須是函數(shù)。(關(guān)于為何data必須是函數(shù),可以在Vue預(yù)定義的屬性合并策路中找到。 'src/core/util/options.js' 文件中 'strats.data' 的定義。其它有關(guān)屬性合并策略的信息,請(qǐng)參考 Global ConfigVue.config.optionMergeStrategies 部分)

    源碼定義在 'src/core/global-api/extend.js' 文件中,基本邏輯為:

    1. 處理cid相關(guān)
    2. 判斷options中的name,只可包含數(shù)字,字母和連接符-
    3. 定義Super指向Vue構(gòu)造器,使用構(gòu)造器模式和原型繼承模式構(gòu)建一個(gè)Sub繼承Super。
    4. 調(diào)用 mergeOptions 函數(shù)合并屬性,并賦值給Sub。
    5. 將Super的全局函數(shù)(use,mixin,extend,component,directive,filter等)賦值給Sub。
    6. 在Sub中記錄Super信息:Sub['super']= Super; Sub['superOptions'] = Super.options;
  • Vue.component(id, [definition])

    文檔說(shuō)明:

    • 參數(shù):
      • {string} id
      • {Function | Object} [definition]
    • 用法:
      注冊(cè)或獲取全局組件。注冊(cè)還會(huì)自動(dòng)使用給定的id設(shè)置組件的名稱(chēng)。

    源碼定義在 'src/core/global-api/assets.js' 文件中,基本邏輯為:

    1. 如果沒(méi)有給定definition,執(zhí)行讀取操作。返回Vue.components[id]。
    2. 否則,判斷給定id的值是否為保留字,是保留字的話(huà),給出警告信息(開(kāi)發(fā)模式下)。
    3. 如果在definition中沒(méi)有給定name屬性,則使用id作為name屬性的值
    4. 默認(rèn)調(diào)用Vue.extend,將definition包裝為Vue組件,然后將該組件注冊(cè)到Vue全局
    5. 返回包裝過(guò)后的definition
  • Vue.directive(id, [definition])

    文檔說(shuō)明:

    • 參數(shù):
      • {string} id
      • {Function | Object} [definition]
    • 用法:
      注冊(cè)或獲取全局指令。

    源碼定義在 'src/core/global-api/assets.js' 文件中,基本邏輯為:

    1. 如果沒(méi)有給定definition,執(zhí)行讀取操作。返回Vue.directives[id]。
    2. 如果definition是一個(gè)函數(shù),將definition包裝為一個(gè)指令對(duì)象
    3. 然后將該指令注冊(cè)到Vue全局,并返回包裝過(guò)后的指令對(duì)象
  • Vue.filter(id, [definition])

    文檔說(shuō)明:

    • 參數(shù):
      • {string} id
      • {Function} [definition]
    • 用法:
      注冊(cè)或獲取全局過(guò)濾器。

    源碼定義在 'src/core/global-api/assets.js' 文件中,基本邏輯為:

    1. 如果沒(méi)有給定definition,執(zhí)行讀取操作。返回Vue.filters[id]。
    2. definition為一個(gè)函數(shù),這里稱(chēng)為過(guò)濾器。將該過(guò)濾器注冊(cè)到Vue全局,并返回該過(guò)濾器
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,659評(píng)論 19 139
  • 下面我就來(lái)看看Vue的核心構(gòu)造器以及其實(shí)例的屬性和方法。 Vue構(gòu)造器 從 'src/core/index.js'...
    小A家的銘閱讀 3,137評(píng)論 0 0
  • 前言 webpack2和vue2已經(jīng)不是新鮮東西了,滿(mǎn)大街的文章在講解webpack和vue,但是很多內(nèi)容寫(xiě)的不是...
    技術(shù)宅小青年閱讀 6,688評(píng)論 4 43
  • 響應(yīng)式布局的理解 響應(yīng)式開(kāi)發(fā)目的是一套代碼可以在多種終端運(yùn)行,適應(yīng)不同屏幕的大小,其原理是運(yùn)用媒體查詢(xún),在不同屏幕...
    懶貓_6500閱讀 857評(píng)論 0 0
  • 身體健康是每個(gè)人收紅包前的祝詞,是每家每戶(hù)必有的揮春,是清明節(jié)拜祭祖先必許的愿望等等。但是,正如大家都吃過(guò)番茄炒蛋...
    Tungbaby閱讀 803評(píng)論 2 6

友情鏈接更多精彩內(nèi)容