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

推薦する

モバイルページで縦画面を強制する方法

最近、仕事でモバイルページを作成しました。もともと特別なことではありませんでしたが、非常に奇妙に感じ...

WeChatミニプログラム抽選コンポーネントの使い方

WeChatコンポーネントの形式で提供されます。コンポーネント内部ではasync/awaitが使用さ...

Vue 3 で Vue Router リンクを拡張する方法

序文<router-link> タグは、Vue アプリ内のさまざまなページ間を移動するた...

Nginx は動的と静的の分離を実装します 例の説明

ウェブサイトの解析を高速化するために、動的ページと静的ページを異なるサーバーで解析して、解析速度を向...

Portainer を使用して複数の Docker コンテナ環境を管理する方法を説明します。

目次Portainerは複数のDockerコンテナ環境を管理します2. Dockerを管理する2.1...

MySQLで日付と時刻を照会する方法

序文:プロジェクト開発では、一部のビジネス テーブル フィールドで日付と時刻の型が使用されることが多...

メモリ構成が過剰でMySQLが起動できない問題の解決方法

問題の説明MySQL の起動時にエラーが報告されます。エラー ログを確認してください。 [エラー] ...

シンプルなカルーセル効果を実現するJavaScript

カルーセルとは何ですか?カルーセル: モジュールまたはウィンドウで、コンピューターでマウスをクリック...

熟練デザイナーの7つの原則(2):色の使い方

<br />前回の記事:優秀なデザイナーの7つの原則(1):フォントデザイン 英語 原文...

img usemap 属性 中国地図リンク

HTML img タグ: Web ページに導入される画像を定義します。興味深い usemap 属性も...

Node.js で MySQL データベースにバッチデータを挿入する方法

プロジェクト(nodejs)では、一度に複数のデータをデータベースに挿入する必要があります。データベ...

Docker に nginx をインストールし、https 経由でアクセスを構成する方法

1. 最新のnginx dockerイメージをダウンロードする $ docker pull ngin...

固定テーブル幅テーブルレイアウト: 固定

テーブルを画面全体(残りの空白領域)に表示するために、幅属性は 100% と定義されることが多く、セ...

Vue プロジェクトに ECharts を導入する

目次1. インストール2. はじめに3. 使用4. 必要に応じてEChartsチャートとコンポーネン...

Vue フィルターの実装と適用シナリオの詳細な説明

1. 簡単な紹介Vue.js を使用すると、一般的なテキストの書式設定に使用できる独自のフィルターを...