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 ステートメントにおける低速クエリの効率を最適化する手法の例

推薦する

HTMLはマーキーを使用してテキストを左右にスクロールします

コードをコピーコードは次のとおりです。 <本文> //マーキーの助けを借りて<MA...

js の parseInt() の奇妙な動作の調査と修正

背景: parseInt(0.006) または parseInt(0.0006) は 0 という値を...

Linux システムで IPv6 をサポートするように Nginx を設定する方法

1. 既存のnginxがipv6をサポートしているかどうかを確認する既存の nginx が ipv6...

Nginx セッション損失問題の解決策

nginx をリバース プロキシ tomcat として使用する場合、セッション損失が発生する可能性が...

Linuxのdateコマンドの使用

1. コマンドの紹介date コマンドは、現在の時刻または指定された時刻を指定された形式で表示するた...

docker の実行に必要な権限の分析

Docker を実行するには root 権限が必要です。非 root ユーザーに docker コマ...

JS配列の一般的な方法とテクニックを学び、マスターになりましょう

目次splice() メソッドjoin() メソッド逆() メソッドevery() メソッド削減()...

音声キューイングシステムを実装するためのJavaScript

目次導入主な特徴エフェクト表示キーコード導入音声キューイングシステムは、銀行、レストラン、病院などの...

CentOS8 で Docker を使用してオープンソース プロジェクト Tcloud をデプロイするチュートリアル

1. Dockerをインストールする1. 仮想マシンに Centos7 をインストールしました。Li...

jsはショッピングウェブサイトの商品の拡大鏡効果を実現します

この記事では、ショッピングサイトの商品の拡大鏡効果を実現するためのjsの具体的なコードを紹介します。...

DockerHubを自分で構築する方法

先ほど使用したDocker HubはDockerによって提供されています。独自のDockerを構築す...

Vue での ElementUI の使用に関する詳細な説明

ログイン + セッションストレージエフェクト表示ログインに成功すると、ユーザー ID がフロントエン...

MySQLで全角文字と半角文字を保存する場合の違い

残念ながら、社内の IM のテスト中に MYSQL_DATA_TRUNCATED エラーが再び発生し...

MYSQLの文字セット設定方法(端末の文字セット)の詳しい説明

序文ターミナルを使用してデータベースまたはテーブルを作成するたびに、文字セットが latin1 であ...

JavaScript で大きなファイルの並列ダウンロードを実装する方法

目次1. HTTP範囲リクエスト1.1 範囲構文2. 大きなファイルをダウンロードする方法2.1 補...