开始使用 Apollo 客户端
你好!本简短教程将帮助你开始使用 Apollo 客户端。
要了解整个 Apollo 平台,查看 Odyssey,Apollo 的交互式学习平台
步骤 1:设置
要开始此教程,请执行以下操作之一
- 在本地区域使用 Vite创建一个新的 React 项目,或者
- 在 CodeSandbox创建一个新的 React 沙盒。
步骤 2:安装依赖项
使用 Apollo 客户端的程序需要两个顶级依赖项:Apollo 客户端:此单一包包含设置 Apollo 客户端所需的所有内容。它包括内存缓存、本地状态管理、错误处理以及基于 React 的视图层。
@apollo/client
:此包提供了解析 GraphQL 查询的逻辑。graphql
运行以下命令以安装这两个包
npm install @apollo/client graphql
如果您在使用CodeSandbox的React沙盒时遇到TypeError
错误,请尝试在依赖项面板中将graphql
包的版本降级到15.8.0
。如果您降级后遇到不同的错误,请刷新页面。
我们的示例应用将使用来自Apollo Odyssey的FlyBy GraphQL API。此API提供了星际旅行地点列表及其详细信息 👽
步骤 3:初始化 ApolloClient
在配置好依赖项后,我们现在可以初始化一个ApolloClient
实例。
在main.jsx
中,让我们首先从@apollo/client
导入所需的符号:
import { ApolloClient, InMemoryCache, ApolloProvider, gql } from '@apollo/client';
接下来,我们将初始化 ApolloClient
,将一个包含 uri
和 cache
字段的配置对象传递给其构造函数:
const client = new ApolloClient({uri: 'https://flyby-router-demo.herokuapp.com/',cache: new InMemoryCache(),});
uri
指定了我们的 GraphQL 服务器的 URL。cache
是InMemoryCache
的实例,Apollo Client 使用它来缓存在获取查询结果后 查询结果。
就是这样!我们的 client
已经准备好开始获取数据了。现在在我们开始使用 Apollo Client 与 React 之前,让我们先尝试使用原生 JavaScript 发送一个 query。
在同一个 main.jsx
文件中,使用以下显示的 query 字符串(用 gql
模板文字括起来)调用 client.query
:
// const client = ...client.query({query: gql`query GetLocations {locations {idnamedescriptionphoto}}`,}).then((result) => console.log(result));
运行此代码,打开您的控制台,并检查结果对象。您应该看到一个带有 locations
及其他属性(如 loading
和 networkStatus
)的 data
属性。太棒了!
虽然像这样直接执行 GraphQL 操作可能很有用,但 Apollo Client 在与如 React 这样的视图层集成时才能发挥出其最佳作用。您可以将查询绑定到您的 UI,并在获取新数据时自动更新它。
我们来看看它是如何工作的!
第4步:将客户端连接到 React
您可以使用 Apollo Client 组件来将 Apollo Client 连接到 React,类似于 React 的 Context.Provider
,ApolloProvider
包装您的 React 应用程序,并在上下文中设置 Apollo Client,使您能够在组件树中的任何位置访问它。
在 main.jsx
文件中,让我们用 ApolloProvider
包装我们的 React 应用。我们建议将 ApolloProvider
放在您应用程序的高层位置,位于可能需要访问 GraphQL 数据的任何组件之上。
import React from 'react';import * as ReactDOM from 'react-dom/client';import { ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client';import App from './App';const client = new ApolloClient({uri: 'https://flyby-router-demo.herokuapp.com/',cache: new InMemoryCache(),});// Supported in React 18+const root = ReactDOM.createRoot(document.getElementById('root'));root.render(<ApolloProvider client={client}><App /></ApolloProvider>,);
第5步:使用 useQuery
获取数据
连接 ApolloProvider
后,您可以使用 useQuery
开始请求数据。 useQuery
钩子是一个 React 钩子,它在您的 UI 中共享 GraphQL 数据。
现在切换到我们的 App.jsx
文件,我们首先会将现有文件内容替换为以下代码片段:
// Import everything needed to use the `useQuery` hookimport { useQuery, gql } from '@apollo/client';export default function App() {return (<div><h2>My first Apollo app 🚀</h2></div>);}
我们可以通过在 gql 模板字面量中包装来定义我们想要执行的查询。
const GET_LOCATIONS = gql`query GetLocations {locations {idnamedescriptionphoto}}`;
接下来,让我们定义一个名为 DisplayLocations
的组件,该组件将在 useQuery
钩子中使用我们的 GET_LOCATIONS 查询:
function DisplayLocations() {const { loading, error, data } = useQuery(GET_LOCATIONS);if (loading) return <p>Loading...</p>;if (error) return <p>Error : {error.message}</p>;return data.locations.map(({ id, name, description, photo }) => (<div key={id}><h3>{name}</h3><img width="400" height="250" alt="location-reference" src={`${photo}`} /><br /><b>About this location:</b><p>{description}</p><br /></div>));}
每次此组件渲染时, useQuery
钩子将自动执行我们的查询,并返回一个包含 loading、 error
和 data
属性的结果对象:
- Apollo Client 自动跟踪查询的加载和错误状态,这些状态反映了在
loading
和error
属性中。 - 当查询的结果返回时,它会被附加到
data
属性。
最后,我们将 DisplayLocations
添加到现有的组件树中:
export default function App() {return (<div><h2>My first Apollo app 🚀</h2><br/><DisplayLocations /></div>);}
当您的应用程序重新加载时,您应该会先看到一个加载指示器,然后是一个位置列表以及这些位置的相关详情!如果没有,您可以将您的代码与 CodeSandbox 上的 完整应用程序 进行比较。
恭喜您,您刚刚创建了第一个用于渲染来自 Apollo Client 的 GraphQL 数据的组件! 🎉 现在您可以尝试构建更多使用 useQuery
的组件,并实验您刚刚学到的概念。
下一步
现在您已经学会了如何使用 Apollo Client 获取数据,您可以深入了解创建更复杂的查询和 突变。本节之后,我们建议继续学习以下内容:
- 查询:了解如何使用 参数 获取查询,并深入了解配置选项。要查看完整的选项列表,请参阅
useQuery
的 API 参考。 - 突变:了解如何使用 mutations 更新数据以及何时需要更新 Apollo 缓存。要查看完整的选项列表,请参阅
useMutation
的 API 参考。 - Apollo 客户端 API:有时,您可能需要直接访问客户端,就像我们在上面的纯 JavaScript 示例中所做的那样。访问 API 参考,查看完整的选项列表。