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に移行する正しい方法

推薦する

MySQL の大きなデータ テーブルにフィールドを追加する方法

序文フィールドの追加は誰でもよく知っていると思います。簡単に記述できます。MySQL テーブルにフィ...

最小限のルートファイルシステムを構築するためにbusyboxを移植するための詳細な手順

Busybox: 小さなコマンドが詰まったスイスアーミーナイフ。ステップ1: ディレクトリ構造を作成...

MySQLの共同クエリ最適化メカニズムの詳細な説明

目次MySQL フェデレーテッド クエリ実行戦略。実行計画フェデレーテッドクエリオプティマイザーMy...

Vueのwatch、computed、methodsの違いのまとめ

目次1 はじめに2 基本的な使い方2.1 方法2.2 計算プロパティ2.3 リスナーを見る3 3つの...

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

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

Nginx 仮想ホストを構成する 3 つの方法 (ポートベース) の詳細な説明

Nginx は、IP ベースの仮想ホスト構成、ポート ベースの仮想ホスト構成、ドメイン名ベースの仮想...

vue data が関数である理由をご存知ですか?

公式サイトの説明: コンポーネントを定義する場合、コンポーネントは複数のインスタンスを作成するために...

MySQL データベースの必須条件クエリ ステートメント

目次1. 基本的な文法2. 条件式によるフィルタリング3. 論理式によるフィルタリング4. あいまい...

安全な構成のためにDockerでTLSを有効にする手順

序文以前、Docker の 2375 Remote API を有効にしていました。会社のセキュリティ...

js の toString メソッドの 3 つの機能

目次1. toStringメソッドの3つの機能2. オブジェクトを表す文字列を返す3. カスタム t...

Linux で NFS のワンクリック展開を実装する方法

サーバー情報管理サーバー: m01 172.16.1.61サーバー: nfs01 172.16.1....

DockerにMySQLをインストールする方法

最近 Django を導入しましたが、MySQL を手動でインストールしたくなかったので、Docke...

MySQL データベースのインデックス順序の詳細な説明

目次事件の原因解剖学ファイルの並べ替えファイルのソートが非常に遅いのですが、他に解決策はありますか?...

ドラッグフォトウォールを実現するネイティブJS

この記事では、ネイティブ JS で実装されたドラッグ可能な写真ウォールを紹介します。効果は次のとおり...