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
相关产品推荐
相关产品推荐

