当前位置: 首页 > news >正文

WHAT - useWebSocket 推荐

文章目录

  • 什么是 useWebSocket?
  • 常用库推荐
  • 示例:使用 react-use-websocket
    • 1. 安装依赖
    • 2. 基本使用示例
  • 如果你想自定义 useWebSocket Hook
  • 适合的使用场景

在 WHAT - 学习 WebSocket 实时 Web 开发 中我们知道:

推荐前端封装 WebSocket hook:如 useWebSocket Hook 在 React 项目中使用。

useWebSocket 是一个在 React 项目中封装 WebSocket 连接的 Hook,让 WebSocket 的使用更符合 React 的思维方式(组件化、响应式)。


什么是 useWebSocket?

它是一种自定义 Hook,可以:

  • 管理连接状态(连接中、已连接、已断开)
  • 发送和接收消息
  • 支持自动重连、心跳机制
  • 在 React 生命周期内自动清理连接

常用库推荐

名称特点
react-use-websocket功能全面、使用简单、支持重连、心跳、发送 JSON
自定义 useWebSocket可根据自己项目封装,灵活控制逻辑

示例:使用 react-use-websocket

1. 安装依赖

npm install react-use-websocket

2. 基本使用示例

import useWebSocket, { ReadyState } from 'react-use-websocket';const Chat = () => {const { sendMessage, lastMessage, readyState } = useWebSocket('ws://localhost:3000', {onOpen: () => console.log('WebSocket connected!'),onClose: () => console.log('WebSocket disconnected!'),shouldReconnect: () => true, // 自动重连});const connectionStatus = {[ReadyState.CONNECTING]: '连接中',[ReadyState.OPEN]: '已连接',[ReadyState.CLOSING]: '正在关闭',[ReadyState.CLOSED]: '已关闭',[ReadyState.UNINSTANTIATED]: '未初始化',}[readyState];return (<div><p>连接状态:{connectionStatus}</p><button onClick={() => sendMessage('你好 WebSocket!')}>发送消息</button><p>收到消息:{lastMessage?.data}</p></div>);
};

如果你想自定义 useWebSocket Hook

你也可以手动封装一个简化版的:

import { useEffect, useRef, useState } from 'react';export function useWebSocket(url: string) {const ws = useRef<WebSocket | null>(null);const [messages, setMessages] = useState<string[]>([]);useEffect(() => {ws.current = new WebSocket(url);ws.current.onmessage = (e) => {setMessages((prev) => [...prev, e.data]);};return () => {ws.current?.close();};}, [url]);const sendMessage = (msg: string) => {ws.current?.send(msg);};return { messages, sendMessage };
}

适合的使用场景

  • 聊天室
  • 实时通知(如订单、评论等)
  • 实时数据流(如行情、图表、监控)
  • 游戏状态同步
http://www.xdnf.cn/news/693865.html

相关文章:

  • 深入理解设计模式之职责链模式
  • Python包管理器 uv替代conda?
  • 基于bp神经网络的adp算法
  • Django 中的路由系统
  • Elasticsearch父子关系解析
  • SpringBoot3.4.5 开启虚拟线程(JDK21)
  • WPF的基础设施:XAML基础语法
  • ISOLAR软件生成报错处理(三)
  • PR2020+MS1824+MS7210+MS2130 1080P@60Hz USB3.0采集
  • 用户关注表的设计
  • 【深度学习-pytorch篇】5. 卷积神经网络与LLaMA分类模型
  • 钩子函数的作用(register_hook)
  • 基于c++11重构的muduo核心库项目梳理
  • 动态规划-LCR 091.粉刷房子-力扣(LeetCode)
  • xcode 编译运行错误 Sandbox: rsync(29343) deny(1) file-write-create
  • pycharm生成图片
  • 【设计模式】简单工厂模式,工厂模式,抽象工厂模式,单例,代理,go案例区分总结
  • 自动化测试基础知识详解(全)
  • 如何通过知识共享构建企业创新文化
  • 利用计算属性 结合 new date()写一个当前时间的计时器时间格式为年月日 时分秒
  • 通过API接口获取1688店铺所有商品的技术实现与实战指南
  • AI 产品的 MVP 构建逻辑:Prompt 工程 ≠ 产品工程?(实战增补篇)
  • CANdela/Diva系列9--CDD文件在CANoe工程的应用1
  • Centos7升级openssl
  • 互联网大厂Java求职面试:AI与云原生架构实战解析
  • day39 pythonCNN网络
  • CSS Animation 详解
  • python第35天打卡
  • RISC-V 开发板 MUSE Pi Pro 搭建 Spacengine AI模型部署环境
  • 联软SDP+安渡:收敛暴露面 从生产网自动取数 安全高效