[Apollo-Client] Apollo-Client

Apollo-Client

설치하기


npm install apollo-boost react-apollo graphql --save


Create a Client


import ApolloClient from "apollo-boost";

const client = new ApolloClient({
  uri: "https://w5xlvm3vzz.lp.gql.zone/graphql"
});

apollo-boost 에서 ApolloClient 를 가져와서
GraphQL 서버에 대한 엔드포인트를
클라이언트 설정 객체의 uri 속성에 추가합니다.
추가를 완료했다면 데이터를 가져올 준비가 되었습니다.

import gql from "graphql-tag";

// ...(code)

client
  .query({
    query: gql`
      {
        rates(currency: "USD") {
          currency
        }
      }
    `
  })
  .then(result => console.log(result));

ApolloClient 를 React 에 결합하기전에
먼저 일반 javascript 로 쿼리를 보내 봅시다.
동일한 파일에서 client.query()를 호출해보면
콘솔창에서 쿼리한 데이터를 확인할 수 있습니다.


Connect your client to React


Apollo Client 를 React 에 연결하려면 react-apollo 에서 내보낸
ApolloProvider 구성 요소를 사용해야합니다.
ApolloProvider 는 React 의 Context API 의 Provider 와 유사합니다.
React 응용 프로그램을 랩핑하고 컨텍스트의 클라이언트를 배치하므로
구성 요소 트리의 아무 곳에서나 엑세스 할 수 있습니다.

import React from "react";
import { render } from "react-dom";

import { ApolloProvider } from "react-apollo";

const App = () => (
  <ApolloProvider client={client}>
    <div>
      <h2>My first Apollo app 🚀</h2>
    </div>
  </ApolloProvider>
);

render(<App />, document.getElementById("root"));

React App 을 ApolloProvider 로 랩핑했습니다.
ApolloProvider 는 GraphQL 데이터를 액세스하는 앱보다 위에
두는 것이 좋습니다. 만약에 react-router 를 사용하고 있다면
당신의 root route component 보다 높은 포지션에 있는게 좋습니다.


Request Data


ApolloProvider 가 연결되면 쿼리 구성 요소로 데이터를 요청할 준비가 된 것입니다.
Query 는 render prop 패턴을 사용하여 GraphQL 데이터를 UI 와 공유하는
react-apollo 에서 내보낸 React 구성요소입니다.

먼저 gql 함수로 래핑 된 GraphQL 쿼리를 쿼리 구성 요소의 쿼리 prop 으로 전달합니다.
그런 다음 쿼리 구성 요소의 하위 prop 에 렌더링 할 항목을 결정하는 함수를 제공하고
Query 는 로드, 오류 및 데이터 속성이 포함 된 개체로 호출합니다.
Apollo Client 는 오류 및로드 상태를 추적하며 로드 및 오류 속성에 반영됩니다.
쿼리 결과가 돌아 오면 데이터 속성에 연결됩니다.

import { Query } from "react-apollo";
import gql from "graphql-tag";

const ExchangeRates = () => (
  <Query
    query={gql`
      {
        rates(currency: "USD") {
          currency
          rate
        }
      }
    `}
  >
    {({ loading, error, data }) => {
      if (loading) return <p>Loading...</p>;
      if (error) return <p>Error :(</p>;

      return data.rates.map(({ currency, rate }) => (
        <div key={currency}>
          <p>{`${currency}: ${rate}`}</p>
        </div>
      ));
    }}
  </Query>
);

ExchangeRates 구성 요소를 렌더링하면
먼저 로딩 인디케이터(string : Loading…)가 표시되고,
준비가 되면 페이지에 데이터가 표시됩니다.
Apollo Client 는 서버에서 돌아올 때 데이터가 자동으로 캐시하므로,
동일한 쿼리를 두 번 실행하면 로딩 인디케이터가 표시되지 않습니다.