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


基于 context api 和 socket.io 实现房间内用户列表展示

本文将介绍如何利用 Context API 和 Socket.IO 构建一个在线聊天应用,并实现在特定房间内显示当前活跃用户列表的功能。重点讲解如何在 React 组件中使用 Socket.IO 接收用户信息,并结合 Context API 中的房间信息,过滤并渲染当前房间的用户列表。

前提条件

在开始之前,请确保您已具备以下基础知识:

  • React 基础
  • Context API 的使用
  • Socket.IO 的基本概念和使用

实现步骤

  1. 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;
  2. 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 依赖项

    注意事项:

    即梦AI 即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    即梦AI 16094 查看详情 即梦AI
    • 在 useEffect 中返回一个清理函数,使用 socket.off() 移除事件监听,防止内存泄漏。
    • 将 socket 作为 useEffect 的依赖项,确保每次 socket 实例改变时,都会重新注册事件监听。
  3. 用户列表过滤与渲染:

    使用 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>
      );
  4. 完整代码示例:

    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 依赖项
    
      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企业优化方案  # 雨花台区模板网站优化  # 什邡市全网营销推广  # 产品营销类网站建设思路  # 政府网站优化改造方案  # 海陵外贸公司网站推广  # 泉州优化推广网站  # 优化句子网站  # 相关文章  # react  # 遍历  # 加载  # 有一个  # 并结合  # 您也  # 自定义  # 移除  # 用户列表  # red  # app  # js 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: AngularJS动态内容中DOM元素查找的时序问题及$timeout解决方案  漫蛙漫画直连入口 _ manwa官方备用入口实时检测  谷歌邮箱怎么换绑定邮箱Gmail安全备份邮箱修改方法  《雷电模拟器》截图方法介绍  《tt语音》超级玩家开通方法  J*aScript桌面应用_Electron多进程架构实战  OPPO手机参数配置如何开启护眼模式_OPPO手机参数配置护眼模式开启指南  人教版电子教材在线获取指南  win11如何诊断DirectX问题 Win11运行dxdiag工具排查显卡故障【排错】  荣耀 Magic10 Pro 系统更新提示失败_荣耀 Magic10 Pro 升级修复  京东快递物流信息不更新怎么办_物流停滞原因与处理方法  windows server2019显卡驱动怎么安装_winserver2019显卡驱动安装与远程桌面优化  在PHP环境中正确加载HTML资源:CSS样式与图片路径指南  PPT页面尺寸怎么修改 PPT自定义幻灯片大小与方向设置【教程】  微信网页版在线登录 微信网页版在线使用入口  TikTok私信无法发送表情怎么办 TikTok消息表情发送修复方法  火狐浏览器如何刷新修复浏览器 火狐浏览器“重置Firefox”功能详解  微星主板BIOS怎么调整内存时序_内存参数手动优化BIOS设置教程  键盘保修需要什么_键盘售后维修流程  在J*a里什么是行为抽象_抽象行为对代码复用的提升作用  如何在mysql中比较InnoDB和MyISAM区别  《U校园》学生登录入口2025  深入理解随机递归函数的确定性:内部节点、叶节点与时间复杂度分析  曝《丝之歌》DLC有望开发!开发商还有神秘新企划  CSS如何控制元素外边距_margin实现布局间隔  精通VS Code多光标编辑以实现闪电般快速的修改  win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】  Django模型动态关联检查:高效管理复杂关系  Excel怎么用XLOOKUP函数实现双向查找_ExcelXLOOKUP替代VLOOKUP+HLOOKUP的高级用法  海棠阅读登录教程_详细讲解海棠登录操作  海外搜索引擎推广效果怎么样,怎么分析效果!  视频号视频怎么提取文案?提取的文案如何优化与使用?  快手极速版在线体验区 快手极速版网页体验入口  PHP utf8_encode 字符编码转换陷阱与解决方案  Win10如何查看已安装的更新补丁 Win10卸载指定更新教程【教程】  《幻兽帕鲁》手游帕鲁捕捉技巧分享  解决PHP MySQL数据库更新无响应:SQL查询语法错误解析  抖音怎么解除第三方绑定_抖音解除第三方平台绑定方法介绍  盲鳗善于分泌黏液猜猜主要用来做什么  驱动人生:游戏修复指南  Sublime怎么配置YAML文件格式化_Sublime YAML Formatter插件教程  windows10怎么开启卓越性能_windows10电源选项代码激活  《气泡星球》兑换码礼包大全  CodeIgniter 3 中基于 MySQL 数据高效生成动态图表教程  《花瓣》创建专辑方法  自定义你的VS Code状态栏,监控关键信息  智学网app怎么登录忘记密码_智学网app忘记密码找回与重新登录操作方法  谷歌邮箱官方入口链接 谷歌邮箱网页版电脑端快速登录  漫蛙app官方版手机正版入口-漫蛙漫画manwa在线漫画正版入口  263企业邮箱如何设置邮件转发功能 

 2025-10-24

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.