Vue コンポーネントの切り替え、動的コ​​ンポーネント、コンポーネントのキャッシュについて

Vue コンポーネントの切り替え、動的コ​​ンポーネント、コンポーネントのキャッシュについて

背景:

  • コンポーネントベースの開発モデルでは、プロジェクト全体を多数のコンポーネントに分割し、それらを適切な方法で整理して、目的の効果を実現します。
  • ページは複数のコンポーネントで構成されているため、当然、コンポーネント間の切り替えの問題があります。Vue では動的コンポーネントの概念も提案されており、これによりコンポーネント間の切り替え効果をより適切に実現できます。ただし、Vue でのコンポーネントの切り替えは、実際にはコンポーネント自体の再作成と破棄のプロセスです。シナリオによっては、コンポーネントの再作成と再レンダリングを望まない場合があります。

実際のシナリオ:ユーザーは、リスト ページ --> 詳細ページ --> リスト ページの順に操作します。このとき、期待される効果は、ユーザーが詳細ページからリスト ページに戻ったときに、元のページが再レンダリングされるのではなく、変更されないままになることです。このとき、ユーザーがリスト ページから詳細ページに切り替えるときに、元のリスト ページをキャッシュする必要があります。

この記事では主にVueにおけるコンポーネントの切り替えとキャッシュソリューションについて紹介します

1. コンポーネント切り替え方式

方法1: v-ifとv-elseを使用する

// 変数フラグが true の場合、comp-a コンポーネントが表示され、そうでない場合は comp-b コンポーネントが表示されます <comp-a v-if="flag"></comp-a>

<comp-b v-else></comp-b>

方法 2: 組み込みコンポーネントを使用する: <component></component>

// クリックするとログイン、登録、終了コンポーネントが切り替わります <template>
     <div>
        <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click.prevent="comName = 'login'">ログイン</a>
        <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click.prevent="comName = 'register'">登録</a>
        <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click.prevent="comName = 'logOut'">ログアウト</a>
        
        // <component></component> は対応する名前のコンポーネントを表示します。これはプレースホルダーに相当します // :is 属性はコンポーネント名を指定します <component :is="comName"></component>
      </div>
    </テンプレート>

方法3: vue-router

// ルーティングルール:
  {
    パス: '/login',
    名前: 'ログイン',
    コンポーネント: () => import('../views/login.vue')
  },
  {
    パス: '/register',
    名前: 'レジスタ',
    コンポーネント: () => import('../views/register.vue')
  },
  
  //コンポーネントを表示する場所:
   <ルータービュー />

2. コンポーネントのキャッシュ: キープアライブ

この記事の冒頭の実際のシナリオのように、コンポーネントを破棄して再構築するのではなく、必要に応じてコンポーネントをキャッシュします。

1.キープアライブの定義

<keep-alive>が動的コンポーネントをラップすると、非アクティブなコンポーネント インスタンスは破棄されるのではなくキャッシュされます。

<keep-alive> は抽象コンポーネントです。DOM要素自体はレンダリングされず、親コンポーネント チェーンにも表示されません。 <keep-alive>内でコンポーネントが切り替えられると、それに応じてactivatedおよびdeactivatedライフサイクル フック関数が実行されます。

2.キープアライブライフサイクル

活性化された

keep-aliveコンポーネントがアクティブ化されたときに呼び出されます。このフック関数は、サーバー側のレンダリング中には呼び出されません。

無効化

このフックはkeep-aliveコンポーネントが無効になっているときに呼び出されます。サーバー側のレンダリング中には呼び出されません。

keep-aliveで作成されたコンポーネントには、 activateddeactivated 2つのライフサイクルフックが追加されます。
keep-aliveを使用すると、データがメモリ内に保持されます。ページに入るたびに最新のデータを取得したい場合は、アクティブ化フェーズでデータを取得し、元のcreatedフック関数でデータを取得するタスクを引き受ける必要があります。

注意:これら 2 つのライフサイクル関数は、コンポーネントが keep-alive でラップされている場合にのみ呼び出されます。通常のコンポーネントとして使用される場合、これらは呼び出されません。バージョン 2.1.0 以降では、exclude を使用した後、keep-alive でラップされていても、これら 2 つのフック関数は呼び出されません。なお、このフック関数はサーバー側でレンダリングするときには呼び出されません。

キャッシュが設定されているコンポーネント:

  • 最初のエントリ: beforeRouterEnter ->created->…->activated->…->deactivated> beforeRouteLeave
  • 後続のエントリ: beforeRouterEnter ->activated->deactivated> beforeRouteLeave

3. キープアライブの使い方

1. 小道具

include - 文字列または配列、正規表現。名前が一致するコンポーネントのみがキャッシュされます --> includeの値はコンポーネントのnameです。
exclude - 文字列または正規表現。名前が一致するコンポーネントはキャッシュされません。
max : 数値。キャッシュできるコンポーネントの最大数。

2. <component></component> で使用する

  <テンプレート>
     <div>
        <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click.prevent="comName = 'login'">ログイン</a>
        <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click.prevent="comName = 'register'">登録</a>
        <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click.prevent="comName = 'logOut'">ログアウト</a>
     
     // ログイン コンポーネントがキャッシュされます。include が設定されていない場合、<component></component> にマウントされているすべてのコンポーネントがデフォルトでキャッシュされます。// 指定された複数のコンポーネントをキャッシュします include = ['login', 'register']
      <キープアライブを含める="ログイン">
          <コンポーネント:is="comName"></コンポーネント>
      </キープアライブ>    
      </div>
    </テンプレート>

3. <router-view /> ルーティングで使用する

ルーティングmeta情報のkeepAlive属性を設定する必要があります
keep-aliveコードは v-if と組み合わせてラップすることができます。meta のkeepAlive trueの場合はキャッシュされ、そうでない場合はキャッシュされません。これにより、より柔軟になります。

 {
    パス: '/login',
    名前: 'ログイン',
    コンポーネント: () => import('../views/login.vue')
    メタ:{
        keepAlive : true // ログインコンポーネントはキャッシュされます}
  },
  {
    パス: '/register',
    名前: 'レジスタ',
    コンポーネント: () => import('../views/register.vue'),
      メタ:{
        keepAlive : false // レジスタコンポーネントはキャッシュされません}
  },

<ルータービュー />:

<div id="アプリ">
    <キープアライブ> 
    <!-- キャッシュする必要があるコンポーネントを表示します-->
        <router-view v-if="$route.meta.keepAlive"> </router-view>
    </キープアライブ>
    
    <!-- キャッシュを必要としないコンポーネントを表示します --> 
    <router-view v-if="!$route.meta.keepAlive"> </router-view>
</div>

4. キャッシュコンポーネントをクリアする

 // beforeRouteLeave() フック // 詳細ページに移動するかどうかを決定する beforeRouteLeave(to, from, next) {
      to.path === "/goods_detail"の場合{
        メタキープアライブ = true;
      } それ以外 {
        from.meta.keepAlive = false;
        // this.$destroy()
      }
      次();
    }

これで、vue コンポーネントの切り替え、動的コ​​ンポーネント、コンポーネントのキャッシュに関するこの記事は終了です。vue コンポーネントの切り替え、動的コ​​ンポーネント、コンポーネントのキャッシュに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue 動的コンポーネントと v-once ディレクティブの実装
  • vue.js 動的コンポーネントの詳細な説明
  • Vueは動的コンポーネントを使用してTAB切り替え効果を実現します
  • Vue3 の動的コンポーネントはどのように機能しますか?
  • Vue の動的コンポーネントと非同期コンポーネントの詳細な理解
  • Vueコンポーネントの動的コンポーネントの詳細な説明

<<:  MySQL ロール関数の紹介

>>:  ウェブ画像形式としてPNG、JPG、GIFを選択して使用する方法

推薦する

シンプルなカルーセル効果を実現するネイティブ js

この記事では、シンプルなカルーセル効果を実現するためのjsの具体的なコードを参考までに紹介します。具...

MySQL データベースのパフォーマンス最適化の概要

目次なぜ最適化するのですか? ?どこから始めますか? ?解決策は何ですか? ? ?どうやって選ぶ? ...

CentOS 8 に MySql をインストールしてリモート接続を許可する方法

ダウンロードしてインストールします。まず、システムに MySQL または MariaDB があるかど...

HTML+CSSは、要素の位置までスクロールして読み込みアニメーション効果を表示します。

要素までスクロールするたびに読み込みアニメーションを追加するにはどうすればよいですか?初期パラメータ...

FlashFXP FTP クライアント ソフトウェア登録クラッキング方法

FlashFXPのダウンロードアドレスは、https://www.jb51.net/softs/95...

MySQL でスロークエリログを有効にする方法

1.1 はじめにスロークエリログを有効にすると、MySQL は指定された時間を超えるクエリステートメ...

Faint: 「Web2.0 を使用して標準に準拠したページを作成する」

今日、ある人がウェブサイト開発プロジェクトについて話をしてくれました。具体的な要件について話すと、「...

JSは10進数を16進数に変換するサンプルコードを実装します

序文コードを書くと、時々基数変換の問題に遭遇します。一般的な変換には、2進数、8進数、10進数、16...

docker に基づいて nginxssl 設定を開始する

前提条件クラウドサーバー(Alibaba Cloud、Tencent CloudなどのcentOS)...

React のクラスからフックへの移行

目次リアクトフック序文なぜフックなのか?クラス関数クラスとフックの比較フックはコンポーネントの状態を...

JavaScriptのスリープ関数の使用

目次1.スリープ機能2.タイムアウトを設定する3. 約束4. 非同期待機5. 1秒後に出力1、2秒後...

Linux システム ディレクトリ sys、tmp、usr、var の詳細な説明。

Linux 初心者から Linux マスターへの成長の道: Linux システム ディレクトリ s...

MySQL データベースの最適化: テーブルとデータベースのシャーディング操作の詳細な説明

この記事では、例を使用して、MySQL データベースの最適化のためのテーブルおよびデータベース シャ...

JenkinsのLinuxインストール手順と各種問題解決(ページアクセス初期化パスワード)

1. Java環境jdk1.8を準備するJavaがインストールされているかどうかを確認します。イン...

mysqldump を使用して MySQL データをバックアップする方法

1. mysqldump の紹介mysqldump は、MySQL に付属する論理バックアップ ツー...