Рубрики
Без рубрики

Как использовать совершенно новые компоненты запроса Apollo для управления локальным состоянием

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

Автор оригинала: Andrico Karoulla.

Примечание. В этой статье рассматриваются новые компоненты нового запроса и мутации Apollo, а не HOCS. Для тех, кто прочитал оригинальную статью здесь Имейте в виду, что две статьи очень похожи.

Вступление

Одно из самых больших сил веб-разработки – и слабые стороны – это его подход к модульности. Ключевое программирование Mantra состоит в том, чтобы выбрать что-то (функцию, пакет), чтобы сделать одно задание и делать это хорошо. Недостаток этого подхода заключается в том, что единый проект может включать жонглирование десятков отдельных технологий и концепций, каждый сосредоточив внимание на чем-то конкретном.

Таким образом, выбирая клиент APOLLO для обработки моего локального состояния, а также моими удаленными данными, похожему на отсутствие мозга. Зачем иметь дело с котельной Redux и IDIOMS, когда у меня уже есть Apollo/GraphQL, чтобы получить данные с моей бэкинги?

Хотя эта статья собирается справиться с созданием APOLLO, чтобы обработать местное государство, это не будет введено в технику. (Эта законная Howtographql Учебник – это хорошее начало этого).

Примечание: готовый репо можно найти здесь Отказ Вы можете помить через код, если вы застряли или чувствуете себя смущенным.

Установка

Мы начнем с клонирования соответствующего репо здесь Отказ Это репо содержит простой веб-сайт RACT, с боковой панелью, заголовком и телом. Это довольно статично в природе, нет динамического содержания (еще). К концу этого учебника у нас будет APOLLO управлять состоянием сайта. Нажав на элемент в боковой панели, изменит состояние веб-сайта, который, в свою очередь, обновляет заголовок, чтобы отобразить новые данные.

Если вы проверяете Package.json Вы увидите, что у нас есть только основы, а также некоторые дополнительные пакеты, относящиеся к нашей установке посылки.

После клонирования REPO запустите свои стандартные команды в интерфейсе командной строки.

> yarn
> yarn dev

Чтобы установить все свои пакеты и подняться на локальный сервер, перейдите в Localhost: 1234, и мы надеемся увидеть демонстрационный сайт во всей его славе. Это статично прямо сейчас, поэтому нажатие вокруг не сделает ничего.

То, что мы хотим сделать в первую очередь, это получить Apollo в нашем проекте, поэтому установите эти пакеты. Apollo-Client Давайте настроим наш экземпляр APOLLO, а React-Apollo Это водитель, который позволяет нам интегрировать его в наше приложение React. Из-за проблемы с посылкой (я думаю), нам также нужно установить график .

> yarn add apollo-client react-apollo graphql

Создать новый каталог SRC/APOLLO , взломать index.js Файл и добавьте следующее:

import ApolloClient from 'apollo-client';
export const client = new ApolloClient({});

Это инициализирует наш клиент Apollo, который мы будем использовать, чтобы обернуть наше приложение React, добавив следующую внутреннюю часть нашего SRC/index.js файл.

import { ApolloProvider } from 'react-apollo';
import { client } from './apollo';

const WrappedApp = (
  
    
  
);

ReactDOM.render(WrappedApp, document.getElementById('root'));
// Don't be a sap. Wrap your app.

Теперь у нас есть Apollo готовы к использованию в нашем приложении. Все строит, когда мы перезагрузим наш Dev Server, но мы получаем ошибку, когда мы пытаемся получить доступ к ней в браузере. Консоль скажет нам, что нам нужно указать свойства ссылки и кеша для нашего клиента Apollo, поэтому давайте сделаем это.

> yarn add apollo-link apollo-cache-inmemory apollo-link-state

Предыдущая строка добавляет новые зависимости Apollo в наше приложение, когда следующий код разрешает ошибки консоли, которые мы получали. Так вернитесь к Apollo/index.js и обновите его, чтобы файл выглядит так:

import ApolloClient from 'apollo-client';
import { InMemoryCache } from 'apollo-cache-inmemory';
import { ApolloLink } from 'apollo-link';
import { withClientState } from 'apollo-link-state';

const cache = new InMemoryCache();
const stateLink = withClientState({
  cache
});

export const client = new ApolloClient({
  cache,
  link: ApolloLink.from([
    stateLink,
  ]),
})

Давайте создадим экземпляр нашего кеша. Кэш – нормализованный хранилище данных Apollo, который хранит результаты запроса в формулированной структуре данных. Мы будем читать из кеша, когда мы сделаем наш запрос GraphQL, и мы напишем в кэш, когда мы сделаем нашу мутацию Resolver.

Вы можете увидеть, что мы также добавили ссылка к нашему клиентскому объекту. Apollolink.from () Способ позволяет нам настроить модульную настройку того, как наши запросы отправляются через http. Мы можем использовать это для обработки ошибок и авторизации, а также предоставить доступ к нашей ошибке. Мы не собираемся делать ни одно из этого в руководстве, но мы создадим наше клиентское состояние здесь. Итак, мы создаем Const StateLink выше и пройти в нашем кеше. Мы добавим наше состояние и резолью по умолчанию здесь позже.

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

Внутри каталога Apollo создайте новый каталог под названием по умолчанию и добавить index.js внутри этого. Файл будет содержать следующее:

export default {
  apolloClientDemo: {
    __typename: 'ApolloClientDemo',
    currentPageName: 'Apollo Demo',
  }
}

Мы создаем объект, который действует как состояние нашего сайта по умолчанию. APOLLOCLIRITDEMO – это имя структуры данных, которую мы хотим получить доступ, когда мы производим наши запросы. __typename Является ли обязательный идентификатор, который использует наш кеш, и текущееpageName является конкретным элементом данных, которые наш заголовок будет использовать для – вы угадали это – отобразить текущее имя страницы.

Нам нужно добавить это на наш Apollo/index.js файл:

import defaults from './defaults';

const stateLink = withClientState({
  cache,
  defaults,
});

Давайте проясним это немного. Импорт и по умолчанию Оба ключевых слова, связанные с импортными модулями, но совпадают с именем объекта, который мы экспортируем из ./defaults также называется по умолчанию (Так что не думайте, что я использую Импорт/Экспорт Неправильно). Обратите внимание на эту линию импорта, как если бы это был просто какой-либо регулярный ol ‘именованный импорт.

С этим с пути, давайте пойдем сделать запрос!

Как сделать запрос

Добавьте следующий пакет в свой проект:

> yarn add graphql-tag

и создать новый каталог src/graphql. . В тудах создайте два новых файла: index.js и getpagename.js Отказ Каталог GraphQL будет размещать все запросы и мутации. Мы создадим наш запрос в getpagename.js написав следующее:

import gql from 'graphql-tag';

export const getPageNameQuery = gql`
  query {
    apolloClientDemo @client {
      currentPageName
    }
  }
`;

export const getPageNameOptions = ({
  props: ({ data: { apolloClientDemo } }) => ({
    apolloClientDemo
  })
});

Таким образом, мы экспортируем две переменные, запрос и варианты. Если вы использовали график раньше, то запрос будет выглядеть знакомым. Мы запрашиваем к структуре данных APOLLOCLIRITDEMO, извлекивая назад ничего больше, чем текущееpagename. Вы заметите, что мы добавили @Client Директива к нашему запросу. Это говорит Apollo запрашивать наше местное государство вместо отправки запроса на бэкэнду.

Ниже вы увидите, что мы экспортируем некоторые варианты. Это просто определяет, как мы хотим, чтобы данные могли посмотреть, когда мы рассмотрим результаты к реквизиту. Мы разрушили ответ на графику и отправляя его на наш взгляд, так что это выглядит так:

props: {
  currentPageName: 'Apollo Demo',
}
// and not this
props: {
  data: {
    apolloClientDemo: {
      currentPageName: 'Apollo Demo',
    }
  }
}

Перейти к graphql/index.js Файл и экспортируйте запрос следующим образом:

export { getPageNameQuery, getPageNameOptions } from './getPageName';

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

Добавить в Header.js:

import React from 'react';
import { Query } from 'react-apollo';
import { getPageNameQuery } from '../graphql';

const Header = () => (
    
        {({ loading, error, data }) => {
            if (error) return 

Error...

; if (loading || !data) return

Loading...

; return

{data.apolloClientDemo.currentPageName}

}}
); export default Header;

Это наше первое использование нового компонента запроса APOLLO, которое было добавлено в 2.1. Мы импортируем Запрос от React-Apollo и используйте его, чтобы обернуть остальную часть нашего компонента. Затем мы передаем GetPageNameQueryQuery в качестве значения в процессе запроса. Когда наш компонент отображается, он уволит запрос и дает остальную часть компонента доступа к данным, которые мы разрушаем, чтобы получить доступ к загрузке, ошибкам и данным.

Компонент запроса использует шаблон рендеринга реквизита, чтобы дать остальную часть нашего компонента доступа к информации, возвращаемой из запроса. Если вы использовали API React Context в 16.3, вы видели этот синтаксис раньше. В противном случае стоит проверить официальные документы по реагированию здесь , когда образец рендеринга становится все более популярным.

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

Теперь все, что осталось сделать, это мутировать данные в кэше Apollo, нажав на элемент боковой панели.

Мутации

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

> Ты Серьги нажимает на боковой панель

> SE NDS переменная для мутации

> Fi RES мутация с переменной

> G ETS отправлен в экземпляр APOLLO

> Fi NDS соответствует Resolver

> Appl Логика IES в магазин APOLLO

> SE Данные NDS обратно в заголовок

Если это трудно запомнить, то используйте эту удобную Mnemonic, созданные с использованием Mnemonic Generator: Городские старческие фаны торжественно нащупали Аслан Аслан. (легкий…)

Начните с создания файла graphql/updatepagename.js Отказ

import gql from 'graphql-tag';

export const updatePageName = gql`
  mutation updatePageName($name: String!) {
    updatePageName(name: $name) @client {
      currentPageName
    }
  }
`;

И экспортировать это так же, как мы сделали с запросом.

export { updatePageNameMutation } from './updatePageName';

Вы заметите несколько различий в отношении мутации. На первый взгляд мы изменили ключевое слово из запроса на мутацию. Это позволяет GraphQL знать тип действия, которые мы выполняем. Мы также определяем имя запроса и добавления типа к переменным, в которых мы проходим. Внутри Здесь мы указываем имя Resolver, мы будем использовать для выполнения изменений. Мы также проходим через переменную и добавляя @Client Директива.

В отличие от запроса, мы не можем просто добавить мутацию на наш взгляд и ожидать, что что-то произойдет. Мы должны вернуться к нашему каталогу APOLLO и добавить наших резольверов. Так что идите вперед и создайте новый каталог Аполлон/Резольверы и файлы index.js и updatepagename.js Отказ Внутри updatepagename.js Добавьте следующее:

import gql from 'graphql-tag';

export default (_, { name }, { cache }) => {
  const query = gql`
    query GetPageName {
      apolloClientDemo @client {
        currentPageName
      }
    }
  `;
  
  const previousState = cache.readQuery({ query });
  
  const data = {
    apolloClientDemo: {
      …previousState.apolloClientDemo,
      currentPageName: name,
    },
  };
  
  cache.writeQuery({
    query,
    data,
  });
  
  return null;
};

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

Поэтому по умолчанию, когда вызывается Resolver, Apollo проходит во всех переменных и кэш. Первый аргумент – это простое «_», потому что нам не нужно его использовать. Второй аргумент – это объект переменных, а последний аргумент является кэшем.

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

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

Между тем в Резольверы/index.js файл…

import updatePageName from 'updatePageName';

export default {
  Mutation: {
    updatePageName,
  }
};

Это форма объекта, который Apollo ожидает, когда мы проходим в наших резольвестах в StateLink обратно в Apollo/index.js :

import resolvers from './resolvers';

const stateLink from = withClientState({
  cache,
  defaults,
  resolvers,
});

Все, что осталось сделать, это добавить мутацию на нашу компонент боковой панели.

// previous imports
import { Mutation } from 'react-apollo';
import { updatePageNameMutation } from '../graphql';

class Sidebar extends React.Component {
  render() {
    return (
      
        {updatePageName => (
          // outer div elements
          
  • updatePageName({ variables: { name: 'React'} })}>React
  • // other list items and outer div elements )}
    ); } } export default Sidebar;

    Как и наш файл Resolver, в этом файле многое, но это новое. Мы импортируем наши Мутация Компонент из React-Apollo Заверните его вокруг нашего компонента и пройдите UpdatePagenamemution внутри Мутация пропры

    Компонент теперь имеет доступ к UpdatePageName Метод, который стреляет мутацию всякий раз, когда это называется. Мы делаем это, добавив метод в качестве обработчика к < Li> onclick свойство. Метод ожидает получить на объекте, содержащий переменные в качестве параметра, поэтому пройдите во имя, которое вы хотите обновить заголовок. Если все работает, вы должны быть в состоянии запустить свой DEV-сервер и щелкнуть элементы боковых панелей, которые должны затем изменить наш заголовок.

    Обертывание

    Ура! Надеюсь, все разработало. Если вы застряли, затем проверьте репо здесь Отказ Он содержит все готовый код. Если вы думаете о том, чтобы использовать местное управление государством в вашем следующем приложении React App, вы можете вилить этот репо и продолжить оттуда. Если вы заинтересованы в том, чтобы эта статья/тема говорила о встрече или конференции, то отправьте сообщение моему пути!

    Есть гораздо больше, я хотел прикрыть в этом руководстве, например Async Resolvers (думаю, Redux Thunk), тип проверки/создания схемы и обновление мутации. Так кто знает … Может быть, я оставлю другую статью в ближайшее время.

    Я действительно надеюсь, что этот учебник был полезен для вас. Я хотел бы кричать Учебник на YouTube Sara Vieira тоже Как это помогло мне голову вокруг клиента Аполлона. Если я не сделаю свою работу достаточно хорошо, оставив вы поцарапая голову, затем следуйте по ссылке. И, наконец, не стесняйтесь ударить меня в социальных сетях, я большой музыкальный и технический поклонник, так что разговаривайте мне в Гик.

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

    Если вы заинтересованы в хостинге мне на конференцию, встреча или как речие гость для любого участия, тогда вы можете DM мне на Twitter Действительно

    Вы можете проверить мои другие статьи ниже:

    Как использовать совершенно новые компоненты запроса Apollo для управления локальным состоянием

    Добавьте прикосновение прессущения в ваше веб-приложение с Rect.Lazy ()

    Не нужно ждать праздников, начните украшать сейчас

    Управление местным государством с компонентами Apollo и более высоким порядком

    Игра

    Разработайте и разверните свое собственное приложение React Monorepo в течение 2 часов, используя Lerna, Trvis и Теперь

    Оригинал: “https://www.freecodecamp.org/news/updated-for-apollo-v2-1-managing-local-state-with-apollo-d1882f2fbb7/”