Reactイベントスロットリング効果が失敗する理由と解決策

Reactイベントスロットリング効果が失敗する理由と解決策

今日、React プロジェクトに取り組んでいたとき、入力 onKeyDown イベントをスロットルしましたが、スロットル効果は失敗しました。

問題コード:

与える() {
    戻る (
      <div className="検索バー">
        <input className="search-input" type="text" placeholder="検索するユーザー名を入力してください(英語)" onKeyDown={this.throttle(this.handleKeyDown)}/>
      </div>
    )
  }
スロットル = (fn) => {
    有効 = true とする
    const コンテキスト = this

    関数()を返す{
      (!有効)の場合、戻り値
      有効 = 偽

      const args = 引数

      fn.apply(コンテキスト、引数)

      タイムアウトを設定する(() => {
        有効 = 真
      }, 1000);
    }
  }

  ハンドルキーダウン = (e) => {
    {値} = e.targetとする
    定数キーコード = e.keyCode

    (キーコード!== 13)の場合、戻り値

    if (!value.trim()) 戻り値
    
    // 検索を送信 this.props.search(value)
  }

ここでの問題は次の通りです:

handleKeyDown() メソッドの this.props.search(value)
コンポーネントのプロパティが更新され、React 更新フローのライフサイクルがトリガーされます。 render() を再実行しました。

このようにして、throttle() メソッドが再実行されます。

スロットル = (fn) => {
    console.log('%c スロットル初期化', '色: 赤');
    有効 = true とする
    const コンテキスト = this

    関数()を返す{
      (!有効)の場合、戻り値
      有効 = 偽

      const args = 引数

      fn.apply(コンテキスト、引数)

      タイムアウトを設定する(() => {
        有効 = 真
      }, 1000);
    }
  }

コードに印刷を追加すると、スロットル初期化によってコンソールに複数の行が印刷されることがわかります。

解決策1:

スロットル初期化位置をイベント関数の割り当てに入れる

与える() {
    戻る (
      <div className="検索バー">
        <input className="search-input" type="text" placeholder="検索するユーザー名を入力してください(英語)" onKeyDown={this.handleKeyDown}/>
      </div>
    )
  }
handleKeyDown = this.throttle((e) => {
    {値} = e.targetとする
    定数キーコード = e.keyCode

    (キーコード!== 13)の場合、戻り値

    if (!value.trim()) 戻り値
    
    // 検索を送信 this.props.search(value)
  })

解決策2: コンストラクタで初期化を割り当てる

与える() {
    戻る (
      <div className="検索バー">
        <input className="search-input" type="text" placeholder="検索するユーザー名を入力してください(英語)" onKeyDown={this.handleKeyDown}/>
      </div>
    )
  }
コンストラクタ(props) {
    スーパー(小道具)
    this.handleKeyDown = this.throttle(this.handleSearch)
  }

  ハンドルサーチ = (e) => {
    {値} = e.targetとする
    定数キーコード = e.keyCode

    (キーコード!== 13)の場合、戻り値

    if (!value.trim()) 戻り値
    
    // 検索を送信 this.props.search(value)
  }

採掘ピットの概要:

反応ライフサイクルのトリガーメカニズムをより深く理解するために

上記は、React イベント スロットリング効果の失敗の原因と解決策の詳細な内容です。React イベント スロットリング効果の失敗の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • ReactプロジェクトにSCSSを導入する方法
  • ReactでAngularコンポーネントを導入する方法
  • ReactはコンテナコンポーネントとディスプレイコンポーネントをVueに導入します
  • React の国際化 react-intl の使用
  • React 合成イベントの説明
  • ReactのPropsの簡単な比較
  • antd+reactプロジェクトをviteに移行するためのソリューションの詳細な説明
  • Amap を使用した React 実装例 (react-amap)
  • Reactの簡単な紹介

<<:  スーパーバイザーを使用して nginx + tomcat コンテナを管理する例

>>:  MySQL IN ステートメントにおける低速クエリの効率を最適化する手法の例

推薦する

MYSQL 左結合の最適化 (10 秒から 20 ミリ秒)

目次【機能背景】 [生のSQL] 【独自SQL解析】 【分析手順】 [最適化されたSQL] 【最適化...

MySQL 5.6 のインストール手順(画像とテキスト付き)

MySQL はオープンソースの小規模リレーショナル データベース管理システムです。現在、MySQL...

CentOS8 yum/dnfで国内ソースを設定する方法

CentOS 8 ではソフトウェア パッケージのインストール プログラムが変更され、yum 構成方法...

Windows 10 無料インストール版の MySQL インストールと設定のチュートリアル

ネットでいろいろ検索してみたところ、Linux システム向けではなく、現在の新しいバージョンと一致し...

IDEA の Docker プラグインを介して Springboot プロジェクトを公開する方法の詳細なチュートリアル

1. Dockerfileを書く(1)プロジェクト名を右クリックして新しいテキストファイルを作成し、...

Tomcat のパフォーマンス最適化のための Apr モジュールの構築方法

序文Tomcat は、無数のチューニング オプションを備えた、広く使用されている Java Web ...

初心者向け入門チュートリアル⑨:ポータルサイトの構築方法

さらに、ブログ プログラムで構築された記事 Web サイトは常にブログのように見え、カスタマイズでき...

ウェブページの読み込み進捗状況バーの詳細な説明(推奨)

(Web ページの読み込み中に、コンテンツが多すぎて読み込みと待機が続くことがあります。このとき、...

Centos8 システムの VMware インストール チュートリアル図 (コマンド ライン モード)

目次1. ソフトウェアとシステムイメージ2. 仮想マシンを作成する3. CentOS8をインストール...

CSSでemを開く正しい方法の詳細な説明

「通常 1em=16px」と言うのはなぜですか?ユーザーのブラウザによってレンダリングされるデフォル...

Vue ユニットテストに関する予備調査

目次序文なぜユニットテストを導入するのですか?ユニットテストの概要テスト開発パターン1. テスト駆動...

CSSメディアクエリのアスペクト比を小さくする方法

CSS メディア クエリには非常に便利なアスペクト比、aspect-ratio があり、幅と高さを直...

editplus の Zen コーディング例コードの説明

たとえば、次のように入力します。 XML/HTML コードdiv#ページ>(div#ヘッダー&...

JSX を使用してカルーセル コンポーネントを実装する方法 (フロントエンドのコンポーネント化)

JSX を使用してコンポーネント システムを構築する前に、例を使用してコンポーネントの実装原理とロ...

VMware Workstation 15 Pro に Ubuntu 1804 をインストールするチュートリアル (画像とテキスト付き)

このメモはインストール チュートリアルです。実用的な意味はありません。記録のためだけに書いています。...