WHAT - useWebSocket 推荐

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 };
}

适合的使用场景

  • 聊天室
  • 实时通知(如订单、评论等)
  • 实时数据流(如行情、图表、监控)
  • 游戏状态同步
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@PHARAOH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值