【问题标题】:Is there a way to prevent fetching when `refetch` method get called? react-query有没有办法在调用“refetch”方法时防止获取?反应查询
【发布时间】:2022-01-10 13:15:27
【问题描述】:

我有自定义提取钩子,它使用 useQuery - 来自 react-query。如何根据我提供的 boolean 属性防止获取/重新获取。 目前我正在使用{ enabled: allowedToFetch },但这并不能阻止当我使用来自 react-query 的refetch 方法时进行获取。

【问题讨论】:

    标签: reactjs api react-hooks fetch-api react-query


    【解决方案1】:

    根据设计,从useQuery 返回的refetch 执行无条件提取,甚至绕过enabled

    这里有很好的记录:https://react-query.tanstack.com/guides/disabling-queries

    这是必要的,这样您就可以通过设置enabled: false 和使用refetch() 来选择退出智能重新获取并进入“手动”模式。

    queryClient.refetchQueriesqueryClient.invalidateQueries 尊重 enabled,所有智能重新获取也是如此。

    问题是:为什么在调用refetch 时有一个禁用的查询,但 不希望它实际重新获取?有什么用例?

    如果条件是:enabled: allowedToFetch,我会:

    .) 在相同的条件下包装 refetch 调用:

    if (allowedToFetch) {
      refetch()
    }
    

    .) 或使用本地状态来驱动查询(首选解决方案):

    const [allowedToFetch, setAllowedToFetch] = useState(false)
    
    useQuery(key, fn, { enabled: allowedToFetch })
    

    现在您需要做的就是调用:

    setAllowedToFetch(true)
    

    这将启用查询,而 react-query 将完成其余的工作。

    【讨论】:

    • 感谢您的回答。在某些地方,当组件被渲染时,我每 10 秒调用一次 refetch,以在一些后台处理数据发生时保持页面更新。我的allowedToFetch 最初是假的,在某些时候它设置为真。所以虽然allowedToFetch 是假的并且我的组件渲染它不会获取,但是当它调用refetch 方法10 秒后,即使allowedToFetch 是假的,它也会重新获取 - 但我明白为什么,我只是想知道什么是最好的解决方案这个案例。
    • 当我将自定义钩子与useQuery 一起使用并且prop` allowedToFetch` 最初为false - 我将其用作enabled: allowedToFetch,但随后切换为true,它会自动开始获取吗?当我查看文档时,我看到查询键用作 dep 数组而不是选项...
    • 是的,它会的,因为启用查询会触发重新获取。对于每 10 秒重新获取:为什么不使用查询中的 refetchInterval 选项?
    • 因为在我切换到 react-query 之前逻辑已经到位,并不是我使用自定义钩子的每个组件都需要重新获取..所以据我所知,我有两个选择:检查 if (allowedToFetch) { refetch()}在我调用 refetch 方法的地方或向我的钩子添加额外的属性,它将接受 ms 或 false。
    猜你喜欢
    • 2013-11-16
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 2011-07-15
    • 2020-10-10
    相关资源
    最近更新 更多