사용법보다는 내부적 동작, 의미에 집중해서 작성해보겠습니다.
const { loading, error, data } = useQuery(GET_DOG_PHOTO, {
variables: { breed },
});
불독
으로 요청하고 breed를 푸들
로 요청한 다음에 다시 불독
으로 요청하게 되면 로콜에 캐시된 데이터를 사용하기 때문에 처음 요청보다 빠르게 불독의 이미지를 보여줄 수 있는 것을 확인할 수 있습니다.캐시된 데이터가 서버에서 최신 상태인지 확인할 수 있는 방법에는 polling & refetching 방법이 존재합니다.
useQuery
hook에 pollInterval
옵션을 줘야합니다.const { loading, error, data } = useQuery(GET_DOG_PHOTO, {
variables: { breed },
pollInterval: 500,
});
const { loading, error, data, refetch } = useQuery(GET_DOG_PHOTO, {
variables: { breed }
});
useQuery
hook의 결과는 networkStatus
속성을 통해 쿼리 상태에 대한 세분화 된 정보를 제공합니다.networkStatus
를 사용하기 위해서는 notifyOnNetworkStatusChange
옵션을 true로 설정하여 refetch 되는 동안 query component 요소가 다시 렌더링 되도록 합니다.import { NetworkStatus } from '@apollo/client';
function DogPhoto({ breed }) {
const { loading, error, data, refetch, networkStatus } = useQuery(
GET_DOG_PHOTO,
{
variables: { breed },
notifyOnNetworkStatusChange: true,
},
);
if (networkStatus === NetworkStatus.refetch) return 'Refetching!';
if (loading) return null;
...
}
useQuery
를 호출하지만, 버튼을 클릭하는 것과 같은 이벤트가 발생했을 때 요청을 보내고 싶은 경우에는 useLazyQuery
를 사용한다.useLazyQuery
는 즉각적으로 실행하지 않고 요청을 위한 함수를 반환합니다.import React from 'react';
import { useLazyQuery } from '@apollo/client';
function DelayedQuery() {
const [getDog, { loading, data }] = useLazyQuery(GET_DOG_PHOTO);
if (loading) return <p>Loading ...</p>;
return (
<div>
{data && data.dog && <img src={data.dog.displayImage} />}
<button onClick={() => getDog({ variables: { breed: 'bulldog' } })}>
Click me!
</button>
</div>
);
}
const { loading, error, data } = useQuery(GET_DOGS, {
fetchPolicy: "network-only"
});
mutation을 실행하게 되면 서버측 데이터가 변경되고 cache에 변경된 데이터를 반영해야한다.
id
를 반환하면 된다.id
로 entity를 cache하기 때문이다.const GET_TODOS = gql`
query GetTodos {
todos {
id
}
}
`;
function AddTodo() {
let input;
const [addTodo] = useMutation(ADD_TODO, {
update(cache, { data: { addTodo } }) {
cache.modify({
fields: {
todos(existingTodos = []) {
const newTodoRef = cache.writeFragment({
data: addTodo,
fragment: gql`
fragment NewTodo on Todo {
id
type
}
`
});
return [...existingTodos, newTodoRef];
}
}
});
}
});
...
}
update function
을 포함한 useMutation 을 사용합니다.update function
의 목적은 캐시된 데이터를 변경하는 것 입니다.ADD_TODO mutation
이 실행되도, GET_TODOS query
로 받은 데이터는 자동적으로 업데이트 되지 않습니다.GET_TODOS query
의 결과가 캐시의 ROOT_QUERY.todos
배열로 저장되어있기 때문에 todos
modifier function을 통해 캐시된 데이터를 업데이트 시킬 수 있습니다.