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 ネットワークプログラミングにおけるソケットオプションの実装

推薦する

Vue ページでよりエレガントに画像を紹介する方法

目次エラーのデモンストレーション計算により画像が変わらない場合は直接インポートするCSS変数による画...

Tomcat のパフォーマンス最適化のための Apr モジュールの構築方法

序文Tomcat は、無数のチューニング オプションを備えた、広く使用されている Java Web ...

レスポンシブ Web をデザインするにはどうすればいいですか?レスポンシブウェブデザインのメリットとデメリット

最近レスポンシブ デザインについて学んでいて、これについていくつか整理してみました。写真の一部はイン...

SSHパスワードフリーログイン設定方法の詳しい説明(画像とコマンド)

まず、私たちがやりたいことは、serverA の usera を使用して、パスワードなしで serv...

Vue プロジェクトにおけるトランジション コンポーネントの適用の概要

​Vue のトランジションは、アニメーション トランジションをカプセル化するコンポーネントです。一般...

Bツリーの削除プロセスの紹介

前回の記事 https://www.jb51.net/article/154157.htm では、B...

MySQL マスタースレーブレプリケーションと読み取り書き込み分離の詳細な説明

目次序文1. 概要2. 読み取りと書き込みの分離3. MySQL マスタースレーブレプリケーションの...

Vue は書籍管理ケースを実装します

この記事では、書籍管理を実装するためのVueの具体的なコードを例として紹介します。具体的な内容は次の...

jQueryはフォーム検証機能を実装します

jQuery フォーム検証の例 / ユーザー名、パスワード、住所、電子メールの検証を含む下記の通り ...

JSONオブジェクトのキーを置き換える最良の方法

JSON (JavaScript Object Notation、JS Object Notatio...

Win10にmysql8.0.15 winx64をインストールしてサーバーに接続する際に問題が発生しました

1. mysql-8.0.15をダウンロード、インストール、設定する1. 公式サイト (https:...

Red Hat Enterprise Linux 8 をベースにした CentOS 8 が正式にリリースされました

CentOS プロジェクトは、Red Hat の再配布要件に完全に準拠した、Red Hat Ente...

HTML 特殊文字エンコーディング CSS3 コンテンツに関する簡単な説明:「私は特別なシンボルです」

プロジェクトで使用されている特殊文字とアイコンHTMLコードXML/HTML コードコンテンツをクリ...

Web デザイン リファレンス Firefox デフォルト スタイル

W3C は HTML の標準をいくつか確立していますが、ブラウザは独自の定義済みスタイルに従って W...

MySQLのジョイントクエリについて詳しく説明します

目次ユニオンクエリ1. 中国の各省のIDと名前を照会する2. 湖南省のすべての地級市のIDと名称3....