DEV Community

Cover image for Integrating GraphQL with Apollo in React: A Complete Guide
Nayane Menezes.
Nayane Menezes.

Posted on

Integrating GraphQL with Apollo in React: A Complete Guide

As web applications become more dynamic and complex, efficient data management becomes a crucial differentiator. One solution that has gained prominence is the combination of GraphQL with Apollo in React projects. In this post, we'll explore the advantages of this approach and provide a detailed guide to integrating them into your applications.

What is GraphQL?

GraphQL is a query language that redefines how clients interact with APIs. Unlike traditional REST, where data is retrieved from multiple endpoints, GraphQL allows the client to specify exactly what data is needed in a single request. This makes communication between client and server more efficient and direct.

What is Apollo?

Apollo Client is a robust library that facilitates the integration of GraphQL into React applications. It manages the query lifecycle, handles caching, and offers powerful tools to optimize performance and simplify development.

Advantages of Using GraphQL with Apollo

  1. Efficient Queries: With GraphQL, you define precisely what data you need, avoiding the overfetching (fetching too much data) and underfetching (fetching insufficient data) common in REST.

  2. Optimized Requests: GraphQL allows you to obtain all necessary data in a single request, reducing the number of API calls and optimizing application performance.

  3. Cache Management: Apollo Client comes with an integrated caching system that stores data locally, improving performance and minimizing the need for additional requests.

  4. Advanced Tools: Apollo offers tools like Apollo DevTools, which facilitate real-time debugging and analysis of GraphQL queries, speeding up the development process.

  5. Flexibility and Evolution: The structure of GraphQL allows APIs to evolve without breaking existing functionalities on the front-end, making it easier to maintain and update the application.

Step-by-Step Guide to Integrating GraphQL with Apollo in React

1. Setting Up the Environment

To start, create a new React project. We'll use Vite for this, which is fast and easy to set up:

pnpm create vite@latest my-graphql-app --template react-ts
cd my-graphql-app
pnpm install
Enter fullscreen mode Exit fullscreen mode

2. Installing Dependencies

Next, we'll install the necessary libraries to work with Apollo Client and GraphQL:

pnpm add @apollo/client graphql
Enter fullscreen mode Exit fullscreen mode

3. Configuring Apollo Client

Within the project, configure Apollo Client to communicate with the GraphQL server. Create a file named ApolloProvider.tsx:

import React from 'react';
import { ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client';

const client = new ApolloClient({
  uri: 'https://your-graphql-endpoint.com/graphql', // Replace with your GraphQL endpoint
  cache: new InMemoryCache(),
});

export const MyApolloProvider = ({ children }: { children: React.ReactNode }) => (
  <ApolloProvider client={client}>
    {children}
  </ApolloProvider>
);
Enter fullscreen mode Exit fullscreen mode

Then, wrap your application with MyApolloProvider in your main.tsx file:

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { MyApolloProvider } from './ApolloProvider';

ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
  <React.StrictMode>
    <MyApolloProvider>
      <App />
    </MyApolloProvider>
  </React.StrictMode>
);
Enter fullscreen mode Exit fullscreen mode

4. Making a Query with GraphQL

With Apollo Client configured, it's time to fetch data. Here's a simple example of how to perform a query:

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

type User = {
 id: string;
 name: string;
 email: string;
}

type Users = {
 users: User[];
}

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

const Users = () => {
  const { loading, error, data } = useQuery<Users>(GET_USERS);

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

  return (
    <ul>
      {data.users.map(user) => (
        <li key={user.id}>{user.name} - {user.email}</li>
      ))}
    </ul>
  );
};

export default Users;
Enter fullscreen mode Exit fullscreen mode

5. Executing Mutations

In addition to queries, Apollo also makes it easy to perform mutations, which are operations that alter data on the server. Here's how to do it:

import React, { useState } from 'react';
import { useMutation, gql } from '@apollo/client';

const ADD_USER = gql`
  mutation AddUser($name: String!, $email: String!) {
    addUser(name: $name, email: $email) {
      id
      name
    }
  }
`;

const AddUser = () => {
  const [name, setName] = useState('');
  const [email, setEmail] = useState('');
  const [addUser, { data }] = useMutation(ADD_USER);

  const handleSubmit = (e: React.FormEvent) => {
    e.preventDefault();
    addUser({ variables: { name, email } });
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        type="text"
        placeholder="Name"
        value={name}
        onChange={(e) => setName(e.target.value)}
      />
      <input
        type="email"
        placeholder="Email"
        value={email}
        onChange={(e) => setEmail(e.target.value)}
      />
      <button type="submit">Add User</button>
      {data && <p>User added: {data.addUser.name}</p>}
    </form>
  );
};

export default AddUser;
Enter fullscreen mode Exit fullscreen mode

Conclusion

Integrating GraphQL with Apollo in React applications offers a modern and efficient approach to data management. With precise queries, optimized requests, and advanced tools, this combination allows developers to build more agile, robust, and scalable applications. If you haven't yet explored this integration, follow the steps in this guide and discover the possibilities these technologies can offer.

Top comments (0)