Urql中useQuery返回的第二个元素func是什么及作用?
Urql中useQuery返回的第二个函数说明
这个func是什么?
你拿到的func是Urql的useQuery Hook返回的executeQuery函数,是Urql提供的手动触发查询重新执行的工具函数。
它的具体作用
- 主动刷新数据:默认情况下,
useQuery会根据配置的缓存策略自动执行查询、更新缓存,但当你需要在用户操作(比如点击关注/取消关注按钮)后获取最新状态时,调用这个函数就能手动触发一次查询。 - 定制查询行为:调用时可以传入可选参数,比如覆盖原有的查询变量、修改请求策略(如强制走网络而非读取缓存),灵活控制这次重新查询的逻辑。
为什么调用func()没反应?
结合你的代码来看,主要有两个可能原因:
- 未绑定触发时机:你的按钮没有绑定点击事件来调用
func,所以根本没触发执行。 - 缺少必要参数或缓存策略限制:
- 如果你的
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.
相关产品推荐
相关产品推荐

