Vue の動的コンポーネントと非同期コンポーネントの詳細な理解

Vue の動的コンポーネントと非同期コンポーネントの詳細な理解

1. 動的コンポーネント

<!DOCTYPE html>
<html>
<ヘッド>
 <メタ文字セット="utf-8">
 <スタイル>
		#アプリ {
			フォントサイズ: 0
		}
		.dynamic-component-demo-tab-button {
			パディング: 6px 10px;
			左上の境界線の半径: 3px;
			右上の境界線の半径: 3px;
			境界線: 1px 実線 #ccc;
			カーソル: ポインタ;
			下マージン: -1px;
			右マージン: -1px;
			背景: #f0f0f0;
		}
		.dynamic-component-demo-tab-button.dynamic-component-demo-active {
			背景: #e0e0e0;
		}
		.dynamic-component-demo-tab-button:hover {
			背景: #e0e0e0;
		}
		.dynamic-component-demo-posts-tab {
			ディスプレイ: フレックス;					
		}
		.dynamic-component-demo-tab {
			フォントサイズ: 1rem;
			境界線: 1px 実線 #ccc;
			パディング: 10px;
		}
		.dynamic-component-demo-posts-sidebar {
			最大幅: 40vw;
			マージン: 0 !重要;
			パディング: 0 10px 0 0 !重要;
			リストスタイルタイプ: なし;
			右境界線: 1px 実線 #ccc;
			行の高さ: 1.6em;
		}
		.dynamic-component-demo-posts-sidebar li {
			空白: ラップなし;
			テキストオーバーフロー: 省略記号;
			オーバーフロー: 非表示;
			カーソル: ポインタ;
		}
		.dynamic-component-demo-active {
			背景: 水色;
		}
		.dynamic-component-demo-post-container {
			左パディング: 10px;
		}
		.dynamic-component-demo-post > :first-child {
			上マージン: 0 !重要;
			パディングトップ: 0 !重要;
		}
 </スタイル>
 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<本文>
<div id="アプリ">
	<button v-for="タブ内のタブ" class="dynamic-component-demo-tab-button" 
		v-bind:class="{'dynamic-component-demo-active': タブ === currentTab}" 
		@click="currentTab = tab">{{ tab }}</button>	
	<キープアライブ>
		<コンポーネント v-bind:is="currentTabComponent"></コンポーネント>
	</キープアライブ>
</div>
<スクリプト>
 Vue.component('タブ投稿', {
		データ: 関数(){
			戻る {
				投稿:
					{id: 1、タイトル: 「Cat Ipsum」、コンテンツ: 「嵐が過ぎ去るのを待ち続けます...」}、
					{id: 2、タイトル: 'ヒップスター イプサム'、コンテンツ: 'ブッシュウィック ブルー ボトル シーンスター ...'}、
					{id: 3、タイトル: 「カップケーキイプサム」、コンテンツ: 「アイシングデザートスフレ...」}、
				]、
				選択された投稿: null
			}
		},
 テンプレート: `<div class="dynamic-component-demo-posts-tab dynamic-component-demo-tab">
						<ul class="ダイナミックコンポーネントデモ投稿サイドバー">
							<li v-for="投稿内の投稿" 
								v-bind:key="post.id" 
								v-on:click="selectedPost = 投稿" 
								v-bind:class="{'dynamic-component-demo-active': post===selectedPost}">
								{{投稿.title}}
							</li>
						</ul>
						<div class="dynamic-component-demo-post-container">
							<div v-if="選択された投稿" クラス="動的コンポーネントデモ投稿">
								<h3>{{ 選択された投稿.タイトル }}</h3>
								<div v-html="選択された投稿.content"></div>
							</div>
							<strong v-else>
								左側のブログタイトルをクリックすると表示されます。
							</strong>
						</div>
					</div>`
 });
	
	Vue.component('タブアーカイブ', {
		テンプレート: '<div class="dynamic-component-demo-tab">アーカイブ コンポーネント</div>'
	});

 新しいVue({
 el: '#app',
		データ: {
			currentTab: '投稿',
			タブ: ['投稿', 'アーカイブ']
		},
		計算: {
			現在のタブコンポーネント: 関数(){
				'tab-' + this.currentTab.toLowerCase() を返す
			}
		}
 });
</スクリプト>
</本文>
</html> 

動的コンポーネントでキープアライブを使用すると、コンポーネントが切り替えられたときにコンポーネントの状態を維持できるため、レンダリングの繰り返しによって発生するパフォーマンスの問題を回避できます。

2. 非同期コンポーネント

Vue では、コンポーネントをファクトリ関数として定義することができ、これによりコンポーネント定義が非同期的に解決されます。

Vue.component('async-example', 関数(resolve, deny) {})

ここでは、Vue.js のコンポーネントの基礎を復習できます。

非同期コンポーネントを導入するために、webpack にバンドルされた Vue プロジェクトを使用します。

<!-- HelloWorld.vue -->
<テンプレート>
 <div>
 <h2 class="title">{{メッセージ}}</h2>
 </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
 データ () {
 戻る {
 メッセージ: 'こんにちは、Vue!'
 }
 }
}
</スクリプト>

<!-- CSS をこのコンポーネントのみに制限するために "scoped" 属性を追加します -->
<スタイルスコープ>
 。タイトル {
 パディング: 5px;
 色: 白;
 背景: グレー;
 }
</スタイル>
<!-- App.vue -->
<テンプレート>
 <div id="アプリ">
 <こんにちは世界/>
 </div>
</テンプレート>

<スクリプト>
'./components/HelloWorld' から HelloWorld をインポートします。

エクスポートデフォルト{
 名前: 'アプリ'、
 コンポーネント:
 こんにちは世界
 }
}
</スクリプト>

<スタイル>
</スタイル>

App.vue の <script> タグの内容を次のように変更します。

エクスポートデフォルト{
 名前: 'アプリ'、
 コンポーネント:
 HelloWorld: () => import('./components/HelloWorld')
 }
}

これは、App コンポーネントが HelloWorld コンポーネントを非同期的にロードする機能を実装します。

オンデマンドロードを実現できます。

<!-- App.vue -->
<テンプレート>
 <div id="アプリ">
 <button @click="show = true">ツールチップを読み込む</button>
 <div v-if="表示">
 <こんにちは世界/>
 </div>
 </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
 データ: () => ({
 表示:偽
 })、
 コンポーネント:
 HelloWorld: () => import('./components/HelloWorld')
 }
}
</スクリプト>

<スタイル>
</スタイル>

ここでの非同期コンポーネント ファクトリ関数は、次の形式でオブジェクトを返すこともできます。

const AsyncComponent = () => ({
 // ロードするコンポーネント(`Promise` オブジェクトである必要があります)
 コンポーネント: import('./MyComponent.vue'),
 //非同期コンポーネント読み込み時に使用されるコンポーネント読み込み: LoadingComponent、
 // 読み込み失敗時に使用されるコンポーネント error: ErrorComponent,
 // ロード中のコンポーネントの遅延時間を表示します。デフォルト値は200(ミリ秒)です
 遅延: 200、
 // タイムアウトが指定されていてコンポーネントの読み込みがタイムアウトした場合、
 // 読み込みに失敗した場合に使用したコンポーネントを使用します。デフォルト値は: `Infinity`
 タイムアウト: 3000
})

参照:

動的コンポーネントと非同期コンポーネント — Vue.js

上記は、Vue 動的コンポーネントと非同期コンポーネントの詳細な理解に関する内容です。Vue 動的コンポーネントと非同期コンポーネントの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Vue3 非同期データ読み込みコンポーネントサスペンスの使い方
  • Vue3.0+vite2は動的非同期コンポーネントの遅延読み込みを実装します
  • Vueはオンデマンドのコンポーネント読み込みと非同期コンポーネント機能を実装します
  • Vueの動的コンポーネントと非同期コンポーネントの詳細な説明
  • Vueコンポーネント開発における非同期コンポーネントの詳細な説明

<<:  docker イメージのプル速度が遅い問題の解決策

>>:  MySQLデータをOracleに移行する正しい方法

推薦する

Tomcat マルチインスタンスの展開と構成の原則

1. ファイアウォールをオフにし、Tomcatのインストールに必要なソフトウェアパッケージを/opt...

Docker はクラスター MongoDB 実装手順を構築します

序文会社の業務上のニーズにより、独自の MongoDB サービスを構築する予定です。MongoDB ...

JavaScript を使用してタイムラインとアニメーション効果を実装するためのサンプル コード (フロントエンドのコンポーネント化)

目次コードのクリーニングJavaScript の「フレーム」 「フレーム」の実装方法1. 間隔を設定...

設定ファイルを変更した後、操作を再開します

余計なことは言わないで、コードだけ見てみましょう〜 # docker-compose をダウン # ...

Vue は無限ロードウォーターフォールフローを実装します

この記事では、参考までに、無限ロードウォーターフォールフローを実現するためのVueの具体的なコードを...

Linux サーバーに SSH パスワードなしでログインする方法

テスト サーバーにログインするたびに、必ず ssh ログインのパスワードを入力する必要があります。ロ...

MySQLがウィンドウ関数で合計関数を実行するときに発生する可能性のあるバグ

MySql のウィンドウ関数を使用して統計データを収集する際に、小さな問題が見つかったので、それにつ...

CentOS で LibreOffice を使用してドキュメント形式を変換する方法

プロジェクト要件では、アップロードされたドキュメントの前処理が必要です。ユーザーが doc 形式でド...

海外のウェブページのカラーマッチング事例20選共有

この記事では、優れた Web ページのカラー マッチングの事例を 20 件集めて紹介します。これらの...

nginx+WordPressで個人ブログを構築するプロセス全体の詳細な説明

0x00 はじめにWordPress は、世界で最も人気のある CMS システムです。PHP と M...

Vue3とTypeScriptを組み合わせたプロジェクト開発の実践の概要

目次概要1. コンポジションAPI 1. ref と reactive の違いは何ですか? 2. 周...

HTML マルチヘッダーテーブルコード

1. マルチヘッダーテーブルコードコードをコピーコードは次のとおりです。 <!DOCTYPE ...

Dockerコンテナのデータボリュームの詳細な説明

何ですかまず、Docker の概念を見てみましょう。アプリケーションと実行環境をコンテナにパッケージ...

重複データの処理に関するMySQL学習ノート

MySQLは重複データを処理します一部の MySQL テーブルには重複レコードが含まれている場合があ...

Linux 環境の Apache サーバーでセカンダリドメイン名を設定する方法の詳細な説明

この記事では、Linux 環境の Apache サーバーでセカンダリ ドメイン名を構成する方法につい...