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

如何在React JS类组件中使用useQuery?Query标签已废弃

类组件中替代废弃Query组件/useQuery的数据获取方案

1. 直接调用Apollo Client实例的query方法

如果项目基于Apollo Client,可在类组件的生命周期方法(如componentDidMount)里直接调用客户端的query方法发起请求,手动管理数据、加载状态与错误。

示例代码:

import React from 'react';
import { ApolloClient } from '@apollo/client';

class YourClassComponent extends React.Component {
  state = {
    data: null,
    loading: true,
    error: null
  };

  async componentDidMount() {
    // 若已通过ApolloProvider注入客户端,可通过Context获取,无需重复实例化
    const client = new ApolloClient({ /* 你的客户端配置 */ });
    try {
      const { data } = await client.query({
        query: YOUR_GRAPHQL_QUERY, // 替换为你的查询语句
        variables: { /* 查询变量(可选) */ }
      });
      this.setState({ data, loading: false });
    } catch (error) {
      this.setState({ error, loading: false });
    }
  }

  render() {
    const { loading, error, data } = this.state;
    if (loading) return <div>加载中...</div>;
    if (error) return <div>请求出错:{error.message}</div>;
    
    return (
      <div>
        {/* 根据data渲染UI */}
      </div>
    );
  }
}

2. 封装高阶组件(HOC)复用查询逻辑

自己实现一个高阶组件,将查询逻辑封装其中,把数据、加载状态等作为props传递给类组件,方便多组件复用。

示例代码:

import React from 'react';
import { ApolloClient } from '@apollo/client';

const withQuery = (targetQuery, queryVariables) => (WrappedComponent) => {
  return class extends React.Component {
    state = {
      data: null,
      loading: true,
      error: null
    };

    async componentDidMount() {
      const client = new ApolloClient({ /* 客户端配置 */ });
      try {
        const { data } = await client.query({
          query: targetQuery,
          variables: queryVariables
        });
        this.setState({ data, loading: false });
      } catch (error) {
        this.setState({ error, loading: false });
      }
    }

    render() {
      return <WrappedComponent {...this.props} {...this.state} />;
    }
  };
};

// 使用方式
class YourComponent extends React.Component {
  render() {
    const { loading, error, data } = this.props;
    // 渲染逻辑
  }
}

export default withQuery(YOUR_GRAPHQL_QUERY, { /* 变量 */ })(YourComponent);

3. 自定义Render Props组件

模拟官方废弃的Query组件逻辑,实现一个自定义的Render Props组件,类组件可通过该组件的子函数获取查询状态与数据。

示例代码:

import React from 'react';
import { ApolloClient } from '@apollo/client';

class CustomQuery extends React.Component {
  state = {
    data: null,
    loading: true,
    error: null
  };

  async componentDidMount() {
    const client = new ApolloClient({ /* 客户端配置 */ });
    try {
      const { data } = await client.query({
        query: this.props.query,
        variables: this.props.variables
      });
      this.setState({ data, loading: false });
    } catch (error) {
      this.setState({ error, loading: false });
    }
  }

  render() {
    return this.props.children(this.state);
  }
}

// 在类组件中使用
class YourClassComponent extends React.Component {
  render() {
    return (
      <CustomQuery query={YOUR_GRAPHQL_QUERY} variables={{ /* 变量 */ }}>
        {({ loading, error, data }) => {
          if (loading) return <div>加载中...</div>;
          if (error) return <div>请求失败</div>;
          return <div>渲染数据内容</div>;
        }}
      </CustomQuery>
    );
  }
}

优化提示

若项目已通过ApolloProvider全局注入客户端,可通过React Context直接获取实例,无需重复创建:

import { ApolloContext } from '@apollo/client';

class YourComponent extends React.Component {
  static contextType = ApolloContext;
  
  async componentDidMount() {
    const client = this.context;
    // 后续查询逻辑
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:55:17