久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      vue為啥要使用異步組件

      使用異步組件的原因:1、異步組件可以減少打包的結(jié)果,會將異步組件分開打包,會采用異步的方式加載組件,可以有效的解決一個組件過大的問題。2、異步組件的核心可以給組件定義變成一個函數(shù),函數(shù)里面可以用import語法,實現(xiàn)文件的分割加載。

      vue為啥要使用異步組件

      前端(vue)入門到精通課程,老師在線輔導(dǎo):聯(lián)系老師
      Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調(diào)試工具:點擊使用

      本教程操作環(huán)境:windows7系統(tǒng)、vue3版,DELL G3電腦。

      使用異步組件的原因

      1.異步組件可以減少打包的結(jié)果。會將異步組件分開打包,會采用異步的方式加載組件,可以有效的解決一個組件過大的問題。不使用異步組件,如果組件功能比較多打包出來的結(jié)果就會變大。

      2.異步組件的核心可以給組件定義變成一個函數(shù),函數(shù)里面可以用import語法,實現(xiàn)文件的分割加載,import語法是webpack提供的,采用的就是jsonp。(學(xué)習(xí)視頻分享:vuejs入門教程、編程基礎(chǔ)視頻)

      components:{   VideoPlay:(resolve)=>import("../components/VideoPlay") }   components:{   VideoPlay(resolve) {     require(["../components/VideoPlay"], resolve)   } }   或者使用回調(diào)函數(shù)
      登錄后復(fù)制

      原理

      在createComponent方法中,會有相應(yīng)的異步組件處理,首先定義一個asyncFactory變量,然后進(jìn)行判斷,如果組件是一個函數(shù),然后會去調(diào)resolveAsyncComponent方法,然后將賦值在asyncFactory上的函數(shù)傳進(jìn)去,會讓asyncFactory馬上執(zhí)行,執(zhí)行的時候并不會馬上返回結(jié)果,因為他是異步的,返回的是一個promise,這時候這個值就是undefined,然后就會先渲染一個異步組件的占位,空虛擬節(jié)點。如果加載完之后會調(diào)factory函數(shù)傳入resolve和reject兩個參數(shù),執(zhí)行后返回一個成功的回調(diào)和失敗的回調(diào),promise成功了就會調(diào)resolve,resolve中就會調(diào)取forceRender方法強(qiáng)制更新視圖重新渲染,forceRender中調(diào)取的就是$forceUpdate,同時把結(jié)果放到factory.resolved上,如果強(qiáng)制刷新的時候就會再次走resolveAsyncComponent方法,這時候有個判斷,如果有成功的結(jié)果就把結(jié)果直接放回去,這時候resolveAsyncComponent返回的就不是undefined了,就會接的創(chuàng)建組件,初始化組件,渲染組件。

      源碼

      src/core/vdom/create-component.js

      1.createComponent方法

      export function createComponent (   Ctor: Class<Component> | Function | Object | void,   data: ?VNodeData,   context: Component,   children: ?Array<VNode>,   tag?: string ): VNode | Array<VNode> | void {   let asyncFactory   if (isUndef(Ctor.cid)) { // 看組件是否是一個函數(shù)     asyncFactory = Ctor // 異步組件一定是一個函數(shù) 新版本提供了對象的寫法     Ctor = resolveAsyncComponent(asyncFactory, baseCtor) //默認(rèn)調(diào)用此函數(shù)時返回undefiend     // 第二次渲染時Ctor不為undefined     if (Ctor === undefined) {       //返回async組件的占位符節(jié)點       //作為注釋節(jié)點,但保留該節(jié)點的所有原始信息       //該信息將用于異步服務(wù)器渲染和水合。       return createAsyncPlaceholder(         asyncFactory,         data,         context,         children,         tag       )     }   } }
      登錄后復(fù)制

      2.resolveAsyncComponent方法

      export function resolveAsyncComponent (   factory: Function,   baseCtor: Class<Component> ): Class<Component> | void {   // 如果有錯誤就返回錯誤結(jié)果   if (isTrue(factory.error) && isDef(factory.errorComp)) {     return factory.errorComp   }   // 再次渲染時可以拿到獲取的最新組件   // 如果有成功的結(jié)果,就直接返回去   if (isDef(factory.resolved)) {     return factory.resolved   }    if (owner && !isDef(factory.owners)) {     // forceRender 強(qiáng)制刷新渲染     const forceRender = (renderCompleted: boolean) => {       for (let i = 0, l = owners.length; i < l; i++) {         (owners[i]: any).$forceUpdate() // 執(zhí)行$forceUpdate       }     }     // 成功     const resolve = once((res: Object | Class<Component>) => {       factory.resolved = ensureCtor(res, baseCtor)       if (!sync) {         forceRender(true) // 執(zhí)行強(qiáng)制更新視圖重新渲染方法       } else {         owners.length = 0       }     })     // 失敗     const reject = once(reason => {       if (isDef(factory.errorComp)) {         factory.error = true         forceRender(true)       }     })      // 執(zhí)行factory 將resolve方法和reject方法傳入     const res = factory(resolve, reject)      sync = false     return factory.loading ? factory.loadingComp : factory.resolved // 返回結(jié)果   } }
      登錄后復(fù)制

      3.createAsyncPlaceholder 方法

      // 創(chuàng)建一個異步組件的占位,空虛擬節(jié)點   也就是一個注釋<!--> export function createAsyncPlaceholder (   factory: Function,   data: ?VNodeData,   context: Component,   children: ?Array<VNode>,   tag: ?string ): VNode {   const node = createEmptyVNode()   node.asyncFactory = factory   node.asyncMeta = { data, context, children, tag }   return node }
      登錄后復(fù)制

      (學(xué)習(xí)視頻分享:vuejs入門教程、編程基礎(chǔ)視頻)

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號