You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native集成Firebase后无法访问Firestore文档数据以展示

React Native + Firebase Firestore:筛选并展示当前用户收藏数据

问题描述

我开发了一个React Native应用,正在集成Google Firebase。目前已完成Firestore数据库配置并关联应用,执行查询能获取到文档,但无法正确提取数据用于界面展示。需求是:获取已登录用户ID(此功能正常),遍历UserFavorites集合中的每个文档,提取文档内的userId字段与当前用户ID对比,一致则将该文档数据存入状态数组,最终展示给用户。

现有代码

useEffect(() => {
    if(auth.currentUser === null){
      navigation.navigate('LoginStack')
    }
    const collectionRef = collection(db, 'UserFavorites')
    getDocs(collectionRef)
      .then((snapshot) => {
        let properties = []
        snapshot.docs.forEach((doc) => {
          console.log(auth.currentUser.uid)
          console.log(doc.data())
        })
      })
      .catch((error) => {
        console.error(error)
      })
  }, [])

当前控制台输出

j4aeXJORvINA8m2bYpNGMcaUm9T2
Object {
  "address": "966 Palisades Beach Rd, Santa Monica, CA 90403",
  "bathrooms": 8,
  "bedrooms": 5,
  "contingentListingType": "FHA",
  "country": "USA",
  "currency": "USD",
  "dateSold": Object {
    "nanoseconds": 842000000,
    "seconds": 1658695140,
  },
  "daysOnZillow": 1,
  "hasImage": true,
  "imgSrc": "https://photos.zillowstatic.com/fp/64da6094eae05eba27184401e006ee69-p_e.jpg",
  "latitude": 34.01869,
  "listingStatus": "FOR_SALE",
  "livingArea": 7043,
  "longitude": -118.50533,
  "lotAreaUnit": "sqft",
  "lotAreaValue": 5466.78,
  "price": 25000000,
  "propertyType": "SINGLE_FAMILY",
  "userId": "j4aeXJORvINA8m2bYpNGMcaUm9T2",
  "zpid": "20485843",
}

解决步骤

1. 单独输出文档中的userId字段

要直接打印userId,只需访问doc.data()返回对象的userId属性:

console.log(doc.data().userId)

2. 筛选当前用户数据并更新状态

首先用useState定义存储收藏数据的状态:

const [userFavorites, setUserFavorites] = useState([]);

然后在查询回调中过滤匹配当前用户ID的文档,更新状态:

useEffect(() => {
    if(!auth.currentUser){
      navigation.navigate('LoginStack')
      return; // 提前退出,避免后续无意义操作
    }
    const currentUserId = auth.currentUser.uid;
    const collectionRef = collection(db, 'UserFavorites')
    getDocs(collectionRef)
      .then((snapshot) => {
        // 转换文档数据并筛选当前用户的收藏
        const filteredFavorites = snapshot.docs
          .map(doc => ({ ...doc.data(), id: doc.id })) // 保留文档ID,方便后续操作
          .filter(item => item.userId === currentUserId);
        setUserFavorites(filteredFavorites);
      })
      .catch((error) => {
        console.error(error)
      })
  }, [auth.currentUser, navigation])

3. 优化查询(推荐)

直接遍历整个集合效率较低,建议在查询阶段就用where条件过滤,减少数据传输:

useEffect(() => {
    if(!auth.currentUser){
      navigation.navigate('LoginStack')
      return;
    }
    const currentUserId = auth.currentUser.uid;
    const collectionRef = collection(db, 'UserFavorites');
    // 添加where条件直接筛选当前用户的数据
    const queryRef = query(collectionRef, where('userId', '==', currentUserId));
    getDocs(queryRef)
      .then((snapshot) => {
        const favorites = snapshot.docs.map(doc => ({ ...doc.data(), id: doc.id }));
        setUserFavorites(favorites);
      })
      .catch((error) => {
        console.error(error)
      })
  }, [auth.currentUser, navigation])

4. 界面展示数据

用FlatList渲染状态中的收藏数据:

<FlatList
  data={userFavorites}
  keyExtractor={(item) => item.id}
  renderItem={({ item }) => (
    <View style={{ padding: 16, borderBottomWidth: 1, borderBottomColor: '#eee' }}>
      <Text style={{ fontSize: 16, fontWeight: 'bold' }}>{item.address}</Text>
      <Text style={{ marginTop: 8 }}>${item.price.toLocaleString()}</Text>
      <Image 
        source={{ uri: item.imgSrc }} 
        style={{ width: 200, height: 150, marginTop: 8, borderRadius: 8 }} 
        resizeMode="cover"
      />
    </View>
  )}
/>

内容的提问来源于stack exchange,提问作者ojandali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:24:30