Auswahl eines React Hooks, der für die Verwendung mit dem Onsnapshot von Firestore geeignet ist
P粉555682718
P粉555682718 2023-08-24 13:48:51
0
2
513
<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>
P粉555682718
P粉555682718

Antworte allen(2)
P粉806834059

如果你结合使用 useEffect 和 useState,会更好。useEffect 负责设置和解除监听器,useState 只需要负责你需要的数据。

const [data, setData] = useState([]);

useEffect(() => { 
       const unsubscribe = someFirestoreAPICall().onSnapshot(snap => {
         const data = snap.docs.map(doc => doc.data())
         this.setData(data)
       });

       //记得在卸载组件时取消实时监听器,否则会造成内存泄漏
       return () => unsubscribe()
}, []);

然后你可以在你的应用中直接引用 useState 钩子中的 "data"。

P粉165522886

A simple useEffect worked for me, i don't need to create a helper function or anything of sorts,

useEffect(() => {
        const colRef = collection(db, "data")
        //real time update
        onSnapshot(colRef, (snapshot) => {
            snapshot.docs.forEach((doc) => {
                setTestData((prev) => [...prev, doc.data()])
                // console.log("onsnapshot", doc.data());
            })
        })
    }, [])

一个简单的useEffect对我很有用,我不需要创建任何帮助函数或类似的东西,

useEffect(() => {
        const colRef = collection(db, "data")
        //实时更新
        onSnapshot(colRef, (snapshot) => {
            snapshot.docs.forEach((doc) => {
                setTestData((prev) => [...prev, doc.data()])
                // console.log("onsnapshot", doc.data());
            })
        })
    }, [])
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage