用反应钩子重试失败的graphql查询?

Posted

技术标签:

【中文标题】用反应钩子重试失败的graphql查询?【英文标题】:Retrying failed graphql query with react hooks? 【发布时间】:2020-04-27 13:27:31 【问题描述】:

我有以下示例组件,我希望当出现随机故障时,我可以单击按钮手动重试查询(通过一些用户交互)。这可能是偶然的吗?我还想如果结果查询成功,那么页面会填充数据(即重新呈现排序)。

export default () => 
  let  loading, error, data  = useQuery(myGqlQuery)

  if (loading) 
    return <LoadingComponent />
  

  const reassign = () => 
    // I want this function to somehow retry the query to see if error has subsided
  

  if (error) 
    return <button onClick=reassign>Retry Query</button>
  

...

【问题讨论】:

【参考方案1】:

refetch() 用作const ..., refetch = useQuery(QUERY)

参见文档:https://www.apollographql.com/docs/react/data/queries/

【讨论】:

【参考方案2】:

你可以使用refetch:

export default () => 
  const  loading, error, data, refetch  = useQuery(myGqlQuery)

  if (loading) 
    return <LoadingComponent />
  

  const reassign = () => 
    refetch()
  

  if (error) 
    return <button onClick=reassign>Retry Query</button>
  
  
  return (
    <div>
      // render your data here
    </div>
  )

【讨论】:

【参考方案3】:

您可以使用useLazyQuery 代替useQuery

https://www.apollographql.com/docs/react/data/queries/#executing-queries-manually

通过这种方式,您还必须在 useEffect 挂钩内的第一次渲染时手动调用,但这很容易。

export default () => 
  let [fnToCallQuery,  loading, error, data ] = useLazyQuery(myGqlQuery)

  React.useEffect(() => fnToCallQuery(), []);

  if (loading) 
    return <LoadingComponent />
  

  if (error) 
    return <button onClick=_ => fnToCallQuery()>Retry Query</button>
  

  // return your jsx with fetched data

编码愉快:)

【讨论】:

这将抛出错误消息React Hook "React.useEffect" is called conditionally,因为您正在 React.useEffect() 块中运行 fnToCallQuery() 函数 @lomse 确定吗?从 useEffect() 启动查询和突变是很常见的。也许你把它与在 useEffect() 中调用另一个 hook 混淆了? fnToCallQuery 只是一个普通函数。 是的,你是对的。不知道在发表评论之前那天我喝了什么。

以上是关于用反应钩子重试失败的graphql查询?的主要内容,如果未能解决你的问题,请参考以下文章

用于进行休息 api 查询的 Apollo 'Like' 钩子

用于反应钩子的 useEffect 的替代品

使用 TypeScript 反应 Apollo useQuery 钩子

如何在反应钩子中使用graphql钩子集成多个客户端

使用 GraphQL 查询更新反应状态 [重复]

使用钩子从反应中调用 GraphQL 突变的正确方法