You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何等待useMe自定义hook加载完成后再执行后续数据获取操作

问题核心原因

这是典型的异步查询依赖时序问题:useMe拉取用户数据是异步操作,首次渲染时me必然是undefined,此时直接访问me.profile_id会直接抛出空值错误,同时第二个查询也会在前置依赖未就绪的情况下提前执行。

具体修复方案

方案1:调整useActivityList逻辑(优先推荐)

利用useMe返回的加载状态做前置判断,同时给查询hook增加执行条件,确保仅当me就绪后才发起后续查询:

export const useActivityList = () => {
  // 取出useMe返回的加载、错误状态
  const { me, isLoading: meLoading, error: meError } = useMe();

  // 前置拦截:用户信息加载中/加载失败时直接返回对应状态,不执行后续查询
  if (meLoading) return { activityList: [], isLoading: true };
  if (meError) return { activityList: [], isLoading: false, error: meError };

  // 走到此处me必然已存在,不会出现空值问题
  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,
    // 新增查询启用条件:仅当profile_id存在时才执行查询(不同库参数名可能不同,Apollo对应skip参数)
    enabled: !!me?.profile_id
  });

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

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

方案2:父组件前置加载(适配不支持启用条件的查询库)

在父组件优先加载用户信息,等me就绪后再渲染调用useActivityList的子组件,从根源避免空值问题:

// 父组件代码
const ActivityPage = () => {
  const { isLoading, error } = useMe();
  if (isLoading) return <div>加载用户信息中...</div>
  if (error) return <div>用户信息加载失败,请刷新重试</div>
  // 此时me已加载完成,子组件内调用useActivityList不会出现空值
  return <ActivityList />
}

额外优化建议

访问me的属性时统一加可选链?.兜底,比如me?.profile_id,可以避免意外的空值报错。

内容的提问来源于stack exchange,提问作者ambe5960

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 07:12:02