欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue動態(tài)組件和異步組件原理詳解

 更新時間:2019年05月06日 08:56:39   作者:Yzz  
這篇文章主要給大家介紹了關(guān)于Vue動態(tài)組件和異步組件原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Vue具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

在vue官方資料中,我們可以可以很學會如何通過vue構(gòu)建“動態(tài)組件”以及“異步組件”,然而,在官方資料中,并沒有涉及到真正的“動態(tài)異步”組件,經(jīng)過大量的時間研究和技術(shù)分析,我們給出目前比較合理的技術(shù)實現(xiàn)方式,并分析一下vue動態(tài)異步組件的原理

動態(tài)組件 & 異步組件的存在,使得我們更方便地控制首屏代碼的體積,加快加載速度。

拋開具體細節(jié)不談,一個普通 Vue 組件從創(chuàng)建到展現(xiàn)在頁面里,主要經(jīng)歷了以下流程:

// 組件 Object
{
 template: '<div>I am async!</div>'
}
// 經(jīng)過 compileToFunctions 得到對應的 render function 
with(this) {
 return _c('div', [_v("I am async!")])
}
// 在經(jīng)過 render 得到 Vnode 再 update 成為真實DOM

動態(tài)組件&異步組件與之有什么區(qū)別呢?

主要區(qū)別在于 render 中 createComponent 這一步,舉例。

// 組件
Vue.component('example', {
 template: '<div>I am async!</div>'
})

普通組件在 createComponent 時,會依據(jù)開發(fā)者自定義的 options,利用 Vue.extend 生成對應的構(gòu)造函數(shù),從而得到對應的 Vnode 。而一個異步組件

// 異步組件
Vue.component('async-example', function (resolve, reject) {
 // 利用 setTimeout 模擬請求
 setTimeout(function () {
  // 向 `resolve` 回調(diào)傳遞組件定義
  resolve({
   template: '<div>I am async!</div>'
  })
 }, 1000)
})

則是要經(jīng)過一系列處理,具體過程如下

在源碼的 create-component

// async component
let asyncFactory
if (isUndef(Ctor.cid)) {
 asyncFactory = Ctor
 Ctor = resolveAsyncComponent(asyncFactory, baseCtor, context)
 if (Ctor === undefined) {
  // return a placeholder node for async component, which is rendered
  // as a comment node but preserves all the raw information for the node.
  // the information will be used for async server-rendering and hydration.
  return createAsyncPlaceholder(
   asyncFactory,
   data,
   context,
   children,
   tag
  )
 }
}

首先 Ctor 就與之前不同,這里為一個 function

function (resolve, reject) {
 // 利用 setTimeout 模擬請求
 setTimeout(function () {
  // 向 `resolve` 回調(diào)傳遞組件定義
  resolve({
   template: '<div>I am async!</div>'
  })
 }, 1000)
}

之后調(diào)用 resolveAsyncComponent(asyncFactory, baseCtor, context)

resolveAsyncComponent 在源碼的 resolveAsyncComponent。

resolveAsyncComponent 的主要功能是定義 Ctor 所需要的 resolve 、reject 函數(shù)

// factory 為 Ctor
factory(resolve, reject)

以 resolve 函數(shù)為例

const resolve = once((res: Object | Class<Component>) => {
 // 緩存 resolved
 factory.resolved = ensureCtor(res, baseCtor)
 // 強制渲染
 if (!sync) {
 	forceRender(true)
 }
})

once 字面理解,就是只調(diào)用一次。當 Ctor 中 setTimeout 結(jié)束時調(diào)用。

ensureCtor 就是 Vue.extend 的封裝以適應不同場景,所以 resolve 函數(shù)的主要功能就是在異步完成時,將得到的 Ctor 轉(zhuǎn)化為構(gòu)造函數(shù),緩存在 factory.resolved 中。

之后利用 forceRender(true) 強制重新 render,由于之前緩存了 factory.resolved,resolveAsyncComponent 函數(shù)就直接返回了組件的構(gòu)造函數(shù)。

if (isDef(factory.resolved)) {
 return factory.resolved
}

之后就與普通組件一致了。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • vue實現(xiàn)圖形驗證碼登錄

    vue實現(xiàn)圖形驗證碼登錄

    這篇文章主要為大家詳細介紹了vue實現(xiàn)圖形驗證碼登錄,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • vue.js?Table?組件自定義列寬實現(xiàn)核心方法

    vue.js?Table?組件自定義列寬實現(xiàn)核心方法

    這篇文章主要介紹了vue.js?Table?組件自定義列寬實現(xiàn)核心方法,文圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • effect返回runner單測實現(xiàn)示例詳解

    effect返回runner單測實現(xiàn)示例詳解

    這篇文章主要為大家介紹了effect返回runner單測實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 詳解vue中父子組件傳遞參數(shù)props的實現(xiàn)方式

    詳解vue中父子組件傳遞參數(shù)props的實現(xiàn)方式

    這篇文章主要給大家介紹了在vue中,父子組件傳遞參數(shù)?props?實現(xiàn)方式,文章通過代碼示例介紹的非常詳細,對我們的學習或工作有一定的參考價值,需要的朋友可以參考下
    2023-07-07
  • VUE餓了么樹形控件添加增刪改功能的示例代碼

    VUE餓了么樹形控件添加增刪改功能的示例代碼

    本篇文章主要介紹了VUE餓了么樹形控件添加增刪改功能的示例代碼,非常具有實用價值,有興趣的可以了解一下
    2017-10-10
  • import.meta.glob() 如何導入多個目錄下的資源(最新推薦)

    import.meta.glob() 如何導入多個目錄下的資源(最新推薦)

    import.meta.glob() 其實不僅能接收一個字符串,還可以接收一個字符串數(shù)組,就是匹配多個位置,本文給大家介紹import.meta.glob() 如何導入多個目錄下的資源,感興趣的朋友一起看看吧
    2023-11-11
  • vue實現(xiàn)滑動驗證條

    vue實現(xiàn)滑動驗證條

    這篇文章主要為大家詳細介紹了vue實現(xiàn)滑動驗證條,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • vue Tab切換以及緩存頁面處理的幾種方式

    vue Tab切換以及緩存頁面處理的幾種方式

    這篇文章主要介紹了vue Tab切換以及緩存頁面處理的幾種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • 詳解vue?祖先組件操作后代組件方法

    詳解vue?祖先組件操作后代組件方法

    最近寫代碼遇到一問題祖先級別的組件怎么操作孫子的兒子的組件方法,在網(wǎng)上搜了半天都是父子傳參,父子操作,暈暈乎乎的想起了bus,接下來通過本文給大家介紹vue?祖先組件操作后代組件方法,需要的朋友可以參考下
    2022-11-11
  • Vue組件通信深入分析

    Vue組件通信深入分析

    對于vue來說,組件之間的消息傳遞是非常重要的,用vue可以是要組件復用的,而組件實例的作用域是相互獨立,這意味著不同組件之間的數(shù)據(jù)無法互相引用,一般來說,組件之間可以有幾種關(guān)系,下面是我對組件之間消息傳遞的常用方式的總結(jié)
    2022-08-08

最新評論