今日、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) このようにして、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 の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: スーパーバイザーを使用して nginx + tomcat コンテナを管理する例
>>: MySQL IN ステートメントにおける低速クエリの効率を最適化する手法の例
以下は、純粋な CSS で記述された画像マウスホバーズーム効果です。実際、基本原理は非常に単純です。...
フォーム内の visibility=hidden および display=none のフォーム要素は...
MySQL トランザクション サポートは、MySQL サーバー自体にバインドされているのではなく、ス...
プロジェクトをプロジェクトサイトのテスト環境にデプロイするJDK1.8トムキャット8.5 Maven...
NetEase Blog で HTML を使用する場合、テンプレートに直接コードを追加できることは...
この記事ではMySQL 8.0.24バージョンのインストールと設定方法を記録し、皆さんと共有しますM...
MySQLはインストール版と無料インストール版に分かれていますインストール版の拡張子はmsi、無料イ...
目次解決策1: EUIの転送コンポーネントをコピーして変更し、プロジェクトディレクトリに導入する解決...
Canvas は HTML5 の新しいタグです。js を使用して Canvas 描画 API を操作...
基本概念操作の前に、まずいくつかの基本的な概念を理解する必要がありますディスクLinux システムで...
目次メッセージボード必要なライブラリオープンソースプロジェクトプロジェクト構造メッセージボードnod...
背景会社のサブプロジェクトが増えるにつれて、さまざまなサイズのプロジェクトが10個以上になります(バ...
1. 問題の説明: MysqlERROR1698 (28000) の解決方法、新しくインストールされ...
序文この記事では主に、MySQL のインデックスとビューの使用方法と違いを紹介し、参考と学習のために...
この記事の例では、多人数チャットルームを実装するためのjsコードの具体的なコードを参考までに共有して...