Gründe und Lösungen für das Versagen des React-Ereignisdrosselungseffekts

Gründe und Lösungen für das Versagen des React-Ereignisdrosselungseffekts

Als ich heute an einem React-Projekt arbeitete, habe ich ein onKeyDown-Eingabeereignis gedrosselt, aber der Drosselungseffekt schlug fehl.

Problemcode:

rendern() {
    zurückkehren (
      <div className="Suchleiste">
        <input className="search-input" type="text" placeholder="Bitte geben Sie den zu suchenden Benutzernamen ein (Englisch)" onKeyDown={this.throttle(this.handleKeyDown)}/>
      </div>
    )
  }
Gashebel = (fn) => {
    let gültig = wahr
    const Kontext = dies

    return Funktion() {
      wenn (!gültig) zurückgeben
      gültig = falsch

      const args = Argumente

      fn.apply(Kontext, Argumente)

      setzeTimeout(() => {
        gültig = wahr
      }, 1000);
    }
  }

  handleKeyDown = (e) => {
    let { Wert } = e.Ziel
    const keyCode = e.keyCode

    wenn (Schlüsselcode !== 13) return

    wenn (!Wert.trim()) return
    
    // Suche senden this.props.search(value)
  }

Das Problem hierbei ist:

this.props.search(value) in der handleKeyDown()-Methode
Die Komponenteneigenschaften werden aktualisiert, wodurch der Lebenszyklus des React-Update-Flows ausgelöst wird. Render() erneut ausgeführt;

Auf diese Weise wird die Methode throttle() erneut ausgeführt.

Gashebel = (fn) => {
    console.log('%c Drosselklappeninitialisierung', 'Farbe: rot');
    let gültig = wahr
    const Kontext = dies

    return Funktion() {
      wenn (!gültig) zurückgeben
      gültig = falsch

      const args = Argumente

      fn.apply(Kontext, Argumente)

      setzeTimeout(() => {
        gültig = wahr
      }, 1000);
    }
  }

Wenn Sie dem Code das Drucken hinzufügen, sehen Sie, dass die Drosselklappeninitialisierung mehrere Zeilen in der Konsole druckt.

Lösung 1:

Setzen Sie die Drosselungsinitialisierungsposition in die Ereignisfunktionszuweisung ein

rendern() {
    zurückkehren (
      <div className="Suchleiste">
        <input className="search-input" type="text" placeholder="Bitte geben Sie den zu suchenden Benutzernamen ein (Englisch)" onKeyDown={this.handleKeyDown}/>
      </div>
    )
  }
handleKeyDown = diese.throttle((e) => {
    let { Wert } = e.Ziel
    const keyCode = e.keyCode

    wenn (Schlüsselcode !== 13) return

    wenn (!Wert.trim()) return
    
    // Suche senden this.props.search(value)
  })

Lösung 2: Initialisierung im Konstruktor zuweisen

rendern() {
    zurückkehren (
      <div className="Suchleiste">
        <input className="search-input" type="text" placeholder="Bitte geben Sie den zu suchenden Benutzernamen ein (Englisch)" onKeyDown={this.handleKeyDown}/>
      </div>
    )
  }
Konstruktor(Requisiten) {
    super(Requisiten)
    dies.handleKeyDown = dies.throttle(dies.handleSearch)
  }

  handleSearch = (e) => {
    let { Wert } = e.Ziel
    const keyCode = e.keyCode

    wenn (Schlüsselcode !== 13) return

    wenn (!Wert.trim()) return
    
    // Suche senden this.props.search(value)
  }

Übersicht über die Bergbaugruben:

Um den Auslösemechanismus des Reaktionslebenszyklus besser zu verstehen

Oben finden Sie ausführliche Informationen zu den Gründen und Lösungen für das Versagen des Drosselungseffekts von React-Ereignissen. Weitere Informationen zum Versagen des Drosselungseffekts von React-Ereignissen finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • So führen Sie SCSS in ein React-Projekt ein
  • So führen Sie Angular-Komponenten in React ein
  • React führt Containerkomponenten und Anzeigekomponenten in Vue ein
  • React-Internationalisierung – Verwendung von react-intl
  • Erläuterung synthetischer React-Ereignisse
  • Ein kurzer Vergleich von Props in React
  • Detaillierte Erklärung der Lösung zur Migration von Antd+React-Projekten nach Vite
  • React-Implementierungsbeispiel mit Amap (react-amap)
  • Eine kurze Einführung in React

<<:  Beispiele für Optimierungstechniken zur Verbesserung der Effizienz langsamer Abfragen in MySQL IN-Anweisungen

>>:  Erläuterung der Linux-Kernel-Optimierungskonfiguration für hochparallele Nginx-Server

Artikel empfehlen

JavaScript implementiert die H5-Goldmünzenfunktion (Beispielcode)

Heute habe ich eine Aktivität für einen roten Ums...

So verwenden Sie Watch-Listener in Vue2 und Vue3

watch : auf Datenänderungen achten (Änderungserei...

HTML übertrifft das Implementierungsprinzip und den Code des Textzeilenabfangs

Der HTML-Code zum Abfangen von mehrzeiligem Text l...

So verwenden Sie den regulären Matching-Selektor für CSS-Attributwerte (Tipps)

Es gibt drei Typen von regulären Matching-Selekto...

Ausnahmefehler beim Packen von Webpack-Dateien

Vor dem Verpacken im Webpack müssen wir sicherste...

JavaScript-Flusskontrolle (Schleife)

Inhaltsverzeichnis 1. for-Schleife 2. Doppelte fo...

Eine kurze Analyse der asynchronen DOM-Aktualisierung von Vue

Inhaltsverzeichnis Das Prinzip der asynchronen DO...

Methode der Iframe-Anpassung im webresponsiven Layout

Problem <br />Bei responsivem Layout sollte...

Funktionsprinzip und Implementierungsmethode der Vue-Anweisung

Einführung in Vue Die aktuelle Ära der großen Fro...

So stellen Sie Gitlab mit Docker-Compose bereit

Docker-Compose stellt Gitlab bereit 1. Docker ins...