新闻中心
基于 Context API 和 Socket.IO 实现房间内用户列表展示

本文将介绍如何利用 Context API 和 Socket.IO 构建一个在线聊天应用,并实现在特定房间内显示当前活跃用户列表的功能。重点讲解如何在 React 组件中使用 Socket.IO 接收用户信息,并结合 Context API 中的房间信息,过滤并渲染当前房间的用户列表。
前提条件
在开始之前,请确保您已具备以下基础知识:
- React 基础
- Context API 的使用
- Socket.IO 的基本概念和使用
实现步骤
-
Context API 设置:
首先,我们需要使用 Context API 来管理房间信息。创建一个 RoomContext,并在应用中提供该 Context。
// RoomContext.js import React, { createContext, useState } from 'react'; export const RoomContext = createContext(); export const RoomProvider = ({ children }) => { const [room, setRoom] = useState(''); return ( <RoomContext.Provider value={{ room, setRoom }}> {children} </RoomContext.Provider> ); };在应用的根组件中包裹 RoomProvider,使所有子组件都可以访问房间信息。
// App.js import { RoomProvider } from './RoomContext'; function App() { return ( <RoomProvider> {/* 应用的其他组件 */} </RoomProvider> ); } export default App; -
Socket.IO 事件监听:
在 ChatMembers 组件中,使用 useEffect 监听 Socket.IO 的 newUserResponse 事件。该事件触发时,会收到包含所有用户信息的数组。
import React, { useState, useEffect, useContext } from 'react'; import { RoomContext } from './RoomContext'; import { AuthContext } from './AuthContext'; // 假设您也有一个 AuthContext const ChatMembers = ({ socket }) => { const currentUser = useContext(AuthContext); // 获取当前用户信息(如果需要) const [users, setUsers] = useState([]); const { room } = useContext(RoomContext); useEffect(() => { socket.on("newUserResponse", (data) => { setUsers(data); }); // 组件卸载时移除事件监听 return () => { socket.off("newUserResponse"); }; }, [socket]); // socket 依赖项注意事项:
MarsCode
字节跳动旗下的免费AI编程工具
339
查看详情
- 在 useEffect 中返回一个清理函数,使用 socket.off() 移除事件监听,防止内存泄漏。
- 将 socket 作为 useEffect 的依赖项,确保每次 socket 实例改变时,都会重新注册事件监听。
-
用户列表过滤与渲染:
使用 users.map() 遍历用户数组,并使用条件判断筛选出当前房间的用户。
<div> {users.map((user) => { if (user.room === room) { return ( <p key={user.socketID}>{user.displayName}</p> ); } return null; // 或者返回一个空的 Fragment:<React.Fragment></React.Fragment> 或 <></> })} </div>优化建议:
-
可以使用 Array.filter() 方法先过滤出当前房间的用户,再进行渲染,提高性能。
const filteredUsers = users.filter(user => user.room === room); return ( <div> {filteredUsers.map(user => ( <p key={user.socketID}>{user.displayName}</p> ))} </div> );
-
-
完整代码示例:
import React, { useState, useEffect, useContext } from 'react'; import { RoomCo
ntext } from './RoomContext';
import { AuthContext } from './AuthContext'; // 假设您也有一个 AuthContext
const ChatMembers = ({ socket }) => {
const currentUser = useContext(AuthContext); // 获取当前用户信息(如果需要)
const [users, setUsers] = useState([]);
const { room } = useContext(RoomContext);
useEffect(() => {
socket.on("newUserResponse", (data) => {
setUsers(data);
});
// 组件卸载时移除事件监听
return () => {
socket.off("newUserResponse");
};
}, [socket]); // socket 依赖项
const filteredUsers = users.filter(user => user.room === room);
return (
{filteredUsers.map(user => (
{user.displayName}
))} ); }; export default ChatMembers;
总结
通过以上步骤,我们成功地实现了基于 Context API 和 Socket.IO 的房间内用户列表展示功能。 关键在于正确使用 useEffect 监听 Socket.IO 事件,并结合 Context API 中的房间信息,对用户列表进行过滤和渲染。记住在组件卸载时移除事件监听,防止内存泄漏。 使用 Array.filter() 优化性能,提高用户体验。 希望本教程能帮助您更好地理解和应用 Context API 和 Socket.IO。
以上就是基于 Context API 和 Socket.IO 实现房间内用户列表展示的详细内容,更多请关注其它相关文章!
# 有何不同
# 免费建设淘客网站
# seo营销推广文章外推
# 贵州遵义学院网站建设
# 汽车网站建设专业
# 刀具推广网站
# 山东网站网络推广方案
# 巴中企业网站建设团队
# 上海矩阵seo有效果吗
# 手游荒野行动营销推广
# 江西网站建设网络推广
# 加载
# react
# 有一个
# 并结合
# 如何实现
# 服务端
# 您也
# 自定义
# 移除
# 用户列表
# red
# app
# js
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
在命令行怎么运行html项目_命令行运行html项目方法【教程】
poki免费入口快捷访问 poki人气小游戏直接玩站点
Typer应用中动态命令行参数的解析与处理
C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用
Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践
fishbowl官网免费版 fishbowl养鱼网站入口
Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达
Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】
移动端XML文件怎么转换成Excel 手机和平板上的解决方案
如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略
品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程
解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException
EMS快递官网app_中国邮政速递物流手机客户端
菜鸟取件码是什么怎么查 最全查询渠道汇总
HTML长属性值处理:表单action路径优化与代码规范应对
微信商城在哪里打开【步骤】
如何将HTML表格多行数据保存到Google Sheets
Lar*el表单中优雅地处理“返回”按钮以规避验证:最佳实践指南
Pyrogram与g4f集成:异步编程实践与常见错误解决
微信网页版官方入口直达 微信网页版网页版登录使用方法
深入理解Google Cloud Datastore查询:祖先路径与数据一致性
如何修改开机登录密码_Windows账户安全设置超详细教程【必学】
Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略
css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间
poki网页游戏推荐_poki免费游戏平台入口
c++ dfs和bfs代码 c++深度广度优先搜索算法
AO3访问入口汇总 AO3网页版同人作品一键直达
优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践
《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!
蛙漫官方正版入口 蛙漫网页在线全集免费观看
C#如何安全地从用户上传的XML文件中读取数据? 验证与清理策略
一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰
在哪找SublimeJ远程工具_SFTP插件配置教程
《主播少女的秘密账号迷宫》首支宣传片
微信网页版官方入口教程 微信网页版网页版快速登录步骤
铁路12306的积分有效期是多久_铁路12306积分有效期说明
AO3镜像入口大全 AO3网页版内容访问全集
J*aScript数据结构转换:将对象数组按类别分组
Centos/Linux 系统下安装 composer 的完整步骤
学习通在线学习平台 学习通网页版直接进入课程中心
J*a TimerTask中HashMap意外清空的深层原因与解决方案
win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】
Go调试环境为何无法启动_Go调试器启动失败原因与解决策略
现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践
sublime怎么预览Markdown渲染效果_Markdown Preview插件 for sublime教程
Python中如何避免重复条件判断:利用数据结构实现动态逻辑
Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐
css滚动动画效果怎么实现_使用Animate.css滚动触发动画类
Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】
在VS Code中配置和运行Dart程序的完整步骤


2025-10-24
浏览次数:次
返回列表
ntext } from './RoomContext';
import { AuthContext } from './AuthContext'; // 假设您也有一个 AuthContext
const ChatMembers = ({ socket }) => {
const currentUser = useContext(AuthContext); // 获取当前用户信息(如果需要)
const [users, setUsers] = useState([]);
const { room } = useContext(RoomContext);
useEffect(() => {
socket.on("newUserResponse", (data) => {
setUsers(data);
});
// 组件卸载时移除事件监听
return () => {
socket.off("newUserResponse");
};
}, [socket]); // socket 依赖项
const filteredUsers = users.filter(user => user.room === room);
return (
{filteredUsers.map(user => (