Vue の高度な使用方法チュートリアル 動的コンポーネント

Vue の高度な使用方法チュートリアル 動的コンポーネント

開発プロセスでは、ほとんどの場合、動的コンポーネントが使用されると思います。異なるコンポーネント間で状態を切り替える必要がある場合、動的コンポーネントはニーズを非常にうまく満たすことができます。その中核となるのは、コンポーネント タグと is 属性の使用です。

基本的な説明

// ビュー
<div id="アプリ">
  <button @click="changeTabs('child1')">子1</button>
  <button @click="changeTabs('child2')">子2</button>
  <button @click="changeTabs('child3')">子3</button>
  <コンポーネント :is="タブを選択">
  </コンポーネント>
</div>
// js
var 子1 = {
  テンプレート: '<div>content1</div>',
}
var 子2 = {
  テンプレート: '<div>content2</div>'
}
var 子3 = {
  テンプレート: '<div>content3</div>'
}
var vm = 新しい Vue({
  el: '#app',
  コンポーネント:
    子供1、
    子供2、
    子供3
  },
  メソッド: {
    タブを変更する
      this.chooseTabs = タブ;
    }
  }
})

AST 解析

<component> の解釈は、これまでの記事と同様です。まずは AST 解析の段階から始めます。このプロセスでは細部にまで焦点を当てるのではなく、これまでの処理方法との違いを具体的に説明します。動的コンポーネント解析の違いは、processComponent に焦点が当てられています。タグに is 属性が存在するため、最終的な ast ツリーにコンポーネント属性がマークされます。

// 動的コンポーネントの分析 function processComponent (el) {
  var バインディング;
  // is属性に対応する値を取得します if ((binding = getBindingAttr(el, 'is'))) {
    // ast ツリーには追加のコンポーネント属性があります el.component = binding;
  }
  getAndRemoveAttr(el, 'インラインテンプレート') != null の場合 {
    el.inlineTemplate = true;
  }
}

レンダリング機能

ast ツリーの次のステップは、ast ツリーに基づいて実行可能なレンダリング関数を生成することです。コンポーネント属性により、レンダリング関数の生成プロセスは genComponent ブランチを経由します。

//レンダリング関数生成関数 var code = generate(ast, options);

// 生成関数の実装 function generate (ast,options) {
  var state = new CodegenState(オプション);
  var code = ast ? genElement(ast, state): '_c("div")';
  戻る {
    レンダリング: ("with(this){return " + code + "}"),
    静的レンダリング関数: state.staticRenderFns
  }
}

関数genElement(el, state) {
  ···
  var コード;
  // 動的コンポーネントブランチ if (el.component) {
    コード = genComponent(el.component, el, 状態);
  }
}

動的コンポーネントの処理ロジックは、実は非常に単純です。インライン テンプレート フラグ (後述) がない場合、後続の子ノードがスプライシング用に取得されます。通常のコンポーネントとの唯一の違いは、_c の最初のパラメーターが指定された文字列ではなく、コンポーネントを表す変数になっていることです。

// 動的コンポーネントの処理関数 genComponent (
    コンポーネント名、
    エル、
    州
  ){
    // inlineTemplate属性が設定されている場合、childrenはnullになります
    var children = el.inlineTemplate ? null : genChildren(el, state, true);
    
    戻り値: ("_c(" + コンポーネント名 + "," + (genData$2(el, 状態)) + 
    (子供 ? ("," + 子供) : '') + ")")
  }

通常コンポーネントと動的コンポーネントの比較

通常のコンポーネントのレンダリング機能

"with(this){return _c('div',{attrs:{"id":"app"}},[_c('child1',[_v(_s(test))])],1)}"

動的コンポーネントレンダリング機能

"with(this){return _c('div',{attrs:{"id":"app"}},[_c(chooseTabs,{tag:"component"})],1)}"

簡単にまとめると、動的コンポーネントと通常のコンポーネントの違いは次のとおりです。

  1. コンポーネント属性はastステージに追加され、動的コンポーネントの兆候である。
  2. レンダリング関数生成フェーズでは、コンポーネント属性が存在するため、genComponent ブランチが実行されます。genComponent は、動的コンポーネントの実行関数に対して特別な処理を実行します。通常のコンポーネントとは異なり、_c の最初のパラメータは不変の文字列ではなく、指定されたコンポーネント名の変数になります。
  3. レンダリングから vnode までのプロセスは、文字列が変数に置き換えられ、データ属性が { tag: 'component' } になることを除いて、通常のコンポーネントと同じです。この例では、chooseTabs は child1 を取得します。

ファクトリ関数形式の動的コンポーネント

次のように、ファクトリ関数の形式で動的コンポーネントを使用することもできます。

const AsyncComponent = () => ({

  // ロードするコンポーネント(`Promise` オブジェクトである必要があります)

  コンポーネント: import('./MyComponent.vue'),

  //非同期コンポーネント読み込み時に使用されるコンポーネント読み込み: LoadingComponent、

  // 読み込み失敗時に使用されるコンポーネント error: ErrorComponent,

  // ロード中のコンポーネントの遅延時間を表示します。デフォルト値は200(ミリ秒)です

  遅延: 200、

  // タイムアウトが指定されていてコンポーネントの読み込みがタイムアウトした場合、

  // 読み込みに失敗した場合に使用したコンポーネントを使用します。デフォルト値は: `Infinity`

  タイムアウト: 3000

});



コンポーネント:

  非同期コンポーネント、

},

要約する

Vue 動的コンポーネントの高度な使用法に関するこの記事はこれで終わりです。Vue 動的コンポーネントに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue 動的コンポーネントインスタンス分析
  • Vue の動的コンポーネントと非同期コンポーネントの例の詳細な説明
  • Vue 動的サブコンポーネントを実装する 2 つの方法
  • Vueでコンポーネントを動的に作成する2つの方法
  • Vueカスタム動的コンポーネントの例の詳細な説明
  • フロントエンドアーキテクチャで Vue 動的コンポーネントを使用する基本的なチュートリアル

<<:  Docker Composeでコンテナ管理の問題を解決する

>>:  HTML入力ボックスの最適化により、ユーザーエクスペリエンスと使いやすさが向上します。

推薦する

MySQL における単一テーブルと複数テーブル、およびビューと一時テーブルに対する Update と Select の違い

1. テーブルAのデータを使用してMySQLのテーブルBの内容を更新するたとえば、データ テーブル内...

MySQL における冗長インデックスと重複インデックスの違い

MySQL では、1 つの列に複数のインデックスを作成できます。意図的であるかどうかにかかわらず、M...

React イベントバインディングの詳細

目次クラスコンポーネントイベントバインディング関数コンポーネントイベントバインディング要約するRea...

MySql Group Byは複数のフィールドのグループ化を実装します

日常の開発タスクでは、データ テーブル内のグループ化フィールドに基づいて統計データを取得するために、...

MySQL 接続例外とエラー 10061 の解決方法

MySQL は、スウェーデンの会社 MySQL AB によって開発されたリレーショナル データベース...

innerHTML アプリケーション

ブランクのブログ: http://www.planabc.net/ innerHTML プロパティは...

CSS3は三角形の連続拡大効果を実現します

1. CSS3の三角形は特殊効果でズームし続けます11.1 画像プレビュー 11.2 index.h...

div 内の img と span の垂直方向の中央揃えの問題について

以下のように表示されます。 XML/HTML コードコンテンツをクリップボードにコピー<htm...

React-Native スクリーンショットコンポーネント react-native-view-shot の紹介と使い方のまとめ

目次1. 現象2. 解決策3. 要約: 1. 現象1. 要件: 特定の表示ページをキャプチャしてアル...

Centos7.9 で独立したメール サーバーを構築するための詳細な手順

目次序文1. イントラネットDNS AレコードとMXレコードを構成する2. メールサーバの初期化設定...

CSS カウンターを使用して数字の順序付きリストを美しく表示する方法

Web デザインでは、Web サイトに表示されるデータの構造とコンテンツをユーザーが明確に理解できる...

5つのクールで実用的なHTMLタグと属性の紹介

実はこれもクリックベイトのタイトルであり、「派手」とは言えません。ただ私が無知で、こうしたラベルを見...

Docker Nginxコンテナの制作と展開の実装方法

クイックスタート1. Docker Hubでnginxイメージを見つけるdocker 検索 ngin...

Dockerコンテナでyumを呼び出すときのエラーの解決方法

dockerfile またはコンテナ内で yum を実行すると、エラーが報告され、ソースが見つかりま...

SSDストレージを有効にしたMySQLインスタンスの詳細な説明

SSDストレージを有効にしたMySQLインスタンスの詳細な説明特に OS と MySQL が同じディ...