等到第一个钩子完成后再获取数据

Posted

技术标签:

【中文标题】等到第一个钩子完成后再获取数据【英文标题】:wait until first hook is complete before fetching data 【发布时间】:2021-11-01 10:07:17 【问题描述】:

我有这个自定义钩子,它从 graphql 获取 query.me 数据。 console.log 语句显示此挂钩在页面加载时运行了多次,但其中只有 1 个 console.logs() 包含实际数据。

import  useCustomQuery  from '../api-client';

export const useMe = () => 
  const  data, isLoading, error  = useCustomQuery(
  query: async (query) => 
      return getFields(query.me, 'account_id', 'role', 'profile_id');
    ,
  );
  console.log(data ? data.account_id : 'empty');

  return  isLoading, error, me: data ;
;

然后我有另一个钩子,它应该使用上面钩子中的 id 从服务器获取更多数据。

export const useActivityList = () => 
  const  me, error  = useMe();

  const criteria =  assignment:  uuid:  _eq: me.profile_id    as appointment_bool_exp;

  const query = useQuery(
    prepare( prepass, query ) 
      prepass(
        query.appointment( where: criteria ),
        'scheduled_at',
        'first_name',
        'last_name',
      );
    ,
    suspense: true,
  );

  const activityList = query.appointment( where: criteria );

  return 
    activityList,
    isLoading: query.$state.isLoading,
  ;
;

我面临的问题是,当me 仍未定义时,第二个钩子似乎调用了第一个钩子,因此出错了。如何配置它,以便仅在填充值时访问 me

我不擅长异步的东西......

【问题讨论】:

视情况而定。您用来获取数据的库可能有一个禁用标志,因此如果在条件合适之前运行,请使用它来禁用。或者,您可以根据您的条件在 useEffect 中调用异步函数。 【参考方案1】:

如果所需数据不可用,则在第二个挂钩中提前返回。

export const useActivityList = () => 
  const  me, error  = useMe();

  if (!me) 
    return null;
    // or another pattern that you may find useful is to set a flag to indicate that this query is idle e.g.
    // idle = true;
  

  const criteria =  assignment:  uuid:  _eq: me.profile_id    as appointment_bool_exp;

  ...

【讨论】:

谢谢!这导致React Hook "useQuery" is called conditionally. React Hooks must be called in the exact same order in every component render. Did you accidentally call a React Hook after an early return? 哦,对不起,我回答得太快了,哈哈。您使用什么库进行 useQuery?它可能有一个启用/禁用查询的选项。在这种情况下,您可以通过 !!me 它基于阿波罗 看来您需要使用useTransactionQuery 并将skip 选项设置为!!me gqless.com/react/fetching-data#usetransactionquery

以上是关于等到第一个钩子完成后再获取数据的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 等到 Firestore getDocuments() 完成后再继续

十Vue Router 进阶-获取数据

怎样保证js在页面元素渲染完后再执行

useEffect 钩子完成后如何渲染组件?

如何等到文件完成写入后再使用它?

如何等到承诺完成后再继续循环