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

推薦する

docker runの--rmオプションの使用方法

Docker コンテナが終了しても、デバッグを容易にし、ユーザー データを保持するために、デフォルト...

JavaScript でロジック判定コードを最適化する方法

序文日常生活で使用する論理的判断文には、if...else...、switch...case...、...

Vue の img の src 画像アドレスの動的スプライシングの問題について

Vue での img の動的スプライシングを見てみましょう。src 画像アドレス、具体的な内容は次の...

Dockerデータボリューム操作の実装

データボリュームの使用開始先ほどのケースでは、ホストからコンテナにデータをコピーする必要がある場合、...

Vue スキャフォールディング学習プロジェクト作成方法

1. 足場とは何ですか? 1. Vue CLI Vue CLI は、Vue.js をベースにした迅速...

Docker で Node.js をデプロイする方法

序文プロジェクトでは中間層としてNodeを使用し、Nodeのデプロイにはdockerを使用します。こ...

MySQLクエリのソートとページング関連

概要通常、データベース内のデータを直接表示することは望ましくないため、最後の 2 つのセクションでは...

MySQL関数の包括的な概要

目次1. MySQLでよく使われる文字列関数2. 数値関数3. 日付と時刻の機能4. プロセス機能5...

MySQLのint主キーの自己増分の問題を解決する

導入MySQL データベースを使用する場合、int を主キーとして使用し、自動インクリメントに設定す...

WeChat公式アカウントでReactプロジェクトを実行する方法

目次1. a タグを使用して PDF をプレビューまたはダウンロードします。書き方は、携帯電話でクリ...

Linuxコマンドとファイル検索の詳しい説明

1. ファイル名検索を実行するwhich ('実行可能ファイル' を検索) //PA...

LinuxテキストエディタVimの詳しい説明

Vim は強力なフルスクリーン テキスト エディターであり、Linux/UNIX で最も一般的に使用...

CSS 配送先住所平行四辺形線スタイルの例コード

コードは次のようになります。 // 配送先住所の平行四辺形の線のスタイル <view clas...

Centos7 での mysql 8.0.15 のインストールと設定

この記事では、参考までにMySQL 8.0.15のインストールと設定のグラフィックチュートリアルを紹...

Centos7.6にTomcat-8.5.39をインストールする方法

Centos7.6 に Tomcat-8.5.39 をインストールする方法は次のとおりです。詳細は次...