Vue モバイル プロジェクトでページ キャッシュを実装する方法のサンプル コード

Vue モバイル プロジェクトでページ キャッシュを実装する方法のサンプル コード

背景

モバイル デバイスでは、ページ ジャンプ間のキャッシュが必須要件です。

例: ホームページ => リストページ => 詳細ページ。

ホームページからリストページに入るときはリストページを更新する必要があり、詳細ページからリストページに戻るときはリストページがページキャッシュを保持する必要があります。

ホームページについては、通常はキャッシュされた状態で保存されます。

詳細ページはどの入口から入っても更新されます。

実装のアイデア

ページ キャッシュといえば、vue の keep-alive コンポーネントについて言及する必要があります。keep-alive はルーティング キャッシュ機能を提供します。この記事では主に、keep-alive と vuex を使用して、アプリケーションでページ ジャンプ キャッシュを実装します。

Vuex は、現在キャッシュする必要があるページを保存するために配列 cachePages を維持します。
キープアライブ インクルードは cachePages に設定されています。
ルート メタにカスタム フィールド needCachePages または keepAlive を追加します。needCachePages は配列であり、ルートによって入力されるページが配列内にある場合、ルートがキャッシュされることを意味します。keepAlive は、アプリのホームページなど、どのページが入力されてもキャッシュが保持されることを意味します。
ルーティング ガード beforeEach では、ジャンプするルーティング ページが現在のルートの needCachePages 内にある場合、現在のルートが cachePages に追加され、そうでない場合は削除されます。

具体的な実装

Vuex実装コンテンツ

// src/store/modules/app.js

エクスポートデフォルト{
 州: {
  // ページキャッシュ配列 cachePages: []
 },
 
 突然変異:
  // キャッシュページを追加 ADD_CACHE_PAGE(state, page) {
   if (!state.cachePages.includes(ページ)) {
    state.cachePages.push(ページ)
   }
  },
  
  // キャッシュページを削除する REMOVE_CACHE_PAGE(state, page) {
   if (state.cachePages.includes(ページ)) {
    state.cachePages.splice(state.cachePages.indexOf(ページ), 1)
   }
  }
 }
}


// src/store/getters.js

const ゲッター = {
 キャッシュページ: 状態 => state.app.cachePages
}
デフォルトのゲッターをエクスポートする

// src/store/index.js

'vue' から Vue をインポートします
'vuex' から Vuex をインポートします
Vue.use(Vuex)

'./modules/user' からユーザーをインポートします
'./modules/app' からアプリをインポートします
'./getters' からゲッターをインポートします

// ストアオブジェクトをエクスポートする export default new Vuex.Store({
 ゲッター、
 モジュール:
  ユーザー、
  アプリ
 }
})

App.vueでは、keep-alive includeはcachePagesを設定します。

<keep-alive :include="cachePages">
 <ルータービュー:key="$route.fullPath"></ルータービュー>
</キープアライブ>

計算: {
 ...mapGetters([
  'キャッシュページ'
 ])
}

ルーティング構成

{
  パス: '/home',
  名前: 'ホーム'、
  コンポーネント: () => import('@/views/tabbar/Home'),
  メタ: {
   タイトル: 'ホームページ'、
   キープアライブ: 真
  }
},
{
  パス: '/list',
  名前: 'リスト',
  コンポーネント: () => import('@/views/List'),
  メタ: {
   タイトル: 「リストページ」
   必要なキャッシュページ: ['ListDetail']
  }
},
{
  パス: '/list-detail',
  名前: 'ListDetail',
  コンポーネント: () => import('@/views/Detail'),
  メタ: {
   タイトル: 「詳細ページ」
  }
}

ルートガード

'vue' から Vue をインポートします
'vue-router' から Router をインポートします。
'@/store' からストアをインポートします
Vue.use(ルーター)

// モジュール フォルダー内のすべてのルートをインポートします。const files = require.context('./modules', false, /\.js$/)
モジュール = []
files.keys().forEach(キー => {
 モジュール = modules.concat(ファイル(キー).default)
})

// ルーティング constroutes = [
 {
  パス: '/'、
  リダイレクト: '/home',
 },
 ...モジュール
]

const router = 新しいルーター({
 モード: 'ハッシュ'、
 ルート: ルート
})


関数 isKeepAlive(ルート) {
 ルートメタとルートメタのkeepAliveの場合{
  store.commit('ADD_CACHE_PAGE', ルート名)
 }
 ルートの子の場合{
  ルート.children.forEach(child => {
   isKeepAlive(子)
  })
 }
}

ルート.forEach(item => {
 isKeepAlive(アイテム)
})

// グローバルルーティングガード router.beforeEach((to, from, next) => {
 if (from.meta.needCachePages && from.meta.needCachePages.includes(to.name)) {
  store.commit('ADD_CACHE_PAGE', from.name)
 } そうでない場合 (from.meta.needCachePages) {
  store.commit('REMOVE_CACHE_PAGE', from.name)
 }
 // ページの最初のキャッシュ障害が発生します。vuex からキープアライブキャッシュへの遅延があると推測されます。 // ここでは、100 ミリ秒の遅延を使用して解決します setTimeout(() => {
  次()
 }, 100)
})

デフォルトルーターをエクスポートする

ページスクロールバーの位置を復元する

このときページはキャッシュされますが、スクロールバーは毎回一番上に戻ります。

キャッシュされたページの場合、アクティブ化されたフックと非アクティブ化されたフックがトリガーされ、これら 2 つのフックを使用してスクロール バーの位置を復元できます。

ページを離れたとき、つまり非アクティブ化がトリガーされたときに、スクロール バーの位置が記録されます。

ページに戻ると、つまり activated がトリガーされると、スクロール バーの位置が復元されます。

// ミックスインを作成する
// src/mixins/index.js

エクスポートconst savePosition = (scrollId = 'app') => {
 戻る {
  データ() {
   戻る {
    マイスクロールトップ: 0
   }
  },
  
  アクティブ化() {
   定数ターゲット = document.getElementById(スクロールId)
   ターゲット && target.scrollTop = this.myScrollTop
  },
  
  beforeRouteLeave(to, from, next) {
   定数ターゲット = document.getElementById(スクロールId)
   this.myScrollTop = target.scrollTop || 0
   次()
  }
 }
}

ここで、deactivated を使用するとページがすぐに非表示になり、取得されたノードのスクロール バーの高さが 0 になることが判明したため、beforeRouteLeave が使用されます。

キャッシュが必要なページで使用してください

<スクリプト>
'@/mixins' から { savePosition } をインポートします。

エクスポートデフォルト{
 ミックスイン: [新しい savePosition()]
}
</スクリプト>

ページでスクロールコンテナをカスタマイズする場合は、スクロールコンテナIDを渡すことができます。

<テンプレート>
  <div id="スクロールコンテナ" スタイル="高さ: 100vh; オーバーフロー-y: スクロール;">

  </div>
</テンプレート>

<スクリプト>
'@/mixins' から { savePosition } をインポートします。

エクスポートデフォルト{
 ミックスイン: [新しい savePosition('scroll-container')]
}
</スクリプト>

知らせ

友人からよく「設定してもキャッシュ効果がないのはなぜですか?」と質問されます。

このとき、1 つの問題に注意する必要があります。keep-alive の鍵の 1 つは、ルート内の名前が .vue ファイル内の名前と一致している必要があることです。

キャッシュが有効にならない場合は、まず 2 つの名前と needCachePages が一致しているかどうかを確認してください。

考えと欠点

この解決策は、私が 1 年以上前に行ったものです。今でも、ルートで needCachePages を毎回構成する必要があるなど、まだいくつかの欠点があると思います。

実際、モバイル デバイスでは、ミニ プログラムを開発するときと同じように、前のページに戻ると、前のページが常にキャッシュされます。navigateTo を呼び出して戻ると、ページは常にキャッシュされるため、手動で構成する必要はありません。

そこで、Vue でグローバル ジャンプ API を提供するというアイデアが生まれました。API が呼び出される限り、現在のページがキャッシュされます。更新操作が必要な場合は、ミニ プログラムで onShow のようにアクティブ化されたロジックを実行できます。

これで、Vue モバイル プロジェクトでページ キャッシュを実装する方法に関するこの記事は終了です。Vue ページ キャッシュに関するその他のコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • ページキャッシュ操作を実現するためのVueページジャンプ
  • Vue2.0 でページキャッシュと非キャッシュを実装する方法
  • Vue プロジェクトでページ キャッシュを強制的にクリアする例
  • タブページキャッシュ機能を実装するためのvuex + keep-alive
  • Vue サーバーサイドレンダリングページキャッシュとコンポーネントキャッシュの詳細な例
  • Vueプロジェクトのグローバル設定ページキャッシュにおけるオンデマンドキャッシュ読み取りの実装の詳細な説明
  • Vue ベースのモバイル Web アプリ ページ キャッシュ ソリューションの詳細な説明
  • Vue のページ キャッシュ問題の詳細な説明 (2.0 ベース)
  • Vueはページキャッシュ機能を実装する

<<:  CentOS 7にChromeブラウザをインストールする方法

>>:  メモリ構成が過剰でMySQLが起動できない問題の解決方法

推薦する

一般的なメールボックスで正常に表示できる HTML メールを作成するためのヒント

HTML メールを送信するためのヒント: スタイルを使用してインライン CSS を記述する、使用する...

JavaScriptのイベントループの仕組みの分析

目次序文: 1. イベント ループとタスク キューの理由: 2. イベントループメカニズム: 3. ...

MySQL のインデックスにおける NULL の影響についての詳細な説明

序文私は多くのブログを読み、弊社の DBA を含む多くの人々が、MySql では列に null が含...

Vueコンポーネントは、写真やビデオをアップロードするためのサンプルコードをカプセル化します

まず依存関係をダウンロードします: cnpm i -S vue-uuid ali-oss画像フィール...

一般的なMySQLストレージエンジンの長所と短所

目次すべてのストレージエンジンを表示InnoDB ストレージ エンジンMyISAM ストレージエンジ...

Vue プロジェクトでブラウザ キャッシュ設定を無効にする例

プロジェクトをリリースするときに、キャッシュをクリーンアップする必要があるという問題に遭遇することが...

CentOS/RHEL システムで VLAN タグ付きイーサネット カードを使用する方法

シナリオによっては、Linux サーバー (CentOS/RHEL) の同じイーサネット カード (...

VMware ワークステーション 12 に Ubuntu 14.04 (64 ビット) をインストール

1. インストール環境コンピュータモデル: Lenovo Y471a (i5) ノートパソコンシステ...

過去の Linux イメージの問題を修正するためのサンプル分析

過去の Linux イメージに関する問題を修正従来の Linux イメージで作成された ECS クラ...

React クラスコンポーネントのライフサイクルと実行順序

1. Reactコンポーネントを定義する2つの方法1. 関数コンポーネント。単純な関数コンポーネント...

Windows での MySQL5 グリーン バージョンのインストールの概要 (推奨)

1 MySQLをダウンロードするダウンロードアドレス: http://downloads.mysq...

jQueryは従業員情報の追加と削除の機能を実装します

この記事では、従業員情報の追加と削除の機能を実装するためのjQueryの具体的なコードを参考までに共...

iframe に関するいくつかの発見と考察

この物語は、今日の予期せぬ発見から始まります。同社には複数のウェブサイトがある。友達リンクにはお互い...

MySQLクエリツリー構造方式

目次MySQL クエリツリー構造1. ツリー構造について2. MySQLでカスタム関数を定義する方法...

Mysqlチュートリアルでのグループランキングの実装例の詳細な説明

目次1. データソース2. データの総合順位1) 総合ランキング2) 同順位3) 同順位3. データ...