[Apollo] 3장. Queries

Apollo 써보기

출처 : Apollo 공식 레퍼런스

목차


Queries


Executing a query

As-Is

const Dogs = ({ onDogSelected }) => (
  <Query query={GET_DOGS}>
    {({ loading, error, data }) => {
      if (loading) return 'Loading...';
      if (error) return `Error! ${error.message}`;

      return (
        <select name="dog" onChange={onDogSelected}>
          {data.dogs.map(dog => (
            <option key={dog.id} value={dog.breed}>
              {dog.breed}
            </option>
          ))}
        </select>
      );
    }}
  </Query>
);

To-be

function Dogs({ onDogSelected }) {
  // Query 클래스 선언 없이 그냥 함수로 할당해버린다
  const { loading, error, data } = useQuery(GET_DOGS);

  if (loading) return 'Loading...';
  if (error) return `Error! ${error.message}`;

  return (
    <select name="dog" onChange={onDogSelected}>
      {data.dogs.map(dog => (
        <option key={dog.id} value={dog.breed}>
          {dog.breed}
        </option>
      ))}
    </select>
  );
}

+) variables 넘기기

function DogPhoto({ breed }) {
  const { loading, error, data } = useQuery(GET_DOG_PHOTO, {
    variables: { breed },
  });
  ...

Caching query results

  1. Polling
    • 특정 주기로 계속 쿼리해서 서버랑 동기화함
    • pollInterval : 주기 설정, 1000일 경우 1초마다 폴링. 0이면 폴링 안함.
    • useQuery Hook이 반환하는 startPolling, stopPolling 함수로 제어 가능.
function DogPhoto({ breed }) {
  const { loading, error, data } = useQuery(GET_DOG_PHOTO, {
    variables: { breed },
    skip: !breed,
    pollInterval: 500,
  });
  ...
  1. Refetching
    • 특정 유저 액션이 발생하면 쿼리 결과를 갱신하도록 함. (특정 인터벌이 X)
    • refetch 함수한테 새로 variables 오브젝트를 넘겨줄 수도 있음.
    • 최신 데이터임을 보장해주는 데 좋은 방법임!
function DogPhoto({ breed }) {
  const { loading, error, data, refetch } = useQuery(GET_DOG_PHOTO, {
    ...
  });
  ...
  return (
    <button onClick={() => refetch()}>Refetch!</button> // 버튼 누르면 refetch!
  );
}

Inspecting loading states

function DogPhoto({ breed }) {
  const { loading, error, data, refetch, networkStatus } = useQuery(
    GET_DOG_PHOTO,
    {
      notifyOnNetworkStatusChange: true,
    },
  );

  if (networkStatus === 4) return 'Refetching!';
  ...
}

Inspecting error states


Executing queries manually

function DelayedQuery() {
  const [dog, setDog] = useState(null);
  const [getDog, { loading, data }] = useLazyQuery(GET_DOG_PHOTO);
  // 결과값으로 함수를 반환함... (getDog)

  if (loading) return <p>Loading ...</p>;

  if (data && data.dog) {
    setDog(data.dog);
  }

  return (
    <div>
      {dog && <img src={dog.displayImage} />}
      <button onClick={() => getDog({ variables: { breed: 'bulldog' } })}>
        // 이 버튼이 눌리고 나서야 getDog이 실행된다!
        Click me!
      </button>
    </div>
  );
}

+) useQuery API 문서 +) useQuery 옵션들