【发布时间】:2021-01-27 22:48:32
【问题描述】:
背景
我正在为我正在开发的应用程序构建一个“喜欢的商店”屏幕。此屏幕呈现flatlist,其中显示了用户喜欢的每个商店的卡片。我处理该过程的方式是,当用户喜欢商店时,它会在 firestore 中创建一个新文档,其中包含商店的 id 和“喜欢”boolean。
问题
我一直在尝试过滤我的数据库中的商店总数,并将喜欢的商店的 id 与“喜欢”集合文档中的 id 匹配。
数据结构为:
user/uid/favorites,这里的每个文档都包含 2 个字段。一个 id(与 stores/ 集合中的另一个 id 匹配)和一个布尔值,表明它已被点赞。然后stores/ 的文档包含大量数据,但这里重要的是一个包含 id 的字段。
我尝试实现以下解决方案,两个订阅者带来每个集合和一个处理过滤的函数。但由于某种原因,我不太明白我只是无法让它工作。
代码如下:
const [stores, setStores] = useState([]);
useEffect(() => {
const subscriber = firebase.firestore()
.collection('stores/')
.onSnapshot(querySnapshot => {
const stores = [];
querySnapshot.forEach(documentSnapshot => {
stores.push({
...documentSnapshot.data(),
key: documentSnapshot.id,
});
});
setStores(stores);
});
return () => subscriber();
}, [])
const [liked, setLiked] = useState([]);
useEffect(() => {
const subscriber = firebase.firestore()
.collection('users/' + userId + '/favorites')
.onSnapshot(querySnapshot => {
const liked = [];
querySnapshot.forEach(documentSnapshot => {
liked.push({
...documentSnapshot.data(),
key: documentSnapshot.id,
});
});
setLiked(liked);
});
return () => subscriber();
}, [])
const usefulData = [];
const handleFilter = (obj) => {
for(let i = 0; i < stores.length; i++){
if(obj.id === liked[i].storeId) {
usefulData.push(obj)
}
}
}
stores.filter(handleFilter);
然后我将 usefulData 作为数据参数传递给 FlatList。
打印有用数据时,它只返回一个空数组。
问题
谁能提供一个解决方案和解释为什么这不起作用以及如何正确比较两个对象数组的值?
【问题讨论】:
-
如果没有实际数据(要弄清楚它的结构),回答您的问题可能会很棘手。
-
@YevgenGorbunkov Gorbunkov 添加了我猜你指的数据。
-
如果您能提供您的 Firestore 数据库的屏幕截图,那就太好了。这样就更容易理解您想要实现的目标并改进您的解决方案。
标签: javascript firebase react-native google-cloud-firestore