Placeholder 데이터를 사용하면 initialData
옵션과 유사하게 쿼리가 이미 데이터가 있는 것처럼 동작하지만 데이터가 캐시에 지속되지 않습니다. 이는 실제 데이터가 백그라운드에서 fetched 되는 동안 쿼리를 성공적으로 렌더링할 수 있는 충분한 부분(또는 가짜) 데이터가 있는 경우에 유용합니다.
"예시: 개별 블로그 글 쿼리는 제목과 글 본문의 작은 스니펫만 포함하는 블로그 글의 상위 목록에서 '미리 보기' 데이터를 가져올 수 있습니다. 이 부분 데이터를 개별 쿼리의 쿼리 결과에 유지하려는 것은 아니지만, 실제 쿼리가 완료되어 전체 개체를 가져오는 동안 콘텐츠 레이아웃을 가능한 한 빨리 표시하는 데 유용합니다."
쿼리에 대한 placeholder 데이터를 필요하기 전에 캐시에 제공하는 몇 가지 방법이 있습니다:
placeholderData
를 제공합니다.function Todos() {
const result = useQuery({
queryKey: ['todos'],
queryFn: () => fetch('/todos'),
placeholderData: placeholderTodos,
})
}
쿼리의 placeholder 데이터에 접근하는 과정이 intensive하거나 매 렌더링할 때마다 수행하지 않으려는 경우 값을 메모리에 저장할 수 있습니다:
function Todos() {
const placeholderData = useMemo(() => generateFakeTodos(), [])
const result = useQuery({
queryKey: ['todos'],
queryFn: () => fetch('/todos'),
placeholderData,
})
}
경우에 따라 다른 쿼리의 캐시된 결과에서 쿼리에 대한 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)
},
})
}
Placeholder Data
와 Initial Data
를 비교하려면 커뮤니티 리소스를 참조하세요.
Reference