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を選択して使用する方法

推薦する

MySQL の結合フィールドの Concat()

目次1. はじめに2. 本文2.1 フィールドの連結2.2 フィールドでの算術計算の実行1. はじめ...

nginxリバースプロキシを使用するときに長時間接続を維持する方法

・【シーン説明】 HTTP1.1 以降、HTTP プロトコルは永続的な接続 (長い接続とも呼ばれます...

VueはPCカメラを呼び出して写真機能を実現します

この記事の例では、VueがPCカメラを呼び出して写真機能を実現する具体的なコードを参考までに共有して...

CSS コンテンツ属性を使用して、マウスホバープロンプト (ツールチップ) 効果を実現します。

なぜこのような効果を実現するのでしょうか。実は、この効果もタイトルプロンプトから派生したものですが、...

JPG、GIF、PNGなどのさまざまな画像形式の詳細な説明

ウェブページ上の画像が一般的に jpg、gif、png 形式であることは誰もが知っています。それらの...

Docker データ管理 (データ ボリュームとデータ ボリューム コンテナー) の詳細な説明

実稼働環境で Docker を使用する場合、多くの場合、データを複数のコンテナ間で永続化または共有す...

MySQL SELECT実行順序の簡単な理解

SELECT ステートメントの完全な構文は次のとおりです。 (7)選択 (8) DISTINCT ...

DockerイントラネットはDNSを構築し、ip:port操作の代わりにドメイン名アクセスを使用します

たとえば、イントラネットに Jenkins サーバーがある場合、そのサーバーにアクセスするには、その...

Vue の get リクエストと post リクエストの違いのまとめ

このチュートリアルの動作環境: Windows 7 システム、vue 2.9.6 バージョン、DEL...

Docker での Redis 接続の急増をトラブルシューティングした実践的な記録

土曜日、本番サーバー上の Redis サーバーが利用できなくなり、エラー メッセージは次のようになり...

XshellがvirtualBox仮想マシンに接続できない問題の解決策

まず、VirtualBox仮想マシンのネットワーク設定モードについて説明します。NAT+ホストオンリ...

スキン効果を実現するJavaScript(背景の変更)

この記事では、スキン変更効果を実現するためのJavaScriptの具体的なコードを参考までに紹介しま...

MySQLはJSON内部フィールドを抽出し、数値としてダンプします

目次背景問題分析1. 属性値はJson形式であり、Json操作関数を使用して処理する必要があります。...

HTMLにリンクを挿入する方法

各 Web ページには、URL () で識別されるアドレスがあります。通常、Web サイト内でリンク...

Tencent Cloud Server Tomcat ポートにアクセスできない場合の解決策

最近、Tencent Cloudを使用してサーバーを設定しました。使用中に、tomcatポートにアク...