[JAVA] [React.useRef] Was tun, wenn im Ereignis-Listener nicht auf den neuesten Status verwiesen werden kann?

Einführung

Dies ist eine Problemumgehung, wenn "Status" im Ereignis-Listener der Funktionskomponente nicht korrekt behandelt werden kann.

Wenn Sie versuchen, den Status von "React.useState ()" in der Rückruffunktion des Ereignis-Listeners zu referenzieren, ist der Wert möglicherweise nicht aktuell.

Beispiele, die nicht funktionieren

  1. Deklarieren Sie einen "Staat", der "Zähler" genannt wird
  2. Klicken Sie auf die Schaltfläche, um "+ 1" zu "Zähler" hinzuzufügen
  3. Der Ereignis-Listener, der auf den Klick reagiert, löst "func ()" aus
  4. Geben Sie den Wert von "counter" aus

Funktionskomponente


// ①
const [counter, setCounter] = React.useState(0);

// ④
const func = () => {
  console.log(counter);
};

// ③
React.useEffect(() => {
  window.addEventListener("click", func);
}, []);

// ②
return (
  <button onClick={() => setCounter(counter + 1)}>
Taste
  </button>

** In diesem Beispiel ist der von ④ console.log (counter) ausgegebene Wert immer 0. ** ** ** Sie ist zum Zeitpunkt der Registrierung des Ereignis-Listeners auf den Wert "Zähler" festgelegt, und die Ausgabe ändert sich auch dann nicht, wenn der Status aktualisiert wird.

Ich weiß nicht, wie oft ich darauf geklickt habe ...

Verwenden Sie useRef ()

Sie können jederzeit mit "React.useRef ()" auf den neuesten Status verweisen.

Beispiele, die funktionieren



const [counter, setCounter] = React.useState(0);

//hinzufügen
const counterRef = useRef(); //Ref-Objekt erstellen
counterRef.current = counter; //ref bezieht sich auf Zähler


const func = () => {
  //Ausgabe ref
  console.log(counterRef.current);
};

// -----Das Folgende ist unverändert-----
React.useEffect(() => {
  window.addEventListener("click", func);
}, []);

return (
  <button onClick={() => setCounter(counter + 1)}>
Taste
  </button>

Verwenden Sie anstelle von "counter" im Rückruf "counterRef.current". Auf diese Weise können Sie auf den neuesten Status verweisen.

Zusammenfassung

Wenn der letzte "Status" im Ereignis-Listener der Funktionskomponente nicht sichtbar ist, verwenden Sie "Ref", um auf "Status" zu verweisen, anstatt "Status" im Rückruf zu verwenden.

Auf diese Weise können Sie auf den neuesten Status verweisen.

Recommended Posts

[React.useRef] Was tun, wenn im Ereignis-Listener nicht auf den neuesten Status verwiesen werden kann?
Was tun, wenn der Befehl adb nicht ausgeführt werden kann?
Was tun, wenn in Java der Fehler "Nicht statische Variable x kann nicht aus dem statischen Kontext referenziert werden" angezeigt wird. Lehren aus dem ersten Schritt der Programmierung Hinweis 01
Was tun, wenn das Git-Repository nicht im Azure Team Explorer für Eclipse angezeigt werden kann?
Was tun, wenn die Änderungen im Servlet nicht berücksichtigt werden?
[Rails] Was ist zu tun, wenn Rails db: migrate nicht ausgeführt werden kann, da keine Tabelle vorhanden ist, auf die der externe Schlüssel verweist?
Was tun, wenn CentOS nicht mit VirtualBox unter Catalina gestartet werden kann?
Was tun, wenn in PlayFramework eine IllegalStateException auftritt?
Was tun, wenn der Wert im zweiten getSubmittedValue () in JSF Validator null wird?
[Ubuntu] Was tun, wenn MongoDB aufgrund eines SocketException-Fehlers nicht gestartet werden kann?
Was tun, wenn das SSL-Zertifikat abgelaufen ist?
Was ist zu tun, wenn in Eclipse "Fehler beim Laden der gemeinsam genutzten JNI-Bibliothek" angezeigt wird?
Was tun, wenn die Methode in f: ajax nicht gefunden wurde?
Was ist zu tun, wenn Ausdrucksoperatoren nicht auf die Methodenbindung angewendet werden können?
Was ist zu tun, wenn ein bestimmtes Objekt in JSF convertDateTime nicht als Datum formatiert werden kann?
[Rails Tutorial Kapitel 2] Was tun, wenn Sie einen Fehlern im Spaltennamen machen?
Was tun, wenn "Relation" hibernate_sequence "nicht existiert" in der ID-Spalte von PostgreSQL + JPA
Was tun, wenn in einer Lightweight-JRE eine UnsupportedCharsetException auftritt?
[Rails] Was tun, wenn der Fehler Keine Datenbank ausgewählt und Unbekannte Datenbank in db: migrate angezeigt wird?
[Programmieranfänger] Was tun, wenn Schienen zu einem Fehler in der lokalen Entwicklungsumgebung werden?
Was tun, wenn die Rails-Seite im Rails-Lernprogramm 1.3.2 nicht angezeigt wird?
Was tun, wenn Sie die Quellposition wissen möchten, an der die Methode in bind.pry definiert ist?
Was tun, wenn Cloud 9 im Rails-Lernprogramm voll ist?
Was ist mit dem Fehler "Kann nicht gelesen werden oder ist keine gültige ZIP-Datei?" Zu tun
Was tun, wenn die App nicht mit der neuesten Rails-Version erstellt wurde, die bei neuen Rails installiert wurde?
Was tun, wenn eine javax.batch.operations.JobStartException auftritt?
Was tun, wenn Sie Ihr Root-Passwort unter CentOS7 vergessen haben?
Das erste, was Sie tun müssen, wenn Sie mit Heroku auf GitHub mit Eclipse auf Java zufrieden sein möchten
Was tun, wenn der Vorgang nicht zulässig ist, wenn ein Befehl im Terminal ausgeführt wird?
Was tun, wenn JavaMail nicht mit OpenJDK 11 oder höher verwendet werden kann?
[IOS] Was tun, wenn das Bild mit einer Farbe gefüllt ist?
Was tun, wenn das Präfix c in JSP nicht gebunden ist?
Was tun, wenn blockierter Host: "Hostname" in Ruby on Rails angezeigt wird
Was tun, wenn der Tomcat-Prozess bestehen bleibt, wenn Sie Tomcat in Eclipse stoppen?
Hinweise zur Vorgehensweise beim Auftreten einer WebView ClassNotFoundException in JavaFX 12
Was tun, wenn eine javax.el.PropertyNotWritableException auftritt?
undefinierte Methode Was tun, wenn Sie "user_signed_in" erhalten?
So übersetzen Sie die Fehlermeldung ins Japanische (Was tun, wenn Sie sich aus irgendeinem Grund nicht anmelden können)
Was tun, wenn Sie glauben, dass Sie mit IntelliJ IDEA CE nicht Groovy-> Java können?
Was tun, wenn die Änderungen nicht in der JAR-Manifestdatei berücksichtigt werden?
[Grails] Beim Ausführen ist ein Fehler aufgetreten. Was ist zu tun, wenn die Grails-CLI nicht gestartet wird?
Androd: Was tun gegen "The Realm befindet sich bereits in einer Schreibtransaktion in"
Was tun, wenn das Laden der SPA-URL von WebView nicht erkannt werden sollte
Was tun, wenn die ffi-Installation beim Starten einer Anwendung in Rails fehlschlägt?
Was tun, wenn der Server-Tomcat stirbt?
Was ist zu tun, wenn in einer der Quellen in der Entwicklungsumgebung mit Docker × Rails × RSpec "Nicht gefunden" angezeigt wird?
Wenn Eclipse den Server nicht starten kann
[Rails] Was tun, wenn Sie einen Fehler generieren möchten, der nicht behoben werden kann, wenn externe Schlüsselbeschränkungen angewendet werden?
Was tun beim Debuggen von "Quelle nicht gefunden"?
Was verwenden Sie beim Konvertieren in String?
Was tun, wenn Sie den Text eines Elements in Selen nicht abrufen können?
Was tun, wenn die bereits verwendete Adresse nach dem Ausführen der Schienen angezeigt wird?
Was tun, wenn Sie den Befehl "Java-Paketname / Klassenname" nicht ausführen können?
Was tun, wenn die Installation des Debug-Gems fehlschlägt?
[Android] Lösung, wenn die Kamera unter Android 9 nicht gestartet werden kann
Was tun, wenn der Rails-Server nicht gestartet werden kann?