React-Tipps zeigen Ihnen, wie Sie Probleme mit Hook-Abhängigkeiten beseitigen

React-Tipps zeigen Ihnen, wie Sie Probleme mit Hook-Abhängigkeiten beseitigen

Ein sehr häufiges Szenario in react -Projekten:

const [Uhrwert, setzeUhrwert] = useState('');
const [andererWert1, setzeAnderenWert1] = useState('');
const [andererWert2, setzeAndererWert2] = useState('');

useEffect(() => {
    tuEtwas(andererWert1, andererWert2);
}, [Uhrwert, andererWert1, andererWert2]);

Wir möchten doSomething ausführen, wenn sich watchValue ändert, wodurch auf die anderen Werte otherValue1 und otherValue2 verwiesen wird.

Hier kommt eine beunruhigende Frage:

  • Wenn otherValue1 und otherValue2 nicht zum Abhängigkeits-Array hinzugefügt werden, greift doSomething wahrscheinlich auf die alten Variablenreferenzen von otherValue1 und otherValue2 zu, was zu unerwarteten Fehlern führt (wenn hooks -bezogenes eslint installiert ist, wird eine Warnung angezeigt).
  • Im Gegenteil, wenn otherValue1 und otherValue2 zum Abhängigkeitsarray hinzugefügt werden, wird doSomething auch ausgeführt, wenn sich diese beiden Werte ändern, was nicht das ist, was wir wollen (wir wollen nur auf ihre Werte verweisen, aber nicht, dass sie doSomething auslösen).

Dieses Problem kann gelöst werden, indem otherValue1 und otherValue2 in ref geändert werden:

const [Uhrwert, setzeUhrwert] = useState('');
const other1 = useRef('');
const other2 = useRef('');

// ref muss nicht zum Abhängigkeits-Array hinzugefügt werden, da die Referenz unverändert bleibt useEffect(() => {
    tuEtwas(anderes1.aktuell, anderes2.aktuell);
}, [Uhrwert]);

Auf diese Weise ändern sich die Variablenreferenzen von other1 und other2 nicht, wodurch das vorherige Problem gelöst wird, jedoch ein neues Problem eingeführt wird: Wenn sich der current Wert von other1 und other2 ändert, wird keine erneute Komponentendarstellung ausgelöst (Änderungen useRef的current lösen keine Komponentendarstellung aus), sodass die Schnittstelle bei einer Wertänderung nicht aktualisiert wird!

Dies ist bei hooks ein Problem. Die Variable useState löst ein erneutes Rendering aus und hält die Schnittstelle auf dem neuesten Stand, aber wenn sie als Abhängigkeit von useEffect verwendet wird, löst sie immer eine unerwünschte Funktionsausführung aus. Die Variable useRef kann sicher als useEffect Abhängigkeit verwendet werden, sie löst jedoch kein Komponenten-Rendering aus und die Schnittstelle wird nicht aktualisiert.
Wie kann man das Problem lösen?

Sie können die Funktionen von useRef und useState kombinieren, um eine neue hooks -Funktion zu erstellen: useStateRef .

importiere { useState, useRef } von "react";

// Benutze das Referenzmerkmal von useRef und behalte dabei die Reaktionsfähigkeit von useState bei. Typ StateRefObj<T> = {
  _Zustand: T;
  Wert: T;
};
Exportieren Sie die Standardfunktion useStateRef<T>(
  Anfangszustand: T | (() => T)
): StateRefObj<T> {
  // Initialisierungswert const [init] = useState(() => {
    wenn (Typ von Anfangszustand === "Funktion") {
      return (Initialstatus als () => T)();
    }
    gib den Anfangszustand zurück;
  });
  // Einen Status festlegen, um die Komponentendarstellung auszulösen const [, setState] = useState(init);
  
  // Beim Lesen des Werts wird der neuste Wert ermittelt // Beim Setzen des Werts wird „setState“ ausgelöst und die Komponente wird gerendert const [ref] = useState<StateRefObj<T>>(() => {
    zurückkehren {
      _state: init,
      Wert einstellen(v: T) {
        dieser._zustand = v;
        setzeZustand(v);
      },
      Wert abrufen() {
        gib diesen Status zurück;
      },
    };
  });
  
  // Zurückgegeben wird eine Referenzvariable, die während des gesamten Lebenszyklus der Komponente unverändert bleibt return ref;
}

Wir können es also folgendermaßen verwenden:

const watch = useStateRef('');
const other1 = useStateRef('');
const other2 = useStateRef('');

// Ändern Sie den Wert wie folgt: watch.value = "new";

useEffect(() => {
    tuEtwas(anderer1.Wert, anderer2.Wert);
   // Tatsächlich sind diese drei Werte jetzt Referenzvariablen, die während des gesamten Lebenszyklus der Komponente unverändert bleiben, sodass keine Abhängigkeitsarrays hinzugefügt werden müssen. // Das eslint-Plugin von React-Hooks kann useRef jedoch nur als Referenz erkennen. Wenn es nicht hinzugefügt wird, wird es die Leute warnen. Aus Sicherheitsgründen wird es dennoch hinzugefügt. }, [watch.value, other1, other2]);

Auf diese Weise verfügen watch, other1 und other2 über die Referenzfunktion von useRef und lösen keine unnötige Ausführung von doSomething aus. Durch die Reaktionsfähigkeit von useState wird durch die Änderung von .value die Komponentendarstellung und Schnittstellenaktualisierungen ausgelöst.
Wenn wir möchten, dass die Variablenänderung doSomething auslöst, fügen wir watch.value zum Abhängigkeits-Array hinzu. Wenn wir lediglich auf den Wert verweisen möchten und nicht möchten, dass dieser doSomething auslöst, fügen wir die Variable selbst dem Array hinzu.

Oben finden Sie die Details der React-Tipps, wie Sie die Probleme der Hook-Abhängigkeit beseitigen können. Weitere Informationen zur React-Hook-Abhängigkeit finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung zu React Hooks
  • Häufige Fehler bei der Verwendung von React Hooks
  • 30 Minuten, um Ihnen ein umfassendes Verständnis von React Hooks zu vermitteln
  • So funktionieren React Hooks
  • Vor- und Nachteile von React Hooks
  • Reacts Übergang von Klassen zu Hooks

<<:  Analyse des Implementierungsprozesses der Nginx-Hochverfügbarkeitslösung in der Produktionsumgebung

>>:  Installationstutorial für MySQL 5.7 unter CentOS 7

Artikel empfehlen

Podman bootet den Container automatisch und vergleicht ihn mit Docker

Inhaltsverzeichnis 1. Einführung in Podman 2. Vor...

So beheben Sie das Eingabe-Jitter-Problem beim WeChat-Applet

Finden Sie das Problem Schauen wir uns zunächst d...

Vue verwendet dynamische Komponenten, um einen TAB-Umschalteffekt zu erzielen

Inhaltsverzeichnis Problembeschreibung Was ist di...

Zusammenfassung von 6 Lösungen zur Implementierung des Singleton-Modus in JS

Vorwort Heute habe ich das Erzeugungsmuster im En...

So verwenden Sie Typescript zum Kapseln von lokalem Speicher

Inhaltsverzeichnis Vorwort Szenarien für die Verw...

So ändern Sie den Hostnamen in Linux

1. Den aktuellen Hostnamen anzeigen [root@fangjia...

So erzielen Sie mit three.js einen dynamischen 3D-Texteffekt

Vorwort Hallo zusammen, hier ist der CSS-Assisten...

Das Vue-Projekt implementiert einen grafischen Überprüfungscode

In diesem Artikelbeispiel wird der spezifische Co...

MySQL-String-Aufteilungsvorgang (String-Abfangen mit Trennzeichen)

String-Extraktion ohne Trennzeichen Fragenanforde...

Implementierung der Docker-Bereitstellung von ElasticSearch und ElasticSearch-Head

In diesem Artikel wird hauptsächlich erläutert, w...

Beispielcode für Django+Vue-Registrierung und -Anmeldung

registrieren Das Front-End verwendet Axios in Vue...

SQL-Implementierung von LeetCode (197. Steigende Temperatur)

[LeetCode] 197.Steigende Temperatur Schreiben Sie...

Mehrere Möglichkeiten zum Verbinden von Tabellen in MySQL

Die Verbindungsmethode in der MySQL-Tabelle ist e...

So verwenden Sie Web-Frontend-Vektorsymbole

Vorwort Beim Schreiben von Frontend-Seiten verwen...

Lösung für das Jitter-Problem beim CSS3-Transformationsübergang

transform: scale(); Skalierung verursacht Jitter ...