ReactとGraphQL:データの取得と更新を効率化する方法

ReactとGraphQLを組み合わせることで、効率的なデータの取得と更新を実現することができます。GraphQLは柔軟で強力なクエリ言語であり、Reactは柔軟なUIコンポーネントを提供するため、両者を組み合わせることで、効率的なデータフェッチングと状態管理が可能になります。ここでは、ReactとGraphQLを組み合わせたデータの取得と更新を効率化する方法について解説します。

 

moun45.hatenablog.com

 

1. Apollo Clientを使用したデータの取得

Apollo Clientは、ReactアプリケーションでGraphQLクエリを実行し、データを取得するためのライブラリです。Apollo Clientを使用することで、GraphQLサーバーからデータを取得し、Reactコンポーネントに注入することができます。

import { ApolloClient, InMemoryCache, ApolloProvider, useQuery, gql } from '@apollo/client';

const client = new ApolloClient({
cache: new InMemoryCache()
});

const GET_BOOKS = gql`
query GetBooks {
books {
id
title
author
}
}
`;

const Books = () => {
const { loading, error, data } = useQuery(GET_BOOKS);

if (loading) return <p>Loading...</p>;
if (error) return <p>Error: {error.message}</p>;

return (
<ul>
{data.books.map(book => (
<li key={book.id}>{book.title} by {book.author}</li>
))}
</ul>
);
};

const App = () => (
<ApolloProvider client={client}>
<Books />
</ApolloProvider>
);

2. GraphQL Mutationを使用したデータの更新

GraphQL Mutationを使用することで、データの更新や作成などの変更操作をサーバーに送信することができます。Apollo Clientを使用して、GraphQL Mutationを実行し、データを更新します。

import { useMutation } from '@apollo/client';

const ADD_BOOK = gql`
mutation AddBook($title: String!, $author: String!) {
addBook(title: $title, author: $author) {
id
title
author
}
}
`;

const AddBookForm = () => {
let input;
const [addBook] = useMutation(ADD_BOOK);

return (
<form
onSubmit={e => {
e.preventDefault();
addBook({ variables: { title: input.value, author: 'Unknown' } });
input.value = '';
}}
>
<input ref={node => { input = node; }} />
<button type="submit">Add Book</button>
</form>
);
};

3. データの更新と再取得

データの更新後、Apollo Clientは自動的にキャッシュを更新しますが、必要に応じて再取得することもできます。refetchQueriesオプションを使用して、特定のクエリを再取得することができます。

const [addBook] = useMutation(ADD_BOOK, {
refetchQueries: [{ query: GET_BOOKS }]
});

まとめ

ReactとGraphQLを組み合わせることで、データの取得と更新を効率化することができます。Apollo Clientを使用してGraphQLクエリを実行し、データを取得し、Mutationを使用してデータを更新します。また、Apollo Clientは自動的にキャッシュを管理し、必要に応じて再取得を行うため、柔軟なデータフェッチングと状態管理が可能になります。

 

moun45.hatenablog.com