heitu 更新通知(usePolling/useWebSocket)

178 阅读2分钟

网站地址 heitu.wang/hooks

usePolling

描述

一个用于处理轮询请求的 Hook,支持定时轮询、错误重试、手动控制等功能。

特性

  • 支持自动/手动控制轮询
  • 可配置轮询间隔时间
  • 内置错误重试机制
  • 提供完整的状态管理
  • 支持成功/失败回调
  • 自动清理资源

演示

基础用法

import React from 'react';
import { usePolling } from 'heitu';
import Mock from 'mockjs';

export default () => {
  const getUsername = () => {
    console.log('polling getUsername');
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve(Mock.mock('@name'));
      }, 1000);
    });
  };
  const { data, loading, error, start, stop, state } = usePolling(
    async () => {
      const res = await getUsername();
      return res;
    },
    {
      interval: 5000, // 每5秒轮询一次
      onSuccess: (data) => {
        console.log('轮询成功:', data);
      },
      onError: (error) => {
        console.log('轮询失败:', error);
      },
    },
  );
  console.log(state, 'state');
  return (
    <div>
      {state === 1 && <span>轮询中...</span>}
      {loading && <span>加载中...</span>}
      {error && <span>错误: {error.message}</span>}
      <div>数据: {JSON.stringify(data)}</div>
      <button onClick={start}>开始轮询</button>
      <button onClick={stop}>停止轮询</button>
    </div>
  );
};

API

Options

参数说明类型默认值
interval轮询间隔时间(ms)number3000
manual是否手动控制轮询booleanfalse
retryTimes失败重试次数number3
retryInterval重试间隔时间(ms)number1000
onSuccess成功回调(data: T) => void-
onError失败回调(error: Error) => void-

返回值

参数说明类型
data轮询返回的数据T | undefined
loading加载状态boolean
error错误信息Error | undefined
start开始轮询() => void
stop停止轮询() => void

useWebSocket

描述

useWebSocket

  • 用于某些项目前端多次请求相同浪费资源请求时间的问题

  • 使用要求:

    1. 请求参数相同
    2. 接口返回也相同

演示

import { useWebSocket } from 'heitu';
import { useState } from 'react';

const Index = () => {
  const [message, setMessage] = useState('');

  const { readyState, sendMessage, connect, disconnect, latestMessage } =
    useWebSocket('wss://ws.postman-echo.com/raw', {
      onOpen: (event) => {
        console.log('连接成功');
      },
      onMessage: (message) => {
        console.log('收到消息:', message);
      },
      onError: (event) => {
        console.log('连接错误');
      },
      onClose: (event) => {
        console.log('连接关闭');
      },
      json: true,
    });
  console.log(readyState, 'readyState');
  return (
    <div>
      <p>
        连接状态:
        {readyState === WebSocket.CONNECTING && '正在连接中'}
        {readyState === WebSocket.OPEN && '连接已建立'}
        {readyState === WebSocket.CLOSING && '连接正在关闭'}
        {readyState === WebSocket.CLOSED && '连接已关闭'}
      </p>
      <button
        onClick={() => sendMessage({ text: 'hello', date: `${Date.now()}` })}
        disabled={readyState !== WebSocket.OPEN}
      >
        发送消息
      </button>
      <p>
        最新消息: {latestMessage ? JSON.stringify(latestMessage) : '暂无消息'}
      </p>
      {readyState === WebSocket.OPEN && (
        <button onClick={disconnect}>断开连接</button>
      )}
      {(readyState === WebSocket.CONNECTING ||
        readyState === WebSocket.CLOSED) && (
        <button onClick={connect}>连接</button>
      )}
    </div>
  );
};
export default Index;

API

Options

参数说明类型默认值
onOpen连接建立时的回调(event: WebSocketEventMap['open']) => void-
onClose连接关闭时的回调(event: WebSocketEventMap['close']) => void-
onMessage收到消息时的回调(message: WebSocketEventMap['message']) => void-
onError连接错误时的回调(event: WebSocketEventMap['error']) => void-
protocolsWebSocket 子协议string | string[]-
reconnectLimit重连次数限制number3
reconnectInterval重连间隔时间(ms)number3000
manual是否手动控制连接booleanfalse
json是否自动序列化 JSONbooleanfalse

返回值

参数说明类型
readyStateWebSocket 连接状态number
sendMessage发送消息方法(message: string | ArrayBufferLike | Blob | ArrayBufferView) => void
connect手动连接方法() => void
disconnect断开连接方法() => void

readyState 状态说明

状态描述
0CONNECTING正在连接中
1OPEN连接已建立
2CLOSING连接正在关闭
3CLOSED连接已关闭