如何让Firebase快照返回空文档列表,避免返回undefined?
解决方案
直接用filter+map的组合替代单独的map,同时处理未登录的情况,就能完美解决你的问题:
onSnapshot(orderCollectionRef, snapshot => { // 未登录时直接设置空数组 if (!currentUser) { setOrders([]); return; } // 先筛选出当前用户的订单,再转换为需要的格式 const validOrders = snapshot.docs .filter(docItem => docItem.data().email === currentUser.email) .map(docItem => ({ ...docItem.data() })); setOrders(validOrders); })
改动说明
- 单独用
map时,不匹配的项会返回undefined(你之前写的返回null也会留在数组里),导致orders数组混进无效数据;先用filter把不匹配的文档直接筛掉,剩下的都是符合条件的,再用map转换格式,得到的数组全是有效订单。 - 每次快照更新时,都会重新计算整个
validOrders数组,用setOrders直接覆盖旧状态,不会出现push导致的重复添加问题。 - 加了
currentUser的判断,未登录时直接设置空数组,满足你要的无订单/未登录时返回空数组的需求。
内容的提问来源于stack exchange,提问作者Myth Vince
相关产品推荐
相关产品推荐

