Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GraphQL勉強会

 GraphQL勉強会

GraphQL + Go + React + Apolloでサンプルアプリ作ってみた

hideto_iwasawa

September 15, 2020
Tweet

Other Decks in Programming

Transcript

  1. 例えば query response { me { name } } {

    “me”: { “name”: “hideto” } }
  2. 対象の返り値が複数ある時 query response { user { name friends { name

    } } } { “data”: { “user”: { “name”: “hideto” “friends”: [ { “name”: “kento” }, { “name”: “mako” }, { “name”: “onoda” } ] } } }
  3. 引数を渡してレスポンスを指定  query response { human(id: "1000") { name height }

    } { “data”: { “human”: { “name”: “hideto”, “height”: 1.76 } } }
  4. query response { human(id: "1000") { name height } }

    { “data”: { “human”: { “name”: “hideto”, “height”: 1.76 } } } 体重とか血液型、誕生日も 取ってこれるのかな? name: ‘hideto’ height: 1.76 weight: 70 blood type: ‘AB’ birthday: ‘10/15’ company: ‘Atrae.Inc’ address...
  5. schema type Human {
 id: ID!
 name: String!
 height(unit: LengthUnit

    = METER): Float
 blood_type: String!
 }
 体重は非公開なのか!
  6. gqlgenを使って実装 $ mkdir graphql_sample $ cd graphql_sample $ go mod

    init graphql_sample $ go get -u github.com/99designs/gqlgen $ gqlgen init
  7. _app.js import {ApolloClient, InMemoryCache, ApolloProvider} from "@apollo/client"; const client =

    new ApolloClient({ uri: 'http://localhost:8080/query', cache: new InMemoryCache() }); function MyApp({ Component, pageProps }) { return ( <ApolloProvider client={client}> <Component {...pageProps} /> </ApolloProvider> ) } ① ② ① GraphQLサーバーのURLを指定する。今回は localhostになっているが、本番デプロイやテスト環境 のことを考えると環境変数にすることが望ましい。 ② ComponentをこのApolloProviderで囲うことで各Componentの中で状態管理を行う useQuery, useMutationなどが使えるようになる。
  8. import {gql, useMutation, useQuery} from '@apollo/client'; import {useState} from "react";

    const FIND_TODOS = gql` query findTodos { todos { text done user { name } } } ` const ADD_TODO = gql` mutation createTodo($text: String!) { createTodo(input:{text: $text, userId:"1"}) { user { id } text done } } ` export default function Home() { const { loading, error, data, refetch } = useQuery(FIND_TODOS); const [addTodo] = useMutation(ADD_TODO) const [text, setText] = useState("") if (loading) return <p>Loading...</p>; if (error) return <p>Error :(</p>; const onClick = (e) => { addTodo({ variables: {text: text}} ) refetch() setText("") } return ( ... GraphQLサーバーに送るクエリを記述 FIND_TODOS: すでにあるTodoを全て取得 ADD_TODO: 新しいTodoを作成 useQueryの返り値であるloading, errorをみて画面を切り替えることが できる。refetchで改めて取得できるので、新しく Todoを追加した際に はrefetchする。 useMutationで新しくTodoを追加。