[TanStakQuery] Placeholder Query Data

Jeris·2023년 5월 22일
0

placeholder data가 뭔가요?

Placeholder 데이터를 사용하면 initialData 옵션과 유사하게 쿼리가 이미 데이터가 있는 것처럼 동작하지만 데이터가 캐시에 지속되지 않습니다. 이는 실제 데이터가 백그라운드에서 fetched 되는 동안 쿼리를 성공적으로 렌더링할 수 있는 충분한 부분(또는 가짜) 데이터가 있는 경우에 유용합니다.

"예시: 개별 블로그 글 쿼리는 제목과 글 본문의 작은 스니펫만 포함하는 블로그 글의 상위 목록에서 '미리 보기' 데이터를 가져올 수 있습니다. 이 부분 데이터를 개별 쿼리의 쿼리 결과에 유지하려는 것은 아니지만, 실제 쿼리가 완료되어 전체 개체를 가져오는 동안 콘텐츠 레이아웃을 가능한 한 빨리 표시하는 데 유용합니다."

쿼리에 대한 placeholder 데이터를 필요하기 전에 캐시에 제공하는 몇 가지 방법이 있습니다:

Plcaeholder Data as a Value

function Todos() {
  const result = useQuery({
    queryKey: ['todos'],
    queryFn: () => fetch('/todos'),
    placeholderData: placeholderTodos,
  })
}

Placeholder Data Memoization

쿼리의 placeholder 데이터에 접근하는 과정이 intensive하거나 매 렌더링할 때마다 수행하지 않으려는 경우 값을 메모리에 저장할 수 있습니다:

function Todos() {
  const placeholderData = useMemo(() => generateFakeTodos(), [])
  const result = useQuery({
    queryKey: ['todos'],
    queryFn: () => fetch('/todos'),
    placeholderData,
  })
}

Placeholder Data from Cache

경우에 따라 다른 쿼리의 캐시된 결과에서 쿼리에 대한 placeholder 데이터를 제공할 수 있습니다. 블로그 글 목록 쿼리에서 캐시된 데이터를 검색하여 글의 미리 보기 버전을 찾은 다음 이를 개별 글 쿼리의 placeholder 데이터로 사용하는 것이 좋은 예입니다:

function Todo({ blogPostId }) {
  const result = useQuery({
    queryKey: ['blogPost', blogPostId],
    queryFn: () => fetch(`/blogPosts/${blogPostId}`),
    placeholderData: () => {
      // Use the smaller/preview version of the blogPost from the 'blogPosts'
      // query as the placeholder data for this blogPost query
      return queryClient
        .getQueryData(['blogPosts'])
        ?.find((d) => d.id === blogPostId)
    },
  })
}

Further reading

Placeholder DataInitial Data를 비교하려면 커뮤니티 리소스를 참조하세요.

Reference

profile
job's done

0개의 댓글