reactjs 如何使用Next JS实时读取Firestore数据

inn6fuwd  于 2023-02-12  发布在  React
关注(0)|答案(1)|浏览(111)

我使用的是带有firebase v9的next js 13,所以为了从firestore读取数据,我使用了一个react-firebase-hook包,但是当我尝试使用它时,它抛出了错误FirebaseError: Expected type 'pa', but it was: a custom $n object

const constraints = [];
  if (price) constraints.push(orderBy("price", price == "1" ? "desc" : "asc"));

  const livings = collection(db, "livingPosts");

  const [living, loading, error] = useCollection(
    query(collection(db, "livingPosts"), ...constraints)
  );

在此之前,我使用了通常的方法,通过创建一个异步方法并调用它内部使用效果。但这将只运行在应用程序启动,所以这意味着为了获得新的数据或过滤返回的数据,用户将不得不刷新页面。这是不理想的。

const getData = async () => {
    const constraints = [];

    if (price)
      constraints.push(orderBy("price", price == "1" ? "desc" : "asc"));

    const livings = collection(db, "livingPosts");
    let q = query(livings, ...constraints);

    const qSnapshot = await getDocs(q);

    const dataQ = qSnapshot.docs.map((doc) => ({
      ...doc.data(),
      id: doc.id,
    }));
    console.log(dataQ);
    setDatas(dataQ);

    // console.log("first datas");
    // console.log(datas);
  };

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

我想用这两种方法做的是我有带条件运行的复合查询。

if (price) constraints.push(orderBy("price", price == "1" ? "desc" : "asc"));
if (type) constraints.push(where("type", "==", type);

那么怎样才能做到呢?

tct7dpnv

tct7dpnv1#

我做到了。我会把答案贴在B/c上,也许有一天会帮助到别人。
获取firestore实时数据的诀窍是不要调用useEffect()内部的getData().那是B/c useEffect()将在页面加载时运行它一次.可能有一种方法来监听更改并作为参数应用到useEffect()钩子,但这种方法很简单.
所以我所做的是在创建了getData()之后,就叫它吧。

const getData = async () => {
  ...rest of the function
};

getData();

这个做得最好希望这个有帮助。

相关问题