ホームページ > 記事 > ウェブフロントエンド > Vue が非同期コンポーネントを使用するのはなぜですか?
#このチュートリアルの動作環境: Windows7 システム、vue3 バージョン、DELL G3 コンピューター。非同期コンポーネントを使用する理由: 1. 非同期コンポーネントは、パッケージ化結果を削減し、非同期コンポーネントを個別にパッケージ化し、コンポーネントを非同期的にロードすることができるため、大きすぎるコンポーネントの問題を効果的に解決できます。 2. 非同期コンポーネントのコアは関数として定義でき、関数内でインポート構文を使用してファイルの分割ロードを実現できます。
vuejs 入門チュートリアル、基本プログラミング ビデオ)
components:{ VideoPlay:(resolve)=>import("../components/VideoPlay") } components:{ VideoPlay(resolve) { require(["../components/VideoPlay"], resolve) } } 或者使用回调函数PrinciplecreateComponent メソッドには、対応する非同期コンポーネントがあります。処理としては、まずasyncFactory変数を定義してから判断し、コンポーネントが関数の場合はresolveAsyncComponentメソッドを呼び出し、asyncFactoryに割り当てられた関数を渡すことでasyncFactoryを実行します。結果として、非同期であるため、Promise が返されます。このとき、値は未定義であり、非同期コンポーネントのプレースホルダーである空の仮想ノードが最初にレンダリングされます。ロード後、ファクトリ関数が呼び出され、2 つのパラメータのsolveとrejectを渡します。実行後、成功したコールバックと失敗したコールバックが返されます。Promiseが成功した場合は、resolveが呼び出されます。forceRenderメソッドは次のようになります。ビューの更新と再レンダリングを強制するために、solve で呼び出されます。forceRender で呼び出されるのは $forceUpdate で、その結果は Factory.resolved に置かれます。更新が強制される場合、resolveAsyncComponent メソッドが再度使用されます。今回は判定があり、結果が成功した場合は結果がそのまま戻されますが、このときresolveAsyncComponentの戻り値は未定義ではなく、コンポーネントの作成、初期化、レンダリングが行われます。 ソース コードsrc/core/vdom/create-component.js1.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)) { // 看组件是否是一个函数 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: Class9366e37985177da7839522e36133b6c8 ): Class9366e37985177da7839522e36133b6c8 | 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 | Class9366e37985177da7839522e36133b6c8) => { 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 メソッド
// 创建一个异步组件的占位,空虚拟节点 也就是一个注释4e255cca6c1c1c2b4c46e2b80a10fe99 export function createAsyncPlaceholder ( factory: Function, data: ?VNodeData, context: Component, children: ?Array5b0d6fe0e45e6ae4a1b862182325859d, tag: ?string ): VNode { const node = createEmptyVNode() node.asyncFactory = factory node.asyncMeta = { data, context, children, tag } return node }(学習ビデオ共有:
vuejs 入門チュートリアル 、基本プログラミング ビデオ )
以上がVue が非同期コンポーネントを使用するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。