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

如何在React类组件中使用Apollo Client查询数据并渲染Header导航分类?

类组件实现Apollo GraphQL查询渲染导航分类的方案

Apollo 为类组件提供了原生适配方案,无需使用 Hook 即可完成 GraphQL 查询调用,你现有的index.js、App.js已经正确配置了ApolloProvider无需修改,直接调整Header.js即可,以下是两种可选实现方式:


方案1:使用内置<Query>组件(推荐新手使用)

无需手动管理查询生命周期,代码更简洁:

import { Component } from 'react';
import { Query, gql } from '@apollo/client';

// 导航分类查询语句
const QUERY = gql`
  query getCategories {
    categories {
      name
    }
  }
`;

class Header extends Component {
  render() {
    return (
      <header>
        <Query query={QUERY}>
          {/* 回调接收查询状态与结果 */}
          {({ loading, error, data }) => {
            // 加载中状态处理
            if (loading) return <div>导航加载中...</div>;
            // 错误状态处理
            if (error) return <div>导航加载失败:{error.message}</div>;
            // 拿到数据后遍历渲染分类项
            return (
              <ul className="nav-list">
                {data.categories.map((category, index) => (
                  <li key={index} className="nav-item">
                    {category.name}
                  </li>
                ))}
              </ul>
            );
          }}
        </Query>
      </header>
    )
  }
}

export default Header;

方案2:使用withApollo高阶组件手动控制查询

适合需要自定义查询触发时机的场景,比如组件挂载、用户交互后才发起请求:

import { Component } from 'react';
import { withApollo, gql } from '@apollo/client';

const QUERY = gql`
  query getCategories {
    categories {
      name
    }
  }
`;

class Header extends Component {
  state = {
    categories: [],
    loading: true,
    error: null
  }

  componentDidMount() {
    // 组件挂载后手动发起查询
    this.props.client.query({
      query: QUERY
    }).then(res => {
      this.setState({
        categories: res.data.categories,
        loading: false
      })
    }).catch(err => {
      this.setState({
        error: err,
        loading: false
      })
    })
  }

  render() {
    const { loading, error, categories } = this.state;
    if (loading) return <div>导航加载中...</div>;
    if (error) return <div>导航加载失败:{error.message}</div>;
    return (
      <header>
        <ul className="nav-list">
          {categories.map((category, index) => (
            <li key={index} className="nav-item">
              {category.name}
            </li>
          ))}
        </ul>
      </header>
    )
  }
}

// 用withApollo包裹组件注入client实例
export default withApollo(Header);

  • 上述代码中遍历分类时用index作为key仅为示例,若categories返回数据包含唯一id字段,建议替换为key={category.id}获得更好的渲染性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:54:03