Vueは動的コンポーネントを使用してTAB切り替え効果を実現します

Vueは動的コンポーネントを使用してTAB切り替え効果を実現します

問題の説明

開発ではタブ切り替えシナリオがよく使用されます。この効果を達成する必要がある場合、私たちはこの効果を達成するために次のような方法を考えることが多いです。

  • 方法 1: display:none; を使用して、DOM 要素の表示と非表示を制御します。これにより、2つのタブの表示と非表示を実現します。ただし、切り替えるタブが 3 つまたは 4 つある場合は、この方法はお勧めできません。
  • 方法 2 は、Vue の v-if または v-show ディレクティブを使用して実装されます。この方法は実装できますが、コードはエレガントではありません。 .vue ファイルに多数の v-if が出現したら何が起こるか想像してみてください。また、v-if を使用する場合は、識別のために多くの変数を宣言する必要があります。だからあまり良い解決策ではない
  • 方法 3: elementui または iview のタブ切り替えコンポーネントを使用する。この方法も問題ありませんが、スタイルを /深く/ 変更する必要がある場合があり、少し面倒です。

作者は、タブ切り替え効果を実現するには、vue の動的コンポーネントを使用する方が便利だと考えています。

Vueの動的コンポーネントとは

Vue の動的コンポーネントは、本質的には依然としてコンポーネントです。簡単に言えば、コンポーネントは js ロジックを備えた UI ビュー レイヤーです。いわゆる動的コンポーネントとは、ページ上の特定の場所に表示される特定のコンポーネントを、いくつかの条件に応じて動的に制御できることを意味します。これはタブを切り替えるような感じですね。

アプリケーションシナリオの説明

需要効果図

実際には、非常にシンプルで、タブを切り替える効果だけです。 もちろん、実際の開発では、タブのスタイル効果はもう少し複雑になる可能性があります。

実装手順

ステップ 1 (新しいコンポーネントを作成し、登録を導入する)

まず、タブ切り替えで表示されるコンテンツ部分として、componentsフォルダ内の4つの.vueファイルを定義し、インポートすることで利用できるようになります。

新しい

インポートと登録

「./components/one」から1つをインポートします。
「./components/two」から2つをインポートします。
「./components/three」から3つをインポートします。
「./components/four」から 4 をインポートします。

コンポーネント:
    1つ、
    二、
    三つ、
    4、
  },

ステップ 2 (レイアウト、タブのクリック ラベルを上部に配置し、対応するコンテンツを表示するコンポーネントを下に配置する)

<テンプレート>
  <div id="アプリ">
    <div class="top">
     <!-- タブのクリック ラベルを配置します -->
    </div>
    <div class="bottom">
      <!-- 対応するコンテンツを表示するために動的コンポーネントを配置します-->
    </div>
  </div>
</テンプレート>

ステップ 3 (上のタブを記入し、ラベルをクリックします)

// まず、クリックされたタブのデータを格納するために、data に配列 cardArr を定義します。data() {
        戻る {
          インデックス: 0,
          カードArr: [
            {
              コンポーネント名: "動的コンポーネント 1",
            },
            {
              コンポーネント名: "動的コンポーネント 2",
            },
            {
              コンポーネント名: "動的コンポーネント 3",
            },
            {
              コンポーネント名: "ダイナミックコンポーネント4",
            },
          ]、
        };
      },
// 次に、v-for ループを使用して <template> を表示します。
      <div id="アプリ">
        <div class="top">
          <div
            クラス="crad"
            :class="{highLight: whichIndex == index }"
            v-for="(アイテム、インデックス) in cardArr"
            :key="インデックス"
            @click="whichIndex = インデックス"
          >
            {{ item.componentName }}
          </div>
        </div>
        <div class="bottom">
          <!-- 動的コンポーネントを配置します... -->
        </div>
      </div>
    </テンプレート>
// ハイライトされた状態が必要なので、最初にハイライトされるインデックス0を設定します。これは、データで定義されたwhichIndexと:classを使用して実現します。 // ​​ハイライトスタイル.highLight {
      ボックスの影: 0 15px 30px rgba(0, 0, 0, 0.2);
      変換: translate3d(0, -1px, 0);
    }

ステップ4 (動的コンポーネントタグ<component/>を使用する)

    // 動的コンポーネント タグ <component/> には is 属性があります。is の値によってコンポーネントの値が決まります。
    // ここでは変数componentIdを使用して保存し、componentIdを<div class="bottom">として表示します。
        <コンポーネント:is="コンポーネントID"></コンポーネント>
    </div>
    
    // デフォルトでは、最初のものを最初に表示します。同時に、cardList 内のコンポーネント名とコンポーネント ID を互いに対応させる必要があります。
    // データは次のように変更する必要があります data() {
        戻る {
          インデックス: 0,
          componentId: "one", // 値は、コンポーネントオブジェクトに登録したインポートされたコンポーネントの名前です。cardArr: [
            {
              コンポーネント名: "動的コンポーネント 1",
              componentId: "one", // 対応する},
            {
              コンポーネント名: "動的コンポーネント 2",
              componentId: "two", // 対応する},
            {
              コンポーネント名: "動的コンポーネント 3",
              componentId: "three", // それに対応する},
            {
              コンポーネント名: "ダイナミックコンポーネント4",
              componentId: "four", // それに対応する},
          ]、
        };
      },

ステップ 5 (タブ コンポーネントをクリックして、対応する componentId 値を動的に変更します)

<テンプレート>
  <div id="アプリ">
    <div class="top">
      <div
        クラス="crad"
        :class="{highLight: whichIndex == index }"
        v-for="(アイテム、インデックス) in cardArr"
        :key="インデックス"
        @クリック="
          whichIndex = インデックス;
          コンポーネントID = アイテム.コンポーネントID; 
        「
      >
          <!-- @click タグ内にセミコロンで区切って複数の操作コードを記述できます -->
        {{ item.componentName }}
      </div>
    </div>
    <div class="bottom">
    <!-- キャッシュ コンポーネントをキープアライブ状態に維持します。これにより、コンポーネントが破棄されず、DOM が再レンダリングされなくなります。
    ブラウザはリフローや再描画を行わないため、パフォーマンスを最適化できます。使用しない場合は、ページの読み込みが遅くなります。
      <キープアライブ>
        <コンポーネント:is="コンポーネントID"></コンポーネント>
      </キープアライブ>
    </div>
  </div>
</テンプレート>

完全なコードは添付されています

<テンプレート>
  <div id="アプリ">
    <div class="top">
      <div
        クラス="crad"
        :class="{highLight: whichIndex == index }"
        v-for="(アイテム、インデックス) in cardArr"
        :key="インデックス"
        @クリック="
          whichIndex = インデックス;
          コンポーネントID = アイテム.コンポーネントID;
        「
      >
        {{ item.componentName }}
      </div>
    </div>
    <div class="bottom">
      <キープアライブ>
        <コンポーネント:is="コンポーネントID"></コンポーネント>
      </キープアライブ>
    </div>
  </div>
</テンプレート>

<スクリプト>
「./components/one」から1つをインポートします。
「./components/two」から2つをインポートします。
「./components/three」から3つをインポートします。
「./components/four」から 4 をインポートします。
エクスポートデフォルト{
  コンポーネント:
    1つ、
    二、
    三つ、
    4、
  },
  データ() {
    戻る {
      インデックス: 0,
      コンポーネントID: "1",
      カードArr: [
        {
          コンポーネント名: "動的コンポーネント 1",
          コンポーネントID: "1",
        },
        {
          コンポーネント名: "動的コンポーネント 2",
          コンポーネントID: "2",
        },
        {
          コンポーネント名: "動的コンポーネント 3",
          コンポーネントID: "3",
        },
        {
          コンポーネント名: "ダイナミックコンポーネント4",
          コンポーネントID: "4",
        },
      ]、
    };
  },
};
</スクリプト>

<style lang="less" スコープ>
#アプリ {
  幅: 100%;
  高さ:100vh;
  ボックスのサイズ: 境界線ボックス;
  パディング: 50px;
  .トップ{
    幅: 100%;
    高さ: 80px;
    ディスプレイ: フレックス;
    コンテンツの両端揃え: スペースを空ける;
    .crad {
      幅: 20%;
      高さ: 80px;
      行の高さ: 80px;
      テキスト配置: 中央;
      背景色: #fff;
      境界線: 1px 実線 #e9e9e9;
    }
    .ハイライト{
      ボックスの影: 0 15px 30px rgba(0, 0, 0, 0.2);
      変換: translate3d(0, -1px, 0);
    }
  }
  。底 {
    上マージン: 20px;
    幅: 100%;
    高さ: calc(100% - 100px);
    境界線: 3px ピンク
    ディスプレイ: フレックス;
    コンテンツの中央揃え: 中央;
    アイテムの位置を中央揃えにします。
  }
}
</スタイル>

上記は、Vue が動的コンポーネントを使用して TAB 切り替え効果を実現する方法の詳細です。Vue が動的コンポーネントを使用して TAB 切り替え効果を実現する方法の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • タブ切り替え効果を実現するVue動的コンポーネント
  • 動的コンポーネントを使用して Vue でタブ切り替え効果を実現する
  • Vue はページ切り替えスライド効果を実装します
  • Vue で動的な選択状態切り替え効果を実現する方法

<<:  MySQLデータベースの管理者パスワードを忘れた場合の解決策

>>:  Linux ネットワークプログラミングにおけるソケットオプションの実装

推薦する

Nginx を使用して DoNetCore を Alibaba Cloud にデプロイする方法

基本的な環境設定まずはご自身でドメイン名とサーバーを購入してくださいクラウドサーバーECSに基づいて...

Vueカスタムコンポーネントはイベント修飾子を使用してピットレコードを踏む

序文今日、自作のコンポーネントを使っていたところ、突然、長い間忘れていたバブリングイベントに遭遇しま...

MySQL スケジュールタスク例チュートリアル

序文MySQL 5.1.6 以降、非常にユニークな機能であるイベント スケジューラが追加されました。...

MySQL binlog ログを開く方法

binlog は、すべての mysql dml 操作を記録するバイナリ ログ ファイルです。 bin...

Nginx でアクセス頻度、ダウンロード速度、同時接続数を制限する方法

1. アクセス頻度、同時接続、ダウンロード速度を制限するために使用されるモジュールと命令の概要ngx...

Vue+express+Socketでチャット機能を実現

この記事では、チャット機能を実現するためのVue+express+Socketの具体的なコードを参考...

ウェブページコンテンツの閲覧設計手法に関する議論

<br />コンテンツ ページの記事の場合、記事が長すぎる場合やカテゴリ (ランキング)...

XHTML コードで Marquee タグを使用する方法

フォーラムで、ネットユーザーの jeanjean20 が、Marquee を標準に適合させる方法につ...

MySQL の遅いクエリの例

導入スロークエリログを有効にすると、MySQL は指定された時間を超えるクエリステートメントを記録で...

Vue プロジェクトを使用して複数のプロキシを構成する際の注意事項

Vue プロジェクトの開発プロセスでは、ローカル デバッグの利便性のため、通常、vue.config...

JavaScript でウェブ プレーヤーを実装する

今日は、JavaScript を使用して Web ページ上にプレーヤーを作成する方法を紹介します。誰...

Vueはページを更新するために3つの方法を使用する

プロジェクトを作成しているときに、ユーザーがアクションを実行し、特定の状態を変更し、ページを更新して...

MySQL インフラストラクチャ チュートリアル: クエリ ステートメント実行プロセスの詳細な説明

序文私は以前から、SQL 文がどのように実行され、どのような順序で実行されるのかを知りたいと思ってい...

Linux デスクトップ用の 4 つのスキャン ツール

ペーパーレスの世界はまだ到来していませんが、書類や写真をスキャンすることで紙をなくす人が増えています...