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を組み合わせる問題を解決する

推薦する

CSS でレスポンシブ レイアウトを実装する方法

CSS でレスポンシブ レイアウトを実装するレスポンシブレイアウトは非常にハイエンドで難しいように思...

PIP で docker-compose をインストールする際のタイムアウト問題の解決方法

1: インストールコマンドpip install docker-compose例外情報socket....

Nginx ポート競合を解決するトラブルシューティング方法の例

問題の説明データ転送に Nginx を使用し、フロントエンドとバックエンドが分離された Spring...

MySQL 中断された接続警告ログの分析

序文:場合によっては、MySQL に接続されたセッションが異常終了することが多く、エラー ログに「通...

JSは文字列内の指定された文字列のn番目の出現位置を取得します

文字の位置を取得するための同様の方法について学習します。 charAt() 文字列内の指定された位置...

UniappはBaidu Voiceを使用して録音をテキストに変換する機能を実現

3日間さまざまな困難に遭遇した後、ようやくこの機能を実現しました。正常に実装できる方法を見つける前に...

MySQLの複合インデックス方式の詳細な説明

どの DBMS でも、インデックスは最適化にとって最も重要な要素です。データ量が少ない場合、適切なイ...

Vueのインストールと使用

目次1. Vueのインストール方法1: CDNの導入方法2: 直接ダウンロードしてインポートする方法...

Zabbix redis 自動ポート検出スクリプトは json 形式を返します

自動検出を行う際には、ポートなどの情報を取得してjson形式で返すスクリプトが必ず存在します。Red...

MySql でリモート接続を許可する方法

MySql でリモート接続を許可する方法この目標を達成するには、2つのことを行う必要がある。ユーザー...

Windows での MySQL 8.0.11 インストール チュートリアル

この記事は、WindowsでのMySQL 8.0.11のインストールチュートリアルを記録しています。...

ウェブデザインのグラフィック構成と組版機能の紹介

すべてには基礎が必要です。家を建てるには基礎が必要です。方程式を解くには、まず九九を覚える必要があり...

Centos7でmysql5.7.19のデータ保存場所を移動する方法

シナリオ: データ量が増加すると、MySQL が配置されているディスクがいっぱいになり、より大きなス...

CentOS7.4 で JDK1.8 をインストールするためのグラフィカル チュートリアル

Linux インストール JDK1.8 手順1. CentOS に独自の openJDK があるかど...

MySQL データ ウェアハウスを保護するための 5 つのヒント

さまざまなソースからデータを集約することで、中央倉庫を作成できます。データ ウェアハウスは、ビジネス...