In dieser GitHub-Ausgabe habe ich im Wesentlichen vorgeschlagen, Folgendes zu ändern:
x = useCallback( ... , []);
Zu:
x = useRef( ... ).current;
Die beiden sind gleich, aber mit useRef
React werden die Abhängigkeiten nicht verglichen.
Auf die eine Antwort mit einer Frage kam:
Gibt es jemals eine Situation, in der ein abhängigkeitsloses useMemo oder useCallback die bessere Wahl wäre als useRef?
Ich kann mir keinen vorstellen, aber ich habe möglicherweise einige Anwendungsfälle übersehen.
Kann sich jemand eine solche Situation vorstellen?
useCallback(x,[])
in "useRef(x)
genauso".useRef(x).current
das ist.useCallback(cb, [])
vsuseRef(cb).current
mir. Obwohl,useMemo(cb, [])
zu unterschiedlich istuseRef(cb).current
in einem gewissen Sinne , dassuseMemo
„nur den memoized Wert neu berechnet , wenn eine der Abhängigkeiten geändert hat.“ Versus,useRef
die den Wert immer neu berechnen, egal was passiert.useRef
Nie neu berechnet - es wird immer der Anfangswert zurückgegeben.Während Sie useRef verwenden können, um useCallback oder mit einer leeren Abhängigkeit zu emulieren, können Sie es nicht für alle möglichen Szenarien von useCallback verwenden, die sich daran erinnern sollen, wenn sich eine der Abhängigkeiten ändert.
Außerdem macht es keinen großen Leistungsunterschied, wenn Sie
useCallback with empty dependency
Ref verwenden oder verwenden, da es keinen umfangreichen Vergleich durchführen muss.Wenn Sie die Funktionsimplementierung ein wenig ändern, sodass Sie sie bei einer bestimmten Parameteränderung neu erstellen müssen, können Sie die Implementierung einfach mit aktualisieren
useCallback
und den zusätzlichen Parameter als Abhängigkeit hinzufügen. Wenn Sie es jedoch mit useRef implementieren, müssen Sie zu zurückkehrenuseCallback
quelle
Weil die Ausgabe von useRef (() => {...}). Current veränderlich ist.
Was seltsame Nebenwirkungen in Ihrem Code verursachen kann. Ich kann den Stromwert jederzeit ändern. https://codesandbox.io/s/confident-monad-vjeuw
Dies wäre der Grund dafür, dass useRef nicht verwendet werden soll
quelle
x = useRef(value).current
Gibt aber niemals veränderbare Instanzen zurück -ref
wird niemals zurückgegeben;current
ist. Das ist das gleiche wie bei deruseCallback
Version.