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

MySQL-Tabellenübergreifende Abfrage und Tabellenübergreifende Aktualisierung

Freunde, die über Grundkenntnisse in SQL verfügen...

Detaillierte Erklärung dieses Zeigeproblems in JavaScript

Vorwort Glauben Sie mir, solange Sie sich an die ...

So erstellen Sie Benutzer und verwalten Berechtigungen in MySQL

1. So erstellen Sie einen Benutzer und ein Passwo...

V-Bind in Vue verstehen

Inhaltsverzeichnis 1. Analyse des wichtigsten Que...

Architektur und Komponentenbeschreibung der privaten Docker-Bibliothek Harbor

In diesem Artikel wird die Zusammensetzung der Ha...

Warum wirkt sich die Verwendung von Limits in MySQL auf die Leistung aus?

Lassen Sie mich zunächst die MySQL-Version erklär...

js zur Realisierung von Login- und Registrierungsfunktionen

In diesem Artikelbeispiel wird der spezifische Co...

TCP-Socket-SYN-Warteschlange und Accept-Warteschlangen-Unterschiedsanalyse

Zunächst müssen wir verstehen, dass ein TCP-Socke...