Начало работы с React и клиентом Apollo

Что такое клиент Аполлона

Apollo Client — это полная библиотека управления состоянием для приложений JavaScript.
Он использует API GraphQL для обработки выборки данных. Это означает, что для использования Apollo Client вам необходимо иметь GraphQL API, к которому вы будете подключаться.

Что такое GraphQL

GraphQL — это открытый язык запросов и обработки данных для API, а также среда выполнения для выполнения запросов с существующими данными. GraphQL использует Mutation и Query для достижения этой цели.

Что такое запрос и мутация

  • Запрос: запрос GraphQL используется для чтения или выборки данных.
    Пример запроса GraphQL показан в примере ниже.
{
  query getUserDetails {
    users {
      id
      name
      email
     }
   }
} 

Примечание. Приведенный выше запрос называется getUserDetails и он возвращает поля идентификатора, имени и электронной почты.

  • Мутация: Мутации используются для любого типа запроса, который изменяет данные, создает, обновляет и удаляет операции.
    Пример мутации GraphQL выглядит так, как показано в примере ниже.
{
  mutation addUser(name: String!, email: String!){
    addUser(name: $name, email: $email){
      id
      name
      email
      created_at
    }
  }
}

Примечание. В приведенном выше примере мутации он получает name а также email в качестве параметров и возвращает поля id, name, email и created_at в качестве ответа.

Настроить React-приложение

Я буду использовать шаблон create-react-app для настройки моего приложения для реагирования. На вашем терминале выполните приведенную ниже команду, чтобы сгенерировать шаблон реакции.

npx create-react-app rick-and-morty

после выполнения вышеуказанной команды откройте сгенерированную папку в интегрированной среде разработки.

Установить зависимости

npm install apollo-boost graphql react-apollo

Подключить клиент

Чтобы подключить реагирующее приложение к Graphql API, в index.js файл вашего реагирующего приложения, добавьте следующий код ниже.

import ApolloClient from "apollo-boost";
import { ApolloProvider } from 'react-apollo';

const client = new ApolloClient({
    uri: 'https://rickandmortyapi.com/graphql/', 
  });

… затем оберните ваши подкомпоненты с помощью ApolloProvider, передав клиент, который мы определили выше как prop. Пример показан ниже.

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

После того, как все вышеперечисленное выполнено, мы успешно настроили базовое клиентское соединение apollo с внутренним API GraphQL.

Примечание: найти больше здесьдля более сложной настройки и конфигурации клиента Apollo.

Существуют различные методы использования Graphql API при использовании клиента Apollo:

  • Рендер реквизит
  • Крючки
  • Компонент высшего порядка (HOC)

Все различные методы использования GraphQL API можно реализовать с помощью react-apollo пакет, который мы установили ранее.

Запросы

Рендер реквизит

Чтобы делать запросы с помощью метода Render Prop, нам нужно использовать метод Query компонент из react-apollo. Пример показан ниже.

import React from "react";
import { Query } from "react-apollo";
import { gql } from "apollo-boost";

const GET_CHARACTERS = gql`
  query getCharacters {
    characters {
      results {
        id
        name
        image
      }
    }
  }
`;

export default function CharacterWithRender() {
  return (
    <Query query={GET_CHARACTERS}>
      {({ loading, error, data }) => {
        if (loading) return "Loading...";
        if (error) return `Error! ${error.message}`;

        return (
          <div className="characters">
            {data.characters.results.map(character => (
              <div key={character.name} className="character">
                <img src={character.image} alt={character.name} />
                <p>{character.name}</p>
              </div>
            ))}
          </div>
        );
      }}
    </Query>
  );
}

Крючки

Чтобы делать запросы с помощью метода Hooks, нам нужно использовать метод useQuery крючок из react-apollo. Пример показан ниже.

Пример показан ниже

import React from "react";
import { gql } from "apollo-boost";
import { useQuery } from "react-apollo";

const GET_CHARACTERS = gql`
  query getCharacters {
    characters {
      results {
        id
        name
        image
      }
    }
  }
`;

function CharacterWithHook() {
  const { loading, error, data } = useQuery(GET_CHARACTERS);
  if (error) {
    return <div>Error</div>;
  }

  if (loading) {
    return (
      <div className="App">
        <h2>Loading...</h2>
      </div>
    );
  }
  if (data) {
    if (data.characters.results.length > 0) {
      return (
        <div className="characters">
          {data.characters.results.map(character => (
            <div key={character.name} className="character">
              <img src={character.image} alt={character.name} />
              <p>{character.name}</p>
            </div>
          ))}
        </div>
      );
    }
  }
}

export default CharacterWithHook;

Компонент высшего порядка (HOC)

Мы также можем использовать withApollo Компонент более высокого порядка для выполнения запросов, вы можете сделать это, просто обернув экспорт вашего компонента с помощью withApollo. Это внедряет клиентскую поддержку в компонент, что позволяет вам выполнять запросы GraphQL.
Пример показан ниже

import React, { useState } from "react";
import { gql } from "apollo-boost";
import { withApollo } from "react-apollo";

const GET_CHARACTERS = gql`
  query getCharacters {
    characters {
      results {
        id
        name
        image
      }
    }
  }
`;

function CharacterWithHOC({ client }) {
  const [characters, setCharacters] = useState([]);

  client
    .query({ query: GET_CHARACTERS })
    .then(res => setCharacters(res.data.characters.results))
    .catch(err => console.log(err));

  if (characters.length > 0) {
    return (
      <div className="characters">
        {characters.map(character => (
          <div key={character.name} className="character">
            <img src={character.image} alt={character.name} />
            <p>{character.name}</p>
          </div>
        ))}
      </div>
    );
  }
  return (
    <div className="App">
      <h2>Loading...</h2>
    </div>
  );
}

export default withApollo(CharacterWithHOC);

Мутации

Рендер реквизит

Чтобы произвести мутации с помощью метода Render Prop, нам нужно использовать Mutation компонент из react-apollo. Пример показан ниже.

import React, { useState } from 'react';
import { Mutation } from 'react-apollo';
import { gql } from 'apollo-boost';

const LOGIN_MUTATION = gql`
  mutation userLogin($email: String!, $password: String!) {
    userLogin(email: $email, password: $password) {
      username
      email
      id
      token
    }
  }
`;

export default function MutationWithRender() {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');

  return (
    <Mutation mutation={LOGIN_MUTATION}>
      {(loginUser, { loading, error, data }) => {
        if (loading) return 'Loading...';
        if (error) return `Error! ${error.message}`;

        return (
          <form
            id="signinForm"
            className="text-center  p-4"
            onSubmit={e => {
              e.preventDefault();
              loginUser({ variables: { email, password } });
            }}
          >
            <p className="h4 mb-4 f-1">Sign In</p>

            <input
              title="Email"
              id="email"
              name="email"
              value={email}
              onChange={e => setEmail(e.target.value)}
              type="email"
              required
            />
            <input
              title="Password"
              id="password"
              name="password"
              type="password"
              value={password}
              onChange={e => setPassword(e.target.value)}
              required
            />

            <div className="form-group my-4">
              <button className="btn btn-block" type="submit">
                Sign In
              </button>
            </div>
          </form>
        );
      }}
    </Mutation>
  );
}

Крючки

Чтобы произвести мутации с помощью метода Hooks, нам нужно использовать useMutation крючок из react-apollo. Пример показан ниже.

Пример показан ниже

import React, { useState } from 'react';
import { useMutation } from 'react-apollo';
import { gql } from 'apollo-boost';

const LOGIN_MUTATION = gql`
  mutation userLogin($email: String!, $password: String!) {
    userLogin(email: $email, password: $password) {
      username
      email
      id
      token
    }
  }
`;

export function MutationWithHook() {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');

  const [loginUser, { data, error, loading }] = useMutation(LOGIN_MUTATION);

  if (error) {
    alert('Error Logging In User');
  }

  if (data) {
    alert('Successfully Logged In');
  }

  return (
    <form
      id="signinForm"
      className="text-center  p-4"
      onSubmit={e => {
        e.preventDefault();
        loginUser({ variables: { email, password } });
      }}
    >
      <p className="h4 mb-4 f-1">Sign In</p>

      <input
        title="Email"
        id="email"
        name="email"
        value={email}
        onChange={e => setEmail(e.target.value)}
        type="email"
        required
      />
      <input
        title="Password"
        id="password"
        name="password"
        type="password"
        value={password}
        onChange={e => setPassword(e.target.value)}
        required
      />

      <div className="form-group my-4">
        <button className="btn btn-block" type="submit">
          Sign In
        </button>
      </div>
    </form>
  );
}

export default MutationWithHook;

Компонент высшего порядка (HOC)

Мы также можем использовать withApollo Компонент более высокого порядка для внесения изменений, вы можете сделать это, просто обернув экспорт вашего компонента с помощью withApollo. Это вводит клиентскую поддержку в компонент, что позволяет вам вносить изменения в GraphQL.

Пример показан ниже

import React, { useState } from 'react';
import { withApollo } from 'react-apollo';
import { gql } from 'apollo-boost';

const LOGIN_MUTATION = gql`
  mutation userLogin($email: String!, $password: String!) {
    userLogin(email: $email, password: $password) {
      username
      email
      id
      token
    }
  }
`;

export function MutationWithHOC({ client }) {
  const [error, setError] = useState(false);
  const [success, setSuccess] = useState(false);
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');

  const { mutate } = client;

  const onSubmit = async e => {

    try {
      e.preventDefault();
      const res = await mutate({
        mutation: LOGIN_MUTATION,
        variables: {
          email,
          password
        }
      });

      setSuccess(res.data);
    } catch (err) {
      setError(err);
    }
  };

  if(error) {
    alert('Error Logging In User');
  }

  if (success) {
    alert('Successfully Logged In');
  }

  return (
    <form id="signinForm" className="text-center  p-4" onSubmit={onSubmit}>
      <p className="h4 mb-4 f-1">Sign In</p>

      <input
        title="Email"
        id="email"
        name="email"
        value={email}
        onChange={e => setEmail(e.target.value)}
        type="email"
        required
      />
      <input
        title="Password"
        id="password"
        name="password"
        type="password"
        value={password}
        onChange={e => setPassword(e.target.value)}
        required
      />

      <div className="form-group my-4">
        <button className="btn btn-block" type="submit">
          Sign In
        </button>
      </div>
    </form>
  );
}

export default withApollo(MutationWithHOC);

Вывод

С помощью клиента Apollo можно сделать гораздо больше, например кэширование, повторную загрузку, подписки и многое другое.

В этой статье мы рассмотрели, как настроить базовый клиент apollo с помощью реакции, различные методы, которые мы можем использовать для создания запросов и мутаций, а также примеры того, как делать запросы и мутации в наших компонентах реакции.

Найдите код, используемый в этом проекте, на Гитхаб
Найдите дополнительную информацию о клиенте Apollo здесь

Если у вас есть какие-либо вопросы или отзывы об этой статье, не стесняйтесь оставлять комментарии.

Спасибо за чтение.

Эта статья изначально была опубликована на моем блог

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *