欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長(zhǎng)資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          vue為啥要使用異步組件

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

          vue為啥要使用異步組件

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

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

          使用異步組件的原因

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

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

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

          原理

          在createComponent方法中,會(huì)有相應(yīng)的異步組件處理,首先定義一個(gè)asyncFactory變量,然后進(jìn)行判斷,如果組件是一個(gè)函數(shù),然后會(huì)去調(diào)resolveAsyncComponent方法,然后將賦值在asyncFactory上的函數(shù)傳進(jìn)去,會(huì)讓asyncFactory馬上執(zhí)行,執(zhí)行的時(shí)候并不會(huì)馬上返回結(jié)果,因?yàn)樗钱惒降模祷氐氖且粋€(gè)promise,這時(shí)候這個(gè)值就是undefined,然后就會(huì)先渲染一個(gè)異步組件的占位,空虛擬節(jié)點(diǎn)。如果加載完之后會(huì)調(diào)factory函數(shù)傳入resolve和reject兩個(gè)參數(shù),執(zhí)行后返回一個(gè)成功的回調(diào)和失敗的回調(diào),promise成功了就會(huì)調(diào)resolve,resolve中就會(huì)調(diào)取forceRender方法強(qiáng)制更新視圖重新渲染,forceRender中調(diào)取的就是$forceUpdate,同時(shí)把結(jié)果放到factory.resolved上,如果強(qiáng)制刷新的時(shí)候就會(huì)再次走resolveAsyncComponent方法,這時(shí)候有個(gè)判斷,如果有成功的結(jié)果就把結(jié)果直接放回去,這時(shí)候resolveAsyncComponent返回的就不是undefined了,就會(huì)接的創(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)) { // 看組件是否是一個(gè)函數(shù)     asyncFactory = Ctor // 異步組件一定是一個(gè)函數(shù) 新版本提供了對(duì)象的寫法     Ctor = resolveAsyncComponent(asyncFactory, baseCtor) //默認(rèn)調(diào)用此函數(shù)時(shí)返回undefiend     // 第二次渲染時(shí)Ctor不為undefined     if (Ctor === undefined) {       //返回async組件的占位符節(jié)點(diǎn)       //作為注釋節(jié)點(diǎn),但保留該節(jié)點(diǎn)的所有原始信息       //該信息將用于異步服務(wù)器渲染和水合。       return createAsyncPlaceholder(         asyncFactory,         data,         context,         children,         tag       )     }   } }
          登錄后復(fù)制

          2.resolveAsyncComponent方法

          export function resolveAsyncComponent (   factory: Function,   baseCtor: Class<Component> ): Class<Component> | void {   // 如果有錯(cuò)誤就返回錯(cuò)誤結(jié)果   if (isTrue(factory.error) && isDef(factory.errorComp)) {     return factory.errorComp   }   // 再次渲染時(shí)可以拿到獲取的最新組件   // 如果有成功的結(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)建一個(gè)異步組件的占位,空虛擬節(jié)點(diǎn)   也就是一個(gè)注釋<!--> 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號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)