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

Urql中useQuery返回的第二个元素func是什么及作用?

Urql中useQuery返回的第二个函数说明

这个func是什么?

你拿到的func是Urql的useQuery Hook返回的executeQuery函数,是Urql提供的手动触发查询重新执行的工具函数。

它的具体作用

  • 主动刷新数据:默认情况下,useQuery会根据配置的缓存策略自动执行查询、更新缓存,但当你需要在用户操作(比如点击关注/取消关注按钮)后获取最新状态时,调用这个函数就能手动触发一次查询。
  • 定制查询行为:调用时可以传入可选参数,比如覆盖原有的查询变量、修改请求策略(如强制走网络而非读取缓存),灵活控制这次重新查询的逻辑。

为什么调用func()没反应?

结合你的代码来看,主要有两个可能原因:

  1. 未绑定触发时机:你的按钮没有绑定点击事件来调用func,所以根本没触发执行。
  2. 缺少必要参数或缓存策略限制:
    • 如果你的IsFollowingQuery需要变量(比如目标用户ID),但调用useIsFollowingQuery时没传入,会导致查询无法正常执行。
    • 若使用默认的cache-first策略,缓存中的数据未过期时,调用func会直接返回缓存数据,不会发起新的网络请求,看起来像“没反应”。

修复示例

给按钮绑定点击事件,并按需配置查询参数和请求策略:

const TestComponent = () => {
  // 假设查询需要传入userId变量,按需替换为实际值
  const [
          { fetching: IsFollowingFetching, data: IsFollowingData },
          refetchIsFollowing,
  ] = useIsFollowingQuery({ variables: { userId: "target-user-id" } })

  const handleToggleFollow = () => {
    // 先执行关注/取消关注的mutation操作(如果已有实现)
    // ...
    // 手动刷新查询,强制走网络获取最新状态
    refetchIsFollowing({ requestPolicy: "network-only" });
  };

  return (
    <>
      {!IsFollowingFetching ? (
        <div className="btn-container">
          {IsFollowingData?.isFollowing === 0 ? (
            <button onClick={handleToggleFollow}> Follow </button>
          ) : (
            <button onClick={handleToggleFollow}> Unfollow </button>
          )}
        </div>
      ) : null}
    </>
  );
};

内容的提问来源于stack exchange,提问作者Penny M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:05:21