使用!==过滤聊天列表被屏蔽用户失效,仅排除单个用户
解决聊天列表过滤所有被屏蔽用户的问题
你的问题出在当前代码的逻辑上:现在你是遍历每个被屏蔽用户ID,单独对聊天列表做监听过滤,每次只处理一个被屏蔽ID。如果把判断条件改成!==,每次过滤只会排除当前遍历的那个ID的消息,其他被屏蔽ID的消息还是会被保留,而且多次监听的结果会叠加,导致看起来只排除了一个用户。
要一次性排除所有被屏蔽用户,应该先拿到完整的被屏蔽ID列表,然后在一次监听里过滤掉所有属于该列表的消息。下面是修正后的代码:
const checkBlockedUsers = async () => { // 获取被屏蔽用户ID列表 const blockedUsersRef = collection(db, `users`, auth.currentUser?.uid, `blockedUsers`); const blockedUsersSnapshot = await getDocs(blockedUsersRef); const blockedUsersList = blockedUsersSnapshot.docs.map(doc => doc.data().blockedUser.id); // 只创建一次聊天列表的快照监听 onSnapshot( query(collection(db, `convos`, convoId, `chats`), orderBy(`timestamp`, `asc`)), snapshot => { // 过滤出所有不在被屏蔽列表里的用户消息 const filteredData = snapshot.docs.filter(doc => { const userId = doc.data().user.id; return !blockedUsersList.includes(userId); }); // 处理过滤后的结果,比如打印未被屏蔽的用户名 filteredData.map(doc => { console.log(doc.data().user.username); }); } ); };
关键改动说明:
- 用
async/await替代then链式调用,代码逻辑更清晰,避免回调嵌套 - 一次性获取所有被屏蔽用户ID,存入
blockedUsersList数组 - 只创建一次聊天列表的
onSnapshot监听,避免重复监听造成的资源浪费和结果叠加 - 过滤条件改为
!blockedUsersList.includes(userId),直接判断当前消息的用户ID是否在被屏蔽列表中,一次性排除所有被屏蔽用户的消息
内容的提问来源于stack exchange,提问作者mac
相关产品推荐
相关产品推荐

