首次使用Rails的GraphQL(Apollo Client篇)

这篇文章的内容 (Zhè de

我之前整理了一个初学者在Rails中学习并使用GraphQL的过程中所进行的调研。

只需要一种选项,以下是对于使用GraphQL获取数据的工作的翻译:

在使用GraphQL获取数据的工作中,

    • 型の定義

 

    スキーマの書き方

尽管到这部分我已经写下了,关于“如何获取数据”的关键部分太长无法写下,因此在此处记录。

我参考的文章是这篇。

这些教程等等

由于上述文章详细介绍了实际的实施方法,所以这里主要会记录我在负责的实施中做出的创新点。

使用Apollo Client

GraphQL的准备

由于现有的文章和官方教程的内容非常优秀,所以详细内容将在那里介绍。在这里只简单介绍步骤。

gem 'graphiql-rails'

请安装这个 gem。

$ bundle install
$ rails g graphql:install

当执行该命令时,我认为routes.rb中会包含以下内容。

Rails.application.routes.draw do
  post "/graphql", to: "graphql#execute"
  # 後略
end

当使用POST方法访问/graphql的URL时,将执行GraphQL的方法。

请参阅上一篇文章来了解更详细的后续定义等内容。

阿波罗客户端的准备工作

安装apollo-client

yarn add @apollo/client

初始化appolo-client。

import {
  ApolloClient,
  InMemoryCache,
  ApolloProvider
} from "@apollo/client";

// 解説します(★1)
const client = new ApolloClient({
  uri: 'http://localhost:3000/graphql',
  cache: new InMemoryCache()
});

// 解説します(★2)
export const App = () => {
    return (
        <ApolloProvider client={client} >
            <Sample />
        </ApolloProvider>
    );
}

初始化apollo-client

首先,使用ApolloClient()方法来初始化apollo-client。
以下是两个必需选项。

const client = new ApolloClient({
  uri: 'http://localhost:3000/graphql',
  cache: new InMemoryCache()
});

uri…apollo-clientがGraphQLの情報を受け取るところ。uriかlinkのどちらかが必須で、両方あった場合はlinkが優先される。

cache…apollo-clientがクエリの実行結果をローカルに保存するために使用するもの。@apollo/clientに同梱されているInMemoryCacheがおすすめ。

这里有详细的选项。

在这个示例中,我们在App.jsx中进行了初始化,但也可以将初始化的内容写在其他文件中,并将其加载到App.jsx中。

将ApolloProvider放置在应用程序的顶部位置。

然后,将ApolloProvider组件放置在应用程序的尽可能上方。通过将之前初始化的ApolloClient实例传递给它,以便在较低层的组件中可以使用apollo-client。

export const App = () => {
    return (
        <ApolloProvider client={client} >
            <Sample />
        </ ApolloProvider>
    );
}

执行查询

在中国,你可以使用useQuery()方法来执行查询。在之前的App.jsx中调用,在Sample.jsx中像这样写。

import React from 'react';
import { useQuery, gql } from "@apollo/client";

const GET_USERS = gql`
  query GetUsers {
    users {
      id
      name
      email
    }
  }
`;

export const Sample = () => {
    const {loading, error, data} = useQuery(GET_USERS); // 解説します

    if (loading) return 'ロード中....';
    if (error) return `Error ${error.message}`;

    return (
        <>
            {data.users.map(user => (
                <div key={user.id}>
                    <h1>{user.name}</h1>
                    <h2>{user.email}</h2>
                </div>
            )}
        </>
    )
};

useQuery方法默认返回一个具有loading、error和data三个属性的result对象。我们通过解构赋值将其分别赋值给{loading, error, data}。

loading…これがtrueである間、クエリはまだ実行中であり、結果はまだ返されていません。

error…クエリで1つ以上のエラーが発生した場合、このオブジェクトには、graphQLErrorsの配列または単一のnetworkErrorが含まれます。

result…GraphQLクエリの実行結果を含むオブジェクトです。

请查看useQuery的详细规格,请点击这里。

已经做完!

应该能够将用户信息绘制在屏幕上了。(由于现有应用与实际情况差异较大,可能会有遗漏,发现后将进行修正)

此外,

    • nestしたオブジェクトのGET

ID等を利用した単一オブジェクトのGET

mutationを利用したPOSTやUPDATEメソッドの実行

虽然还没能做到,但我打算逐渐尝试。(试验后会添加备注)

广告
将在 10 秒后关闭
bannerAds