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

如何在类组件中使用useQuery hook?HOC传递返回data为undefined如何解决

问题根因

useQuery 是异步执行的网络请求,HOC 首次渲染类组件时,请求还未返回,因此 data 为 undefined。而类组件的 componentDidMount 生命周期仅在组件首次挂载完成后执行1次,此时请求还没有完成,自然拿不到返回的 data。另外注意你代码中传递props时存在拼写错误:loaging={loading} 应为 loading={loading},该错误也会导致类组件无法正确拿到加载状态。

解决方案

方案1:配合 componentDidUpdate 生命周期监听数据变更

请求完成后 data 更新会触发组件重渲染,componentDidUpdate 会在每次props/state变更后执行,你可以在这里判断数据加载完成后执行对应逻辑:

class YourClassComponent extends React.Component {
  componentDidMount() {
    // 这里可以执行不需要依赖query data的逻辑,比如调用mutation
    // this.props.createUser(...)
  }

  componentDidUpdate(prevProps) {
    // 仅在加载完成、数据从无到有时执行逻辑,避免重复触发
    const { loading, data, error } = this.props;
    if (!prevProps.data && !loading && !error && data) {
      // 这里可以拿到完整的data执行对应逻辑
      console.log('拿到query数据:', data);
      // 如果你需要只执行一次,可以加个实例变量标记
      if (!this.hasDataFetched) {
        this.hasDataFetched = true;
        // 执行只需要跑一次的逻辑
      }
    }
  }

  render() {
    // 你的渲染逻辑
  }
}

该方案适合需要给用户展示加载态、需要兼容加载中交互的场景。


方案2:HOC 增加条件渲染,等数据加载完成后再渲染类组件

如果你需要保证 componentDidMount 执行时就已经拿到 data,可以在HOC中等待请求完成再渲染组件:

export function withMyHook(Component) {
  return function WrappedComponent(props) {
    const {loading, error, data} = useQuery(Queries.GET_All1);
    const [createUser, {err}] = useMutation(Mutations.CREATE_USER);

    const addUser = (user, queryFunc) => {
      queryFunc({
        variables:{
          country:user.country,
          city:user.city,
          message:user.message,
          isFriend:user.isFriend,
          url:user.url,
          name:user.name,
        }
      });
    }

    // 加载中可以渲染自定义加载态,有错误也可以优先渲染错误提示
    if (loading) return <div>加载中...</div>;
    if (error) return <div>请求错误:{error.message}</div>;
    if (!data) return null;

    return <Component 
      {...props} 
      addUser={addUser} 
      loading={loading} 
      error={error} 
      data={data} 
      createUser={createUser} 
      err={err}
    />;
  }
}

这种方式下类组件挂载时请求已经完成,componentDidMount 中可以直接拿到 this.props.data。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 04:48:02