Introduction

Apollo Client is a comprehensive state management library for JavaScript that enables you to manage both local and remote data with GraphQL. It helps you fetch, cache, and modify application data, all while automatically updating your UI.

Key Features of Apollo Client:

  • Declarative Data Fetching: Write queries directly within your components.
  • Normalized Caching: Efficiently cache and manage data.
  • State Management: Manage local and remote data seamlessly.
  • Developer Tools: Powerful tools for debugging and optimizing your GraphQL queries.

Setting Up Apollo Client

Step 1: Install Apollo Client

To get started, you need to install the necessary packages. You can do this using npm or yarn.

npm install @apollo/client graphql

or

yarn add @apollo/client graphql

Step 2: Initialize Apollo Client

Create an instance of Apollo Client and provide it with the URL of your GraphQL server.

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

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

Step 3: Integrate Apollo Client with React

To use Apollo Client with React, you need to wrap your application with the ApolloProvider component.

import React from 'react';
import ReactDOM from 'react-dom';
import { ApolloProvider } from '@apollo/client';
import App from './App';
import client from './apolloClient'; // Import the client instance

ReactDOM.render(
  <ApolloProvider client={client}>
    <App />
  </ApolloProvider>,
  document.getElementById('root')
);

Fetching Data with Queries

Writing a Query

Define your GraphQL query using the gql template literal.

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

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

Executing a Query

Use the useQuery hook to execute the query within a React component.

import React from 'react';
import { useQuery } from '@apollo/client';
import { GET_USERS } from './queries';

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

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

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

export default Users;

Modifying Data with Mutations

Writing a Mutation

Define your GraphQL mutation using the gql template literal.

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

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

Executing a Mutation

Use the useMutation hook to execute the mutation within a React component.

import React, { useState } from 'react';
import { useMutation } from '@apollo/client';
import { ADD_USER } from './mutations';

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

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

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

  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;

Practical Exercise

Exercise: Fetch and Display a List of Posts

  1. Define the Query: Create a new file queries.js and define a query to fetch posts.
  2. Create the Component: Create a new component Posts.js to fetch and display the list of posts.
  3. Integrate the Component: Use the Posts component in your main application.

Solution

queries.js

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

export const GET_POSTS = gql`
  query GetPosts {
    posts {
      id
      title
      content
    }
  }
`;

Posts.js

import React from 'react';
import { useQuery } from '@apollo/client';
import { GET_POSTS } from './queries';

const Posts = () => {
  const { loading, error, data } = useQuery(GET_POSTS);

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

  return (
    <ul>
      {data.posts.map(post => (
        <li key={post.id}>
          <h2>{post.title}</h2>
          <p>{post.content}</p>
        </li>
      ))}
    </ul>
  );
};

export default Posts;

App.js

import React from 'react';
import Posts from './Posts';

const App = () => {
  return (
    <div>
      <h1>Posts</h1>
      <Posts />
    </div>
  );
};

export default App;

Conclusion

In this section, you learned how to set up Apollo Client, fetch data using queries, and modify data using mutations. You also practiced these concepts by creating a component to fetch and display a list of posts. In the next module, we will explore more advanced features of Apollo Client, such as caching strategies and state management.

© Copyright 2024. All rights reserved