開発においては、一覧から詳細ページにジャンプし、また詳細ページに戻る際に一覧ページの状態(スクロール位置情報など)をキャッシュする必要があることが多々あります。このとき、状態を保存してキャッシュする必要がありますが、Vue では状態をキャッシュするためのキープアライブコンポーネントを提供しています。 1. メタタグを使用する1. まず、ルートのメタタグのkeepAlive属性をtrueとして記録します。 パス: '/classify', 名前: '分類'、 コンポーネント: () => import('@/views/classify/classify.vue'), メタ: { タイトル: 「Leishitaoクーポン」 キープアライブ: 真 } }, 2. ルーターインスタンスを作成するときにscrollBehaviorメソッドを追加する デフォルトの新しいルーターをエクスポートします({ モード: '履歴'、 ベース: process.env.BASE_URL、 ルート、 scrollBehavior (to、from、savedPosition) { if (保存された位置) { 保存された位置を返す } それ以外 { 戻る { x: 0, 年: 0 } } } }) 3. キャッシュする必要があるルータービューコンポーネントにキープアライブコンポーネントをラップします。 <キープアライブ> <router-view v-if='$route.meta.keepAlive'></router-view> </キープアライブ> <router-view v-if='!$route.meta.keepAlive'></router-view> 4. キャッシュが必要な場合とそうでない場合があるため、キャッシュされたコンポーネントのルーティングフック関数で判断することができます。 beforeRouteLeave (to、from、next) { this.loading = true to.path === '/goods_detail'の場合{ from.meta.keepAlive = true } それ以外 { from.meta.keepAlive = false // this.$destroy() } 次() }, コンポーネントのキャッシュをサポートできますが、この方法にはバグがあります。まず、ページを初めて開いたときはキャッシュされません。つまり、リストページから詳細ページに初めてジャンプしたときは、戻ってきたときにキャッシュがありません。後で詳細ページに入るときにキャッシュされ、最初のエントリの状態のみがキャッシュされ、データは再度要求されません。ページAでカテゴリを選択してページBにジャンプし、次にBのリストページから詳細ページにジャンプした場合、この状態はこの時点でキャッシュされ、将来ページAの他のカテゴリからページBにジャンプしたときに再度キャッシュされません。そのため、詳細ページからページBに戻るたびに、最初のキャッシュの状態にジャンプします。プロジェクトにキャッシュする必要がある状態が1つだけある場合は、この方法の使用を検討できます。 2. include、exclude属性、beforeRouteEnterフック関数を使用するまず、includeとexcludeのVueドキュメントを紹介します https://cn.vuejs.org/v2/api/#keep-alive <キープアライブを含める="a,b"> <コンポーネント :is="view"></コンポーネント> </キープアライブ> <!-- 正規表現 (`v-bind` を使用) --> <キープアライブ:include="/a|b/"> <コンポーネント :is="view"></コンポーネント> </キープアライブ> <!-- 配列 (`v-bind` を使用) --> <キープアライブ:include="['a', 'b']"> <コンポーネント :is="view"></コンポーネント> </キープアライブ> 最初に、コンポーネント自身の名前オプションに対して一致がチェックされます。名前オプションが使用できない場合は、ローカルに登録されている名前 (親コンポーネントの components オプションのキー値) に対して一致がチェックされます。匿名コンポーネントは一致できません。 max は 2.5.0 でのみ追加され、キャッシュできるコンポーネント インスタンスの最大数です。この数に達すると、最も長い時間アクセスされていないキャッシュされたコンポーネント インスタンスは、新しいインスタンスが作成される前に破棄されます。 <キープアライブ:max="10"> <コンポーネント :is="view"></コンポーネント> </キープアライブ> 有効化および無効化。 keep-alive に含まれるコンポーネント/ルートには、activated と deactivated という 2 つのライフサイクル フックが追加されることを簡単に説明します。 beforeMount=> 別のルート/コンポーネントから来た場合(キャッシュを離れるときにコンポーネントが破棄されるか非アクティブ化される)=>マウント済み=>アクティブ化 キャッシュ コンポーネントに入る=> beforeRouteEnter コールバックを実行する コンポーネントはキャッシュされているため、キャッシュ ルート/コンポーネントに再度入るときにこれらのフックはトリガーされません: // beforeCreate created beforeMount mount はトリガーされません。 deactivated: コンポーネントが非アクティブ化される (ルートを離れる) ときに、keep-alive が使用されている場合、コンポーネントは破棄されずにキャッシュされるため、beforeDestroy (コンポーネント破棄前のフック) と destroyed (コンポーネント破棄) は呼び出されません。 現在のルートフックをコンポーネントに残す beforeRouteLeave => ルートフロントガード beforeEach => グローバルポストフック afterEach => 非アクティブ化 キャッシュコンポーネントを残す => アクティブ化 キャッシュコンポーネントに入る(キャッシュルートに入る場合) プロジェクトでキャッシュを使用する方法: <キープアライブ:include="['ホーム','分類','検索']"> <ルータービュー></ルータービュー> </キープアライブ> 3. beforeRouteEnterの次のコールバック関数では、Aページをキャッシュする必要がない状況を初期化します。つまり、createで書き込むべきものをここに書きます。初期化が必要なすべてのデータを再度書き込むように注意してください。そうしないとバグが発生します。したがって、推奨されません。 beforeRouteEnter (to、from、next) { 次(vm => { // `vm` を介してコンポーネントインスタンスにアクセスします if (from.path !== '/goods_detail') { // A からページ B に入るときに更新する必要があります vm.titleText = vm.$route.query.name vm.categoryUpper = vm.$route.query.categoryUpper vm.goods = [] vm.ページ = 1 vm.catsIndex = 0 vm.is_search = 偽 vm.getCats2()// は元々 create で記述されたさまざまな型です} }) } 3. include、exclude属性、beforeRouteLeaveフック関数とvuexを使用する(推奨) 3 番目の方法は 2 番目の方法と似ていますが、キャッシュする必要があるコンポーネントがグローバル変数に保存され、ルーティング フック関数でキャッシュする必要があるコンポーネントとキャッシュする必要のないコンポーネントを柔軟に制御できる点が異なります。2 番目の方法と比較すると、データを毎回再初期化する必要はありませんが、データを vuex に保存する必要があります。 <キープアライブ:include="catch_components"> <ルータービュー></ルータービュー> </キープアライブ> 3. キャッシュするコンポーネントの変数名と対応するメソッドをストアに追加します。 デフォルトの新しいVuex.Storeをエクスポートします({ 州: { キャッチコンポーネント: [] }, 突然変異: GET_CATCHE_COMPONENTS (状態、データ) { state.catch_components = データ } } }) 4. beforeRouteLeaveフック関数でキャッシュする必要があるコンポーネントを制御する beforeRouteLeave (to, from, next) { //コンポーネントを離れるときにキャッシュする必要があるコンポーネントを制御します。そうしないと、最初にキャッシュされない状態が発生します。this.busy = true if (to.path === '/goods_detail') { // 詳細ページに移動するときにコンポーネントをキャッシュする必要があり、それ以外の場合はキャッシュは必要ありません this.$store.commit('GET_CATCHE_COMPONENTS', ['home']) } それ以外 { this.$store.commit('GET_CATCHE_COMPONENTS', []) } 次() }, さらに、私たちのプロジェクトでは、ルートは同じだがパラメータが異なる場合にコンポーネントが再利用され、更新されないという問題に遭遇しました。Vueはルートパラメータの変更に対する対応を公式に示しました。 時計: '$route' (to、from) { document.title = this.$route.query.name this.getDefault() //パラメータデータに応じて応答する} }, これで、vue での keepAlive の詳細な使用方法についての記事は終了です。vue での keepAlive の使用に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
Win2008 R2 zip形式のMySQLのインストールと設定1. Baidu MySQL 5.6...
原因と結果1. ansibleコマンドを使用してジャンプサーバー上のマシンBをテストすると、次のエラ...
導入された HTML タグは、必ずしも XHTML 仕様に完全に準拠しているわけではありません。実際...
Mysqlは3種類のロック構造をサポートしていますテーブルレベルのロック、低オーバーヘッド、高速ロッ...
序文:前回の記事では、注意深い学生であれば発見できたかもしれない DDL ステートメントの使用法を中...
ページの公開名: #wrapper - ページの外側の端が全体のレイアウト幅を制御します#conta...
Vueに触れたばかりのパートナーの多くは、開発環境ではVueプロジェクトは正常であるが、パッケージ化...
それは何ですか? em はフォントの高さを指し、どのブラウザでもデフォルトのフォントの高さは 16 ...
1. マックヴラン前回のブログ投稿で紹介した Docker コンテナのホスト間通信を実現するための ...
MySQLサービス8.0.14のインストール(一般)の参考までに、具体的な内容は次のとおりです。イ...
証明書チェーンを生成するスクリプトを使用して、ルート証明書、中間証明書、および 3 つのクライアント...
目次スロットとは何かデフォルトスロットの理解コードスニペット要約するスロットとは何かスロットは、親コ...
前回の記事では、Vue で画像の切り抜きや拡大・縮小、回転を実現する方法を紹介しました。今回は、アイ...
mysqlはbinlogログを正しくクリーンアップします序文: MySQL の binlog はデー...
この記事では、MySQL 8.0.13のインストールと設定のチュートリアルを参考までに紹介します。具...