簡體   English   中英

我如何更改 firebase 上快照中的數據

[英]how can i change the data inside the snapshot on firebase

在我的項目中,我創建了一個 function 以從 firebase 獲取數據然后返回它,但我總是得到一個空數組,我的 function 下面

export const pullDataFromFirebase = (collectionName, reducerName) => {
let data = []
    onSnapshot(collection(db, collectionName), (snapshot) => {
        snapshot.docs.map((doc)=>{
            data.push(doc.data())
        })
    })
return data
}

您不能將承諾與 Firestore 實時更新混合使用。 返回 promise 的函數( async函數)旨在異步返回單個結果。 onSnapshot不會返回 promise。相反,只要查詢結果發生變化,它就會調用提供的回調。

如果您只想從 Firestore 獲取數據,您可以改為這樣做:

export const pullDataFromFirebase = async (collectionName, reducerName) => {
  const q = query(collection(db, collectionName));
  const querySnapshot = await getDocs(q);
  const documents = querySnapshot.docs.map((doc) => ({ id: doc.id, ...doc.data() }));

  return documents;
}

要訪問它,您必須調用異步 function 並使用.then方法。 請參閱下面的代碼:

pullDataFromFirebase(collectionName)
.then((data) => {
  console.log(data);
});

要收聽快照之間的變化,您可以使用這些文檔中的示例代碼:

export const pullDataFromFirebase = async (collectionName, reducerName) => {
      onSnapshot(collection(db, collectionName), (snapshot) => {
        snapshot.docChanges().forEach((change) => {
          if (change.type === "added") {
              console.log("Added", change.doc.id, change.doc.data());
              //call a function.
          }
          if (change.type === "modified") {
              console.log("Modified", change.doc.id, change.doc.data());
              //call an function.
          }
          if (change.type === "removed") {
              console.log("Removed", change.doc.id, change.doc.data());
              //call a function
          }
        });
      });
}

如果願意,您也可以使用React Hooks 通過使用useState()useEffect() 請參閱下面的代碼:

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

  async function pullDataFromFirebase(collectionName, reducerName) {
    const colRef = query(collection(db, collectionName))
    onSnapshot(colRef, (snapshot) => {
      setData(snapshot.docs.map(doc => ({
        doc.data()
      })))
    })
  }

  useEffect(() => {
    pullDataFromFirebase();
  },[])

上面的代碼將能夠將您的文檔數據設置為 state,並能夠在另一個 function 上使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM