【问题标题】:Apollo client useQuery is skipping but not re-running the query when the skip flag becomes false?当跳过标志变为假时,Apollo 客户端 useQuery 正在跳过但不重新运行查询?
【发布时间】:2021-08-24 15:48:09
【问题描述】:

因此,我们运行了 2 个不同的查询来获取用户权限以及其他查询。有大量数据,它极大地改变了我们设置权限的方式。所以,最初的GET_STUFF 抓取了一堆初步数据,而GET_STUFF_ASYNC 需要等到第一个查询完成(因此skip: loading)。

  const { loading, data } = useQuery(GET_STUFF);
  const {
    loading: permissionsLoading,
    data: permissionsData
  } = useQuery(GET_STUFF_ASYNC, { skip: loading });

再往下,我们有这个:

  useEffect(() => {
    if (permissionsLoading || !permissionsData) {
      return;
    }
    doStuff() // set the user's permissions data that come in.
    });
  }, [permissionsData]);

问题是,在某些情况下,我控制并单击以打开多个选项卡,如果在它们获取数据时我没有查看这些选项卡,则 useEffect 通常会提前返回,并且权限数据永远不会更新,因此我们会更新用户的权限。
所以,A:GET_STUFF_ASYNC 是否应该在加载变为错误时重新运行,即使它最初是跳过的? B:还有其他方法可以解决这个问题吗?
我们希望 GET_STUFF 在运行 GET_STUFF_ASYNC 之前完成。但是无论出于什么奇怪的原因,当我打开一个标签并且有一段时间没有真正查看新打开的页面时,某些内容不会得到更新。

【问题讨论】:

    标签: reactjs apollo apollo-client react-apollo


    【解决方案1】:

    您可以使用 useLazyQuery 代替 useQuery 。 useLazyQuery API 类似于 useMutation,它为您提供了一个可以通过编程方式触发的函数。

    const { loading, data } = useQuery(GET_STUFF);
    
    const [ getAsyncStuff , {
        loading: permissionsLoading,
        data: permissionsData
      }] = useLazyQuery(GET_STUFF_ASYNC);
    
    useEffect(() => { 
       // when the first query is loaded, then fire this lazy query function
      if(!loading){
         getAsyncStuff()
      }
     }, [loading])
    

    参考

    useLazyQuery

    【讨论】:

    • 太好了,我会调查一下。只是好奇,在你的代码中,你的意思是写 = useLazyQuery(GET_STUFF_ASYNC) 吗?
    • 啊,是的。感谢您指出。已更新我的答案。
    • 看来我仍然遇到权限数据未更新的问题。它所使用的 useEffect() 并没有通过初始检查——也许它根本就没有进来。
    • 它大约有 50% 的时间。它真的只有在我打开一堆标签并稍后访问这些标签时才能重现。有些正确地从查询中加载数据,有些则没有。但我会仔细检查以确保查询在其他实例中正确触发。
    猜你喜欢
    • 2020-11-07
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 2020-06-04
    • 2021-01-30
    • 2023-03-29
    • 2018-05-12
    • 2021-06-10
    相关资源
    最近更新 更多