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

推薦する

CSS3 マウスホバー遷移ズーム効果

以下は、純粋な CSS で記述された画像マウスホバーズーム効果です。実際、基本原理は非常に単純です。...

フォーム内のどの隠し属性をフォームとともに送信できるか

フォーム内の visibility=hidden および display=none のフォーム要素は...

MySQLトランザクション処理の使用方法とサンプルコードの詳細な説明

MySQL トランザクション サポートは、MySQL サーバー自体にバインドされているのではなく、ス...

Linux 上でプロジェクトをリリースするために Tomcat を展開するプロセスにおけるさまざまな問題と解決策

プロジェクトをプロジェクトサイトのテスト環境にデプロイするJDK1.8トムキャット8.5 Maven...

HTML テーブルの使い方 (Web ページの視覚効果を表示する)

NetEase Blog で HTML を使用する場合、テンプレートに直接コードを追加できることは...

MySQL 8.0.24 バージョンのインストールと設定方法のグラフィックチュートリアル

この記事ではMySQL 8.0.24バージョンのインストールと設定方法を記録し、皆さんと共有しますM...

MySQL 5.7.18 バージョンの無料インストール構成チュートリアル

MySQLはインストール版と無料インストール版に分かれていますインストール版の拡張子はmsi、無料イ...

大量のデータを含むエレメントのシャトルボックスで「すべて選択」をクリックするとスタックする問題の解決方法

目次解決策1: EUIの転送コンポーネントをコピーして変更し、プロジェクトディレクトリに導入する解決...

JSはキャンバス技術を使用してeChartsの棒グラフを模倣します

Canvas は HTML5 の新しいタグです。js を使用して Canvas 描画 API を操作...

Linux ディスクのマウント、パーティション分割、容量拡張操作を実装する方法

基本概念操作の前に、まずいくつかの基本的な概念を理解する必要がありますディスクLinux システムで...

Node.js+expressメッセージボード機能実装例

目次メッセージボード必要なライブラリオープンソースプロジェクトプロジェクト構造メッセージボードnod...

nginx を使用して 1 つのドメイン名で複数の Laravel プロジェクトを構成する方法の例

背景会社のサブプロジェクトが増えるにつれて、さまざまなサイズのプロジェクトが10個以上になります(バ...

MySql エラー 1698 (28000) の解決策

1. 問題の説明: MysqlERROR1698 (28000) の解決方法、新しくインストールされ...

MySQL のインデックスとビューの使用方法と違いの詳細な説明

序文この記事では主に、MySQL のインデックスとビューの使用方法と違いを紹介し、参考と学習のために...

複数人チャットルームを実現する js コード

この記事の例では、多人数チャットルームを実装するためのjsコードの具体的なコードを参考までに共有して...