Как использовать GraphQL с React?react-81

Интеграция GraphQL с React позволяет эффективно управлять данными в приложении, используя преимущества GraphQL на клиентской стороне. Вот полное руководство по настройке и использованию:

1. Выбор клиентской библиотеки

Основные варианты:

  • Apollo Client (наиболее популярный)
  • Relay (для сложных приложений от Facebook)
  • Urql (легковесная альтернатива)

2. Установка Apollo Client

Базовый набор зависимостей:

npm install @apollo/client graphql

3. Настройка клиента

Создаем клиент и подключаем к React:

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

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

function App() {
  return (
    <ApolloProvider client={client}>
      <YourAppComponent />
    </ApolloProvider>
  );
}

4. Выполнение запросов

Использование хука useQuery

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

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

function UserList() {
  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>
  );
}

5. Отправка мутаций

Использование хука useMutation

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

const CREATE_USER = gql`
  mutation CreateUser($name: String!, $email: String!) {
    createUser(name: $name, email: $email) {
      id
      name
    }
  }
`;

function AddUserForm() {
  const [createUser, { data, loading, error }] = useMutation(CREATE_USER);
  const [formState, setFormState] = useState({ name: '', email: '' });

  const handleSubmit = (e) => {
    e.preventDefault();
    createUser({ variables: formState });
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        value={formState.name}
        onChange={(e) => setFormState({...formState, name: e.target.value})}
      />
      <input
        value={formState.email}
        onChange={(e) => setFormState({...formState, email: e.target.value})}
      />
      <button type="submit">Add User</button>
    </form>
  );
}

6. Реализация подписок

Для работы в реальном времени:

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

const USER_ADDED = gql`
  subscription OnUserAdded {
    userAdded {
      id
      name
    }
  }
`;

function UserSubscription() {
  const { data, loading } = useSubscription(USER_ADDED);

  return (
    <div>
      <h3>New user: {!loading && data?.userAdded.name}</h3>
    </div>
  );
}

7. Оптимизация производительности

Фрагменты

fragment UserDetails on User {
  id
  name
  avatarUrl
  friendsCount
}

Политика кэширования

Настройка в ApolloClient:

new ApolloClient({
  cache: new InMemoryCache({
    typePolicies: {
      Query: {
        fields: {
          users: {
            merge(existing = [], incoming) {
              return [...existing, ...incoming];
            }
          }
        }
      }
    }
  })
})

8. Интеграция с состоянием приложения

Локальное состояние

const GET_LOCAL_STATE = gql`
  query GetLocalState {
    isLoggedIn @client
  }
`;

// В мутации:
const client = useApolloClient();
client.writeQuery({
  query: GET_LOCAL_STATE,
  data: { isLoggedIn: true },
});

Проблемы и решения

  1. N+1 проблема: Используйте DataLoader на сервере
  2. Большие запросы: Реализуйте пагинацию
  3. Безопасность: Настройте глубину запросов и ограничения

Резюмируем

Для работы с GraphQL в React:

  1. Установите Apollo Client или альтернативу
  2. Настройте провайдер в корне приложения
  3. Используйте хуки useQuery, useMutation для работы с данными
  4. Реализуйте подписки для real-time обновлений
  5. Оптимизируйте запросы с помощью фрагментов и кэширования

Грамотная интеграция GraphQL с React значительно упрощает управление данными и улучшает производительность приложения.