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

推薦する

Linux lessコマンド例の詳細な説明

ファイル名が少ないファイルを表示ファイル名を少なく | grep -n コンテンツを検索内容に応じて...

MySQL マスター スレーブ データベースが同期されない問題を解決する 2 つの方法

目次MySQL マスター スレーブ データベースが同期されない問題を解決する 2 つの方法1. 非同...

MySQL5.7 シングルインスタンス自動起動サービスの設定プロセス

1.MySQLのバージョン [root@clq システム]# mysql -v MySQL モニター...

JavaScriptタイマーとボタン効果設定の詳細な説明

タイマー効果: <div> <font id='timeCount'...

スケルトンスクリーン効果を実現する CSS

ネットワーク データを読み込むときは、ユーザー エクスペリエンスを向上させるために、通常は円形の読み...

Jenkins を使用した Vue プロジェクトのワンクリック パッケージングと公開の実装

目次Jenkinsのインストールインストールポート番号を変更します(デフォルトのポートは8080です...

Linux仮想マシンをWiFiに接続する方法

生活の中で、インターネットはどこにでもあります。インターネットを通じてゲームをしたり、テレビ番組を見...

MySQL 5.7 のインストールと設定の詳細な手順

1. MySQLをダウンロードする1. MySQLの公式ウェブサイトにログインし、64ビットシステム...

時間のかかるDockerエラーのトラブルシューティングプロセス記録

目次起源環境情報トラブルシューティングのプロセス要約する起源顧客は CentOS をベースにしたカス...

nginxリバースプロキシを介したデバッグコードの実装

背景現在、会社のプロジェクトは、フロントエンドとバックエンドが分離された方法で開発されています。新し...

Nginx は gzip 圧縮に基づいてアクセス速度を向上します

1. nginx はなぜ gzip を使用するのですか? 1. 圧縮の役割:ページがgzipで圧縮さ...

Docker でローカルにイメージをインポート/保存/読み込み/削除する方法

1. Dockerはローカルイメージをインポートする場合によっては、イメージをローカルまたは別の友人...

Vueはタブナビゲーションバーを実装し、左右のスライド機能をサポートしています

この記事では主に、Vue を使用してタブ ナビゲーション バーを実装し、flex レイアウトを使用し...

MySQLでよく使われるSQLとコマンドの入力からデータベースの削除、そして終了まで

目次開始と停止データベース関連の操作データベーステーブル関連の操作制約関連デフォルトの制約高度なデー...

MySQL 8.0.15 のダウンロードとインストールの詳細なチュートリアルは初心者にとって必須です。

この記事では、MySQL 8.0.15をダウンロードしてインストールするための具体的な手順を参考まで...