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

So konfigurieren Sie Umgebungsvariablen in einer Linux-Umgebung

JDK-Downloadadresse: http://www.oracle.com/techne...

Zusammenfassung gängiger MySQL-DDL-Operationen

Bibliotheksverwaltung Erstellen einer Bibliothek ...

Tutorial zur Installation und Konfiguration von MySQL 5.7 unter CentOS7 (YUM)

Installationsumgebung: CentOS7 64-Bit, MySQL5.7 1...

Detaillierte Beschreibung der HTML-Tabellenrahmensteuerung

Nur den oberen Rand anzeigen <table frame=above...

Beschreibung des Meta-Viewport-Attributs in der HTML-Webseite

Beschreibung der HTML-Meta-Viewport-Attribute Was...

Ein kurzer Vortrag über Responsive Design

1. Was ist Responsive Design? Responsive Design b...

Implementierung von webpack-dev-server zum Erstellen eines lokalen Servers

Inhaltsverzeichnis Vorwort Webpack-Deb-Server Sta...

So erklären Sie TypeScript-Generika auf einfache Weise

Inhaltsverzeichnis Überblick Was sind Generika Sy...

Weitergabe von Techniken für Farbkontrast und -harmonie im Web

Farbkontrast und Harmonie Unter kontrastierenden ...

Installations-Tutorial für die komprimierte Version von MySQL 5.7.18 Archiv

In diesem Artikel wird die spezifische Methode zu...

So legen Sie Verknüpfungssymbole in Linux fest

Vorwort Durch das Erstellen von Verknüpfungen in ...

Beispiele und bewährte Vorgehensweisen für die Seitennummerierung

<br />Struktur und Hierarchie reduzieren die...