Vueキャッシュ機能の使い方

Vueキャッシュ機能の使い方

vue2のキャッシュ機能

vue2版にはこのようなキャッシュ機能がある

  /**
   * 純粋関数のキャッシュバージョンを作成します。
   */
  関数キャッシュ(fn){
    var キャッシュ = Object.create(null);
    戻り値 (関数 cachedFn (str) {
      var ヒット = キャッシュ[str];
      ヒットを返す || (cache[str] = fn(str))
    })
  }
  

上記の関数には、配列があり、各要素の最初の文字を大文字に変換する必要があるなどの一般的なシナリオがあります。

const配列 = ['abc', 'ed', 'abc', 'acd', 'ed', 'fkg', ...];

一般的な解決策

// 大文字化関数を定義する function capitalize (str) {
    str.charAt(0).toUpperCase() + str.slice(1) を返す
 };
  
 const capitalizeArray = array.map(大文字化);

よく見ると、配列には重複する要素がたくさんあることがわかります。それらは同じ結果を返します。実際、capitalize を実行するために計算を繰り返す必要はありません。さらに、capitalize は PURE 関数です。このとき、上記のキャッシュされた関数を使用してメモを作成できます。

変換は次のようになります

関数 capitalize(str) {
    str.charAt(0).toUpperCase() + str.slice(1) を返す
 };
  
const capitalizeArray = array.map(cached(capitalize));

重複する文字列が見つかった場合、キャッシュされた結果が直接返されます。大文字化は非常に時間のかかる作業であり、パフォーマンスの最適化にはそれ以上の作業が必要であることを考慮してください。

Vue キャッシュ関数の変換

上記の例は、キャッシュ同期タスクの純粋な機能です。ビジネス開発では、入力ボックスの検索などのシナリオがあります。入力ボックスが入力イベントをトリガーすると、インターフェイスを呼び出してクエリ結果を返します。たとえば、キーワード「Nuggets」を入力すると結果が返され、次に「Nuggets NBA」と入力すると結果が返されました。このとき、NBAを削除して再度「Nuggets」を検索しました。実は、この結果は以前にも確認しています。キャッシュされている場合は、インターフェイスを再度呼び出さずに直接キャッシュをプルできます。

キャッシュに基づいて非同期純粋関数をキャッシュするためのメモを実装します

const cachedAsync = function(fn) {
    const キャッシュ = Object.create(null);
    非同期strを返す => {
        const ヒット = キャッシュ[str];
        (ヒット)の場合{
            リターンヒット;
        }
        // 成功した Promise のみをキャッシュし、失敗した場合は直接戻りを再度要求します (cache[str] = await fn(str));
    };
};

使用シナリオ

const cachedAsyncQueryPrdList = cachedAsync(prdNo => {
    // 以下はリクエスト操作であり、Promiseを返します
    queryPrdList を返します({
        いいえ
    });
}); 

<テンプレート>
    <el-input v-model="prdNo" placeholder="製品コードを入力してください" @input="handleQueryPrdList" />
    <el-選択>
        <el-option v-for="prdList 内の項目" :label="item.label" :value="item.value">
    </el-select>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
    データ() {
        製造番号: ''、
        prdリスト: [],
    },
    メソッド: {
        非同期handleQueryPrdList() {
            const {データ} = cachedAsyncQueryPrdList(this.prdNo);
            this.prdList = データ;
        }
    }
}
</スクリプト>

上記の実装は、同じキーワードが入力されたときに、前回のリクエストが成功した場合は、サーバーに新しいリクエストを行わずにキャッシュが直接取得されることを意味します。メモは成功したプロミスのみをキャッシュするためです。

最適化

上記のシナリオでは、el-input の基になるレイヤーが、手ぶれ防止レイヤーを実行するために、compositionEnd イベントと compilationStart イベントを使用していますが、入力イベントは、テキストが実際に画面に入力されたときにのみトリガーされます。しかし、これだけでは十分ではありません。ユーザーが非常に速く入力すると、1 秒あたりに複数のリクエストが送信され、サーバーの負荷が増大する可能性があります。そのため、このタイプの機能は、通常、手ぶれ補正機能と組み合わせて使用​​されます。

手ぶれ防止機能

定数デバウンス = (fn, ms = 300) => {
    タイムアウトIdを設定します。
    関数(...引数)を返す{
        タイムアウトをクリアします(タイムアウトId);
        timeoutId = setTimeout(() => fn.apply(this, args), ms);
    };
};

次にそれをcachedAsyncで使用します

const cachedAsyncQueryPrdList = cachedAsync(prdNo => {
    // 以下は、Promiseを返すAjaxリクエスト操作です
    queryPrdList を返します({
        いいえ
    });
}); 

<テンプレート>
    <el-input v-model="prdNo" placeholder="製品コードを入力してください" @input="debounceQueryPrdListFn" />
    <el-選択>
        <el-option v-for="prdList 内の項目" :label="item.label" :value="item.value">
    </el-select>
</テンプレート>
<スクリプト>
定数 noop = () => {};
エクスポートデフォルト{
    データ() {
        製造番号: ''、
        prdリスト: [],
        debounceQueryPrdListFn: 何もしない、
    },
    作成された() {
        this.debounceQueryPrdListFn = debounce(this.handleQueryPrdList);
    },
    メソッド: {
        非同期handleQueryPrdList() {
            const {データ} = cachedAsyncQueryPrdList(this.prdNo);
            this.prdList = データ;
        }
    }
}
</スクリプト>

FBI 警告: >>> cachedAsync 関数は、PURE 関数にのみ適用されます。

この実装は実稼働環境でも安定的に使用されており、安心してご利用いただけます。

要約する

Vue キャッシュ機能の使い方についてはこれで終了です。Vue キャッシュ機能の使い方についてさらに詳しく知りたい方は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue プロジェクトでページ キャッシュを強制的にクリアする例
  • Vue プロジェクトでキャッシュを実装するための最適なソリューションの詳細な説明
  • Vue のコンポーネント キャッシュの詳細な説明
  • Vueのコンポーネント情報キャッシュ問題について
  • Vueのページキャッシュの詳細な説明

<<:  Tomcat イメージをインストールして Docker に Web プロジェクトをデプロイする方法を簡単に説明します。

>>:  MySQLでANDとORを組み合わせる問題を解決する

推薦する

el-tree での不完全なテキスト表示の解決策

目次方法1: 水平スクロールバーを設定する最も簡単な方法方法2(新規):ドラッグバーを追加して外側の...

nginx 設定チュートリアルにおける add_header の落とし穴の詳細な説明

序文add_header は、headers モジュールで定義されたディレクティブです。名前が示すよ...

フォームの「Enter」、「Submit」、「Enter != Submit」を削除する方法

「Enter != Submit」問題を実装するには、通常、「ボタンの種類」と「入力ボックスの数」か...

Vueは動的コンポーネントを使用してTAB切り替え効果を実現します

目次問題の説明Vueの動的コンポーネントとはアプリケーションシナリオの説明実装手順ステップ 1 (新...

Node.js を使用して png 画像に透明なピクセルがあるかどうかを判断する方法

背景PNG 画像は jpg 画像よりも多くのストレージスペースを占有しますが、PNG 画像の品質は大...

ZabbixはSNMPに基づいてLinuxホストを監視します

序文: Linux ホストは、エージェント プログラムをインストールする場合でも、SNMP を使用す...

MySQL がエラーを報告: ファイルが見つかりません: './mysql/plugin.frm' 解決策

問題を見つける最近、仕事中に問題が見つかりました。問題は、MySQL ディスクがいっぱいだったことで...

Dockerコンテナの入退出方法の詳細な説明

1 Dockerサービスを開始するまず、docker サービスを開始する方法を知っておく必要がありま...

WeChatアプレットがSMSログインを実装

目次1. インターフェース効果のプレビュー2.uViewのインストール3.uViewの設定3.1 m...

Zabbix WEB 監視実装プロセス図

Zabbix独自のWEBインターフェースを例に、Web監視の設定を行います。環境: zabbix4....

Docker を使用した nGrinder パフォーマンス テスト プラットフォームの導入プロセスの分析

nGrinderとは何ですか? nGrinder は、スクリプトの作成、テストの実行、監視、結果レポ...

MySQL 8.0.15 圧縮版インストール グラフィック チュートリアル

この記事では、参考までにMySQL 8.0.15圧縮版のインストール方法を紹介します。具体的な内容は...

MySQL 5.7.15 バージョンのインストールと設定方法のグラフィックチュートリアル

この記事では、MySQLバージョン5.7のインストール方法と使用方法、およびデータベースデータの保存...

Vueは要素ツリーコントロールを通じてツリーテーブルを実装します

目次実装効果図依存関係をインストールするカスタムツリーコントロールその他の実装要約するVueでは、要...

Linux 脆弱性スキャンツール lynis の使用分析

はじめに: Lynis は、徹底的なセキュリティ スキャンを実行できる Unix システム用のセキュ...