You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React+TypeScript中使用urql实现GraphQL定时自动重查

使用urql实现定时自动重查询的方案

方法一:结合React useEffect手动触发refetch

urql的useQuery钩子会返回refetch函数,我们可以通过React的useEffect创建定时器,每隔指定时间调用一次refetch来实现自动重查,同时注意清理定时器避免内存泄漏。

示例代码:

import { useEffect } from 'react';
import { useObjectIdQuery } from './generated/graphql'; // 替换为你的查询生成文件路径

type ObjectComponentProps = {
  id: number;
};

export default function ObjectComponent({ id }: ObjectComponentProps) {
  const [{ data }, refetch] = useObjectIdQuery({ 
    variables: { id }, 
    pause: !id 
  });

  useEffect(() => {
    // 当id不存在时,不启动定时器
    if (!id) return;

    // 每5秒执行一次重查,可修改为你需要的毫秒数(n秒 = n*1000)
    const intervalId = setInterval(() => {
      refetch();
    }, 5000);

    // 组件卸载或id变更时清理定时器
    return () => clearInterval(intervalId);
  }, [id, refetch]);

  return (
    <div>
      {data?.object ? (
        <>
          <p>ID: {data.object.id}</p>
          <p>名称: {data.object.name}</p>
        </>
      ) : (
        <p>加载中...</p>
      )}
    </div>
  );
}

方法二:强制从服务器获取最新数据

如果需要跳过缓存,确保每次重查都拉取服务器最新数据,可以在调用refetch时指定requestPolicy为network-only:

// 修改定时器内的refetch调用
refetch({ requestPolicy: 'network-only' });

额外说明

  • 当pause为true(即!id)时,定时器不会启动,避免无效请求
  • 务必在组件卸载或依赖项变更时清理定时器,防止内存泄漏
  • 如果你的后端支持GraphQL订阅,使用订阅替代轮询会更高效,但需要后端配合实现对应的订阅机制

内容的提问来源于stack exchange,提问作者SLNM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 15:50:37