亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
使用異步組件的原因
原理
源碼
首頁 web前端 前端問答 vue為啥要使用異步組件

vue為啥要使用異步組件

Dec 13, 2022 pm 07:11 PM
vue 異步組件

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

vue為啥要使用異步組件

本教程操作環(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ù)

原理

在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
      )
    }
  }
}

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é)果
  }
}

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
}

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

以上是vue為啥要使用異步組件的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

怎樣開發(fā)一個完整的PythonWeb應(yīng)用程序? 怎樣開發(fā)一個完整的PythonWeb應(yīng)用程序? May 23, 2025 pm 10:39 PM

要開發(fā)一個完整的PythonWeb應(yīng)用程序,應(yīng)遵循以下步驟:1.選擇合適的框架,如Django或Flask。2.集成數(shù)據(jù)庫,使用ORM如SQLAlchemy。3.設(shè)計前端,使用Vue或React。4.進(jìn)行測試,使用pytest或unittest。5.部署應(yīng)用,使用Docker和平臺如Heroku或AWS。通過這些步驟,可以構(gòu)建出功能強(qiáng)大且高效的Web應(yīng)用。

Laravel   Vue.js 開發(fā)單頁面應(yīng)用(SPA)教程 Laravel Vue.js 開發(fā)單頁面應(yīng)用(SPA)教程 May 15, 2025 pm 09:54 PM

使用Laravel和Vue.js可以構(gòu)建單頁面應(yīng)用(SPA)。1)在Laravel中定義API路由和控制器,處理數(shù)據(jù)邏輯。2)在Vue.js中創(chuàng)建組件化前端,實現(xiàn)用戶界面和數(shù)據(jù)交互。3)配置CORS和使用axios進(jìn)行數(shù)據(jù)交互。4)利用VueRouter實現(xiàn)路由管理,提升用戶體驗。

wordpress怎么做前后端分離 wordpress怎么做前后端分離 Apr 20, 2025 am 08:39 AM

將 WordPress 前后端分離不建議直接改造原生代碼,更適合“改良式分離”。利用 REST API 獲取數(shù)據(jù),使用前端框架構(gòu)建用戶界面。甄別哪些功能通過 API 調(diào)用,哪些保留在后端,哪些可取消。Headless WordPress 模式可實現(xiàn)更徹底的分離,但開發(fā)成本和難度較高。注意安全和性能,優(yōu)化 API 響應(yīng)速度和緩存,并優(yōu)化 WordPress 本身。逐步遷移功能,使用版本控制工具管理代碼。

如何將海康威視攝像頭SDK的視頻流推送到前端Vue項目中進(jìn)行實時播放? 如何將海康威視攝像頭SDK的視頻流推送到前端Vue項目中進(jìn)行實時播放? Apr 19, 2025 pm 07:42 PM

如何將??低晹z像頭SDK的視頻流推送到前端Vue項目?在開發(fā)過程中,經(jīng)常會遇到需要將攝像頭捕獲的視頻流傳...

前端路由(Vue Router、React Router)的工作原理及配置方法? 前端路由(Vue Router、React Router)的工作原理及配置方法? May 20, 2025 pm 07:18 PM

前端路由系統(tǒng)的核心是將URL映射到組件,VueRouter和ReactRouter通過監(jiān)聽URL變化并加載相應(yīng)組件實現(xiàn)無刷新頁面切換。配置方法包括:1.嵌套路由,允許在父組件中嵌套子組件;2.動態(tài)路由,根據(jù)URL參數(shù)加載不同組件;3.路由守衛(wèi),在路由切換前后執(zhí)行邏輯如權(quán)限檢查。

Vue的反應(yīng)性轉(zhuǎn)換(實驗,然后被刪除)的意義是什么? Vue的反應(yīng)性轉(zhuǎn)換(實驗,然后被刪除)的意義是什么? Jun 20, 2025 am 01:01 AM

ReactivitytransforminVue3aimedtosimplifyhandlingreactivedatabyautomaticallytrackingandmanagingreactivitywithoutrequiringmanualref()or.valueusage.Itsoughttoreduceboilerplateandimprovecodereadabilitybytreatingvariableslikeletandconstasautomaticallyreac

VUE 3中的如何幫助管理異步組件及其加載狀態(tài)? VUE 3中的如何幫助管理異步組件及其加載狀態(tài)? Jun 10, 2025 am 12:07 AM

suspenseInvue3SimplifiesHandlingAsyNccomponEntsByManagingSandIntegratingErrorhandling.1.ItwrapsApsasyncconconContenTandDisplaysFallbackContentLikespinnersuntlikespinnernuntilthecomentssone2.youdefineSuntheComentss.2.youdefineasyneasyneasyneasyneasyenesnentsdefeneasyneasyeasyneasyeasyneasyncomenandandrapemandwrapthrapteminasunasususpepe

Vue.js 與 React 在組件化開發(fā)中的核心差異是什么? Vue.js 與 React 在組件化開發(fā)中的核心差異是什么? May 21, 2025 pm 08:39 PM

Vue.js和React在組件化開發(fā)中的核心差異在于:1)Vue.js使用模板語法和選項式API,而React使用JSX和函數(shù)式組件;2)Vue.js采用響應(yīng)式系統(tǒng),React則使用不可變數(shù)據(jù)和虛擬DOM;3)Vue.js提供多個生命周期鉤子,React則更多使用useEffect鉤子。

See all articles