Auswahl eines React Hooks, der für die Verwendung mit dem Onsnapshot von Firestore geeignet ist
P粉555682718
2023-08-24 13:48:51
<p>Ich verwende in meiner React Native-App häufig Firestore-Snapshots. Ich habe auch React-Hooks verwendet. Der Code sieht so aus: </p>
<pre class="brush:php;toolbar:false;">useEffect(() => {
someFirestoreAPICall().onSnapshot(snapshot => {
// Wenn die Komponente zum ersten Mal geladen wird, alle geladenen Daten zum Status hinzufügen.
// Wenn sich die Daten im Firestore ändern, erhalten wir Aktualisierungen in diesem Rückruf.
// Anschließend die Benutzeroberfläche basierend auf dem aktuellen Status aktualisieren
});;
}, []);</pre>
<p>Zuerst dachte ich, <code>useState</code> sei der beste Hook zum Speichern und Aktualisieren der Benutzeroberfläche. Allerdings ist der aktuelle Status gemäß den Einstellungen meines <code>useEffect</code>-Hooks, der ein leeres Abhängigkeitsarray enthält, undefiniert, wenn der Snapshot-Callback ausgelöst wird und ich versuche, den aktuellen Status mit neuen Änderungen zu ändern . Ich denke, das liegt an den Schließungen. Ich konnte dieses Problem lösen, indem ich <code>useRef</code> und <code>forceUpdate()</code>
<pre class="brush:php;toolbar:false;">const dataRef = useRef(initialData);
const [, updateState] = React.useState();
const forceUpdate = useCallback(() => updateState({}), []);
useEffect(() => {
someFirestoreAPICall().onSnapshot(snapshot => {
// Wenn Snapshot-Daten hinzugefügt werden
dataRef.current.push(newData)
Update erzwingen()
//Wenn die Snapshot-Daten aktualisiert werden
dataRef.current.find(e => einige Bedingungen) = aktualisierte Daten
Update erzwingen()
});;
}, []);
zurückkehren(
// JSX mit dataRef.current
)</pre>
<p>Meine Frage ist, verwende ich <code>useRef</code> richtig und anders als <code>useState</code>? Ich habe das Gefühl, dass die Aktualisierung des Hooks <code>useRef</code> und der Aufruf von <code>forceUpdate()</code> nicht korrekt sind. Beim Versuch, <code>useState</code> zu verwenden, habe ich versucht, die Statusvariable zum Abhängigkeitsarray hinzuzufügen, aber das führte zu einer Endlosschleife. Ich möchte die Snapshot-Funktion nur einmal initialisieren und möchte, dass die Zustandsdaten in der Komponente im Laufe der Zeit aktualisiert werden, wenn sich das Backend ändert (ausgelöst im onSnapshot-Rückruf). </p>
如果你结合使用 useEffect 和 useState,会更好。useEffect 负责设置和解除监听器,useState 只需要负责你需要的数据。
然后你可以在你的应用中直接引用 useState 钩子中的 "data"。
A simple useEffect worked for me, i don't need to create a helper function or anything of sorts,
一个简单的useEffect对我很有用,我不需要创建任何帮助函数或类似的东西,