在 React 中使用 GraphQL (新手指南)
在 React 中使用 GraphQL (新手指南)
What & Why(GraphQL 是什么 & 为什么要使用 GraphQL)
比这之前的开发中,在数据交互中使用的主要是 Restful API 和 RPC API,但是现在的项目中使用的是 GraphQL API ,因此展开了对于 GraphQL 的了解和学习。首先,可以通过这篇文章【REST API 已死,GraphQL 长存】了解一下 GraphQL 的出现解决了什么问题,也就是 what & why — 「一次请求,集齐多种所需数据」。
How(如何在 React 中使用 GraphQL)
Apollo 是一套用于创建 GraphQL服务器和使用 GraphQL API 的工具。在前端对GraphQL的使用中也是基于 Apollo 实现的。针对 React 应用,有支持 react 的 react-apollo 、 apollo-client 和 apollo/react-hooks 等包。目前我们团队主要使用的是 react-apollo 和 apollo-client 。下面就从 react-apollo 和 apollo-client 的使用来开始学习。
apollo-client 的使用
初始化 apollo 客户端
创建客户端 & 下发客户端
index.ts
// import { ApolloClient, ApolloProvider } from 'react-apollo';
// import { InMemoryCache } from 'apollo-cache-inmemory'
import {
ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client';
// 实例化 ApolloClient
// 默认情况客户端会发送到相同主机名(域名)下的/graphql端点 new ApolloClient()
const client = new ApolloClient({
cache: new InMemoryCache(), // 开启缓存,Apollo 客户端在获取查询结果后使用它来缓存查询结果。
uri: 'http://my-api.graphql.com', // uri指定我们的 GraphQL 服务器的 URL。
});
// 挂载组件
ReactDOM.render(
<ApolloProvider client={
client}>
<MyRootComponent />
</ApolloProvider>,
document.getElementById('App')
)
尝试使用 client.query() 发送查询
gql 是一个模板字符串,能够将字符串解析为 GraphQL 语句
index.ts
import {
gql } from '@apollo/client';
client
.query({
query: gql`
query GetLocations {
locations {
id
name
description
photo
}
}
`,
})
.then((result) => console.log(result));
查询(query)
当我们需要对数据进行查询时,就使用 query 操作,对应 http 请求的 get 操作;当需要对数据进行 删除、修改、新增 时,就是用 mutation 操作,对应 http 请求的 post 操作。
useQuery(自动查询)
useQuery 会在组件渲染时执行一次查询。
import {
gql, useQuery } from '@apollo/client';
const GET_DOGS = gql`
query GetDogs {
dogs {
id
breed
}
}
`;
function Dogs({
onDogSelected }) {
const {
loading, error, data } = useQuery(GET_DOGS);
if (loading) return 'Loading...';
if (error) return `Error! ${
error.message}`;
return (
<select name='dog' onChange={
onDogSelected}>
{
data.dogs.map((dog) => (
<option key={
dog.id} value={
dog.breed}>
{
dog.breed