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

Firebase排除当前登录用户展示其他用户的React Native实现问题

解决Firebase Users集合排除当前登录用户的问题

你的代码核心问题:

  • 条件判断if (users && user.uid != doc.id)里的users是状态变量,不是当前登录用户的判断依据,应该直接用user.uid和文档ID对比,无需依赖users状态。
  • slice(current_userVal)完全错误:slice需要数字索引参数,而current_userVal是字符串格式的UID,这会导致数组被错误截取,甚至可能保留当前用户。
  • 1000ms延迟完全没必要:Firebase的onSnapshot本身是异步实时监听,不需要手动延迟加载。
  • currentUserUid属于冗余未使用代码。

修正后的代码:

React.useEffect(() => {
  // 确保当前登录用户存在再执行逻辑
  if (!user?.uid) return;

  setIsLoading(true);

  // 实时监听users集合
  const unsub = db.collection('users').onSnapshot((snap) => {
    const listUsers = [];
    snap.forEach((doc) => {
      // 直接跳过当前登录用户的文档
      if (doc.id !== user.uid) {
        listUsers.push({ id: doc.id, ...doc.data() });
      }
    });
    // 设置过滤后的用户列表
    setUsers(listUsers);
    setIsLoading(false);
  });

  // 清理监听
  return () => unsub();
}, [user?.uid]); // 依赖当前用户UID,用户切换时自动重新监听

关键优化说明:

  • 精准过滤:遍历文档时直接判断doc.id !== user.uid,从根源上排除当前用户,不需要后续的截取操作。
  • 依赖正确:把user?.uid加入useEffect依赖数组,当登录用户变化(比如登出再登录)时,会自动重新监听并更新列表。
  • 简化逻辑:移除无效的延迟定时器和错误的slice操作,让代码更清晰。
  • 安全校验:开头先检查user?.uid是否存在,避免未登录时执行无效逻辑。

特殊情况适配:

如果你的users集合文档ID和用户UID不一致(比如用了自定义ID),只需要把判断条件改成doc.data().uid !== user.uid即可,确保对比的是用户数据里的UID字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:27:20