Vue 関数のアンチシェイクとスロットリングの正しい使用方法

Vue 関数のアンチシェイクとスロットリングの正しい使用方法

序文

1. デバウンス: 高頻度イベントがトリガーされた後、関数は n 秒以内に 1 回だけ実行されます。高頻度イベントが n 秒以内に再度トリガーされた場合、時間が再計算されます。

たとえば、Baidu で検索するときと同じように、入力するたびに関連語がポップアップ表示されます。関連語を制御するこの方法は、入力ボックスの内容が変更されてもすぐにはトリガーされません。入力を終了してからしばらく経ってからトリガーする必要があります。

スロットリング: 高頻度イベントがトリガーされますが、n 秒以内に 1 回しか実行されないため、スロットリングによって関数の実行頻度が低下します。

たとえば、関数は実行サイクル以上の場合にのみ実行されるようにスケジュールされ、サイクル中に呼び出された場合は実行されません。これは、Taobao で限定版の売れ筋商品を購入しようとしているときに、購入するために更新ボタンを何度もクリックしているのに、クリックが機能しなくなるときが来るようなものです。ここでスロットリングが登場します。クリックが速すぎるとシステムにバグが発生するのを恐れるからです。

2. 違い: アンチシェイクは複数の実行を最後の実行にすることであり、スロットリングは複数の実行を間隔をあけて実行にすることです。

手ぶれ補正やスロットリング機能は、常にインタビューの話題になります。皆さんは関数 anti-shake や throttling の書き方についてはよくご存知かもしれませんが、Vue で関数 anti-shake や throttling を使用する際にはちょっとしたエピソードがあります。

Vue での正しい使用姿勢

多くの人は関数を直接定義し、関数内で debounce を使用すると思います。これは間違った使い方です。

なぜ?これは Vue のイベントバインディング原則に関連していますが、ここでは詳しく紹介しません。関数本体内で直接使用すると、最終結果として、即時実行される匿名関数が実行されることになり、これは誤りです。詳細な参照

原理

関数のデシェイキング

手ぶれ防止機能とは、機能が実行されるまでの時間を指します。これは、生活のシナリオ(エレベーターに乗る)として理解できます。エレベーターのドアを開くボタンをクリックすると、エレベーターはドアを開き、しばらく待ってからドアを閉めます。ただし、待機期間中に誰かがドア開ボタンを再度クリックすると、エレベーターはドア閉時間まで待機し続けます。ドア閉時間が終了し、誰もドア開ボタンをクリックしなくなるまで、エレベーターは作動しません。

コード記述

最初の非即時実行

エクスポート関数debounce(f, t){
    タイマーを設定します。
    戻り値 (...引数) => {
        タイマーをクリアします。
        タイマー = setTimeout(() => {
            f( ...引数)
        }, t)
    }
}

最初の即時実行

いくつかのシナリオでは、最初に待つ必要がなく、すぐに実行する必要があります。たとえば、コンソールを開いてウィンドウのビュー サイズを取得します (ここでは、ウィンドウ サイズを変更し続け、停止するまで待機してから、ウィンドウのビュー サイズを再度取得する必要があります)。

エクスポート関数 debounceFirstExe(f, t){
    タイマーを設定し、フラグを true にします。
    戻り値 (...引数) => {
        if (フラグ){
            f(...引数);
            フラグ = false;
        }それ以外 {
            タイマーをクリアします。
            タイマー = setTimeout(() => {
                f(...引数);
                フラグ = true;
            }, t)
        }
    }
}

統合版

エクスポート関数 debounce(f, t, im = false){
    タイマーを設定し、フラグを true にします。
    戻り値 (...引数) => {
        // すぐに実行する必要がある場合 if (im){
           if (フラグ){
               f(...引数);
               フラグ = false;
           }それ以外 {
               タイマーをクリアします。
               タイマー = setTimeout(() => {
                   f(...引数);
                   フラグ = true
               }, t)
           }
       }それ以外 {
           // 即時実行ではない clearTimeout(timer);
           タイマー = setTimeout(() => {
               f(...引数)
           }, t)
       }
    }
}

コード レベルで関数 anti-shake をどこで使用できますか?

いいね、入力ボックスの確認、いいねのキャンセル、注文の作成などのネットワーク水素を送信する場合、ボタンを連続してクリックすると、複数のリクエストが送信されることがあります。これはバックエンドでは許可されません。マウスのサイズが変更/スクロールされるたびに、統計イベントがトリガーされます。

関数のスロットリング

機能スロットリングの原理は、機能手ぶれ補正の原理と似ています。機能スロットリングとは、一定期間内に 1 回だけ実行されることを意味します。

最初の非即時実行

関数スロットル(f,t)をエクスポートする{
    タイマーを true にします。
    戻り値 (...引数) =>{
        if(!タイマー){
            戻る;
        }
        タイマー=false;
        タイムアウトを設定します(()=>{
            f(...引数);
            タイマー=true;
        },t)

    }
}

エフェクトでは何度もクリックしましたが、実行時間を 1000 ミリ秒に指定したため、実行されたのは 4 回だけでした。これにより、実行回数も削減されます。

最初の即時実行バージョン

エクスポート関数 throttleFirstExt(f, t) {
    フラグを true にします。
    戻り値 (...引数) => {
        if (フラグ) {
            f(...引数);
            フラグ = false;
            タイムアウトを設定する(() => {
                フラグ = true
            }, t)
        }
    }
}

ここでは、最初のクリックがすぐに実行されることがわかります。

統合版

関数スロットルをエクスポートします(f, t, im = false){
    フラグを true にします。
    戻り値 (...引数) =>{
        if(フラグ){
            フラグ = 偽
            im && f(...引数)
            タイムアウトを設定する(() => {
                !im && f(...引数)
                フラグ = true
            },t)
        }
    }
}

適用シナリオ:

  • DOM要素のドラッグ機能の実装(mousemove)
  • 関連付けを検索(キーアップ)
  • マウスの移動距離を計算する (mousemove)
  • キャンバスは描画ボード機能(マウス移動)をシミュレートします
  • シューティング ゲームでのマウスダウン/キーダウン イベント (単位時間あたりに発射できる弾丸は 1 発のみ)
  • スクロール イベントをリッスンして、ページが最下部に到達したかどうかを判断し、自動的にさらに読み込みます。スクロールにデバウンスを追加すると、ユーザーがスクロールを停止した後にのみ、ページの最下部に到達したかどうかが判断されます。スロットルの場合は、ページがスクロールされている限り、一定期間ごとに 1 回判断されます。

要約する

Vue 機能の手ぶれ補正とスロットリングの正しい使い方に関するこの記事はこれで終わりです。Vue 機能の手ぶれ補正とスロットリングに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue における機能アンチシェイクスロットリングの理解と応用
  • Vue で手ぶれ補正とスロットリングを使用する方法
  • Vueでアンチシェイクとスロットリングを使用すると、これが指摘する問題

<<:  Docker ベースの ELK を素早く構築する方法

>>:  MySql が常に mySqlInstallerConsole ウィンドウをポップアップする問題の解決策

推薦する

HTMLチュートリアル、簡単に学べるHTML言語

1. <body background=画像ファイル名 bgcolor=color text=...

ActiveMQ メッセージ サービスを構築するための Docker 学習方法の手順

序文ActiveMQ は、Apache が開発した最も人気があり強力なオープン ソース メッセージ ...

体験したい17 404ページ

404 を避けるべきだとどうして言えるのでしょうか? その理由は、ほとんどの 404 ページが粗雑す...

Linux ディスク領域解放問題の概要

IDC のサーバーの /partition 使用率がいっぱいです。 100% に到達しました!確認し...

ローカル フォルダー内の画像を読み込んで表示するための HTML サンプル コード

一つの目的Html ページでローカル フォルダーを選択すると、フォルダーとそのサブフォルダー内のすべ...

HTML タイトルに二重引用符を追加する方法

<a href="https://www.jb51.net/" title...

Vueライフサイクルの違いの詳細な説明

ライフサイクル分類vue の各コンポーネントは独立しており、各コンポーネントには独自のライフサイクル...

MySQL InnoDB のトランザクション特性を確保するにはどうすればよいですか?

序文「データベース トランザクションの特徴は何ですか?」と尋ねられたら、 ACID 特性である原子性...

Mysqlのマージ結果と水平スプライシングフィールドの実装手順

序文最近、レポート機能に取り組んでいたのですが、ある月に各部署に入社した人と退職した人の数をカウント...

突然外部ネットワークからDockerにアクセスできなくなる問題の解決方法

マスターのメソッドによると、原因は sysctl net.ipv4.ip_forward であること...

フロートをクリアするための CSS メソッドの概要

フロートはWebページのレイアウトでよく使用されますが、フローティングブロックレベル要素は標準のドキ...

W3C チュートリアル (6): W3C CSS アクティビティ

スタイル シートは、ドキュメントの表示方法、発音方法、または入力方法を記述します。スタイル シートは...

Windows での MySQL 8.0.15 の詳細なインストールと使用のチュートリアル

この記事では、MySQL 8.0.15の詳細なインストールと使用方法のチュートリアルを参考までに紹介...

ログインと登録を実現するSpringboot+VUE

この記事の例では、ログインと登録を実装するためのspringboot+VUEの具体的なコードを参考ま...

抽選効果を実現するJavaScript

この記事では、宝くじマシンの効果を実現するためのJavaScriptの具体的なコードを参考までに共有...