我使用的是带有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);
那么怎样才能做到呢?
1条答案
按热度按时间tct7dpnv1#
我做到了。我会把答案贴在B/c上,也许有一天会帮助到别人。
获取firestore实时数据的诀窍是不要调用
useEffect()
内部的getData()
.那是B/cuseEffect()
将在页面加载时运行它一次.可能有一种方法来监听更改并作为参数应用到useEffect()
钩子,但这种方法很简单.所以我所做的是在创建了
getData()
之后,就叫它吧。这个做得最好希望这个有帮助。