Vue が非同期コンポーネントを使用するのはなぜですか?

青灯夜游
リリース: 2022-12-13 19:11:08
オリジナル
2254 人が閲覧しました

非同期コンポーネントを使用する理由: 1. 非同期コンポーネントは、パッケージ化結果を削減し、非同期コンポーネントを個別にパッケージ化し、コンポーネントを非同期的にロードすることができるため、大きすぎるコンポーネントの問題を効果的に解決できます。 2. 非同期コンポーネントのコアは関数として定義でき、関数内でインポート構文を使用してファイルの分割ロードを実現できます。

Vue が非同期コンポーネントを使用するのはなぜですか?

#このチュートリアルの動作環境: Windows7 システム、vue3 バージョン、DELL G3 コンピューター。

非同期コンポーネントを使用する理由

1. 非同期コンポーネントにより、パッケージ化の結果が低下する可能性があります。非同期コンポーネントは個別にパッケージ化され、コンポーネントは非同期でロードされるため、大きすぎるコンポーネントの問題を効果的に解決できます。非同期コンポーネントを使用しない場合、コンポーネントの機能が増えると、パッケージ化された結果が大きくなります。

2. 非同期コンポーネントのコアは関数として定義できます。関数内でインポート構文を使用してファイルの分割読み込みを実現できます。インポート構文は webpack によって提供され、jsonp を使用します。 (学習ビデオ共有:

vuejs 入門チュートリアル基本プログラミング ビデオ)

components:{ VideoPlay:(resolve)=>import("../components/VideoPlay") } components:{ VideoPlay(resolve) { require(["../components/VideoPlay"], resolve) } } 或者使用回调函数
ログイン後にコピー

Principle

createComponent メソッドには、対応する非同期コンポーネントがあります。処理としては、まずasyncFactory変数を定義してから判断し、コンポーネントが関数の場合はresolveAsyncComponentメソッドを呼び出し、asyncFactoryに割り当てられた関数を渡すことでasyncFactoryを実行します。結果として、非同期であるため、Promise が返されます。このとき、値は未定義であり、非同期コンポーネントのプレースホルダーである空の仮想ノードが最初にレンダリングされます。ロード後、ファクトリ関数が呼び出され、2 つのパラメータのsolveとrejectを渡します。実行後、成功したコールバックと失敗したコールバックが返されます。Promiseが成功した場合は、resolveが呼び出されます。forceRenderメソッドは次のようになります。ビューの更新と再レンダリングを強制するために、solve で呼び出されます。forceRender で呼び出されるのは $forceUpdate で、その結果は Factory.resolved に置かれます。更新が強制される場合、resolveAsyncComponent メソッドが再度使用されます。今回は判定があり、結果が成功した場合は結果がそのまま戻されますが、このときresolveAsyncComponentの戻り値は未定義ではなく、コンポーネントの作成、初期化、レンダリングが行われます。

ソース コード

src/core/vdom/create-component.js

1.createComponent メソッド

export function createComponent ( Ctor: Class | Function | Object | void, data: ?VNodeData, context: Component, children: ?Array, tag?: string ): VNode | Array | void { let asyncFactory if (isUndef(Ctor.cid)) { // 看组件是否是一个函数 asyncFactory = Ctor // 异步组件一定是一个函数 新版本提供了对象的写法 Ctor = resolveAsyncComponent(asyncFactory, baseCtor) //默认调用此函数时返回undefiend // 第二次渲染时Ctor不为undefined if (Ctor === undefined) { //返回async组件的占位符节点 //作为注释节点,但保留该节点的所有原始信息 //该信息将用于异步服务器渲染和水合。 return createAsyncPlaceholder( asyncFactory, data, context, children, tag ) } } }
ログイン後にコピー

2.resolveAsyncComponent メソッド

export function resolveAsyncComponent ( factory: Function, baseCtor: Class ): Class | void { // 如果有错误就返回错误结果 if (isTrue(factory.error) && isDef(factory.errorComp)) { return factory.errorComp } // 再次渲染时可以拿到获取的最新组件 // 如果有成功的结果,就直接返回去 if (isDef(factory.resolved)) { return factory.resolved } if (owner && !isDef(factory.owners)) { // forceRender 强制刷新渲染 const forceRender = (renderCompleted: boolean) => { for (let i = 0, l = owners.length; i < l; i++) { (owners[i]: any).$forceUpdate() // 执行$forceUpdate } } // 成功 const resolve = once((res: Object | Class) => { factory.resolved = ensureCtor(res, baseCtor) if (!sync) { forceRender(true) // 执行强制更新视图重新渲染方法 } else { owners.length = 0 } }) // 失败 const reject = once(reason => { if (isDef(factory.errorComp)) { factory.error = true forceRender(true) } }) // 执行factory 将resolve方法和reject方法传入 const res = factory(resolve, reject) sync = false return factory.loading ? factory.loadingComp : factory.resolved // 返回结果 } }
ログイン後にコピー

3.createAsyncPlaceholder メソッド

// 创建一个异步组件的占位,空虚拟节点 也就是一个注释 export function createAsyncPlaceholder ( factory: Function, data: ?VNodeData, context: Component, children: ?Array, tag: ?string ): VNode { const node = createEmptyVNode() node.asyncFactory = factory node.asyncMeta = { data, context, children, tag } return node }
ログイン後にコピー

(学習ビデオ共有:

vuejs 入門チュートリアル基本プログラミング ビデオ)

以上がVue が非同期コンポーネントを使用するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。