본문으로 건너뛰기

빠른 시작

@tanstack/svelte-query 패키지는 Svelte를 통해 TanStack Query를 사용하기 위한 일급 API를 제공합니다.

예시

<script lang="ts">
import { QueryClient, QueryClientProvider } from '@tanstack/svelte-query'
import Example from './lib/Example.svelte'

const queryClient = new QueryClient()
</script>

<QueryClientProvider client={queryClient}>
<Example />
</QueryClientProvider>

그런 다음 아무 컴포넌트에서나 임의의 함수(예: createQuery)를 호출합니다:

<script lang="ts">
import { createQuery } from '@tanstack/svelte-query'

const query = createQuery(() => ({
queryKey: ['todos'],
queryFn: () => fetchTodos(),
}))
</script>

<div>
{#if query.isPending}
<p>Loading...</p>
{:else if query.isError}
<p>Error: {query.error.message}</p>
{:else if query.isSuccess}
{#each query.data as todo}
<p>{todo.title}</p>
{/each}
{/if}
</div>

Svelte Query와 React Query의 중요한 차이점

Svelte Query는 React Query와 유사한 API를 제공하지만, 유의해야 할 몇 가지 핵심 차이점이 있습니다.

  • svelte-query 프리미티브(예: createQuery, createMutation)의 인수는 반응형 범위에서 추적할 수 있도록 함수로 지정합니다.
// ❌ react version
useQuery({
queryKey: ['todos', todo],
queryFn: fetchTodos,
})

// ✅ svelte version
createQuery(() => ({
queryKey: ['todos', todo],
queryFn: fetchTodos,
}))
  • Svelte Query 기본 요소는 구조 분해를 지원하지 않습니다. 이 함수들의 반환 값은 proxy이며, 해당 속성은 동적으로 결정됩니다.
<script lang="ts">
import { createQuery } from '@tanstack/svelte-query'

const query = createQuery(() => ({
queryKey: ['repoData'],
queryFn: () =>
fetch('https://api.github.com/repos/tannerlinsley/react-query').then(
(res) => res.json(),
),
}))
</script>

<!-- ❌ react version -- supports destructuring outside reactive context
const { isPending, error, data } = useQuery({
queryKey: ['repoData'],
queryFn: () =>
fetch('https://api.github.com/repos/tannerlinsley/react-query').then(
(res) => res.json(),
),
}) -->

<!-- ✅ access query properties in svelte reactive context -->
<div>
{#if query.isPending}
<p>Loading...</p>
{:else if query.isError}
<p>Error: {query.error.message}</p>
{:else if query.isSuccess}
<div>
<h1>{query.data.name}</h1>
<p>{query.data.description}</p>
<strong>👀 {query.data.subscribers_count}</strong>
<strong>✨ {query.data.stargazers_count}</strong>
<strong>🍴 {query.data.forks_count}</strong>
</div>
{/if}
</div>
  • Runes 값을 함수 인수에 직접 전달할 수 있습니다. Svelte Query가 쿼리를 자동으로 업데이트합니다.
<script lang="ts">
import { createQuery } from '@tanstack/svelte-query'

let enabled = $state(false)
let todoCount = $state(0)

// ✅ passing a rune directly is safe and observers update
// automatically when the value of a rune changes
const todosQuery = createQuery(() => ({
queryKey: ['todos'],
queryFn: () => fetchTodos(),
enabled: enabled,
}))

const todoDetailsQuery = createQuery(() => ({
queryKey: ['todo', todoCount],
queryFn: fetchTodo,
enabled: todoCount > 0,
}))
</script>

<div>
{#if todosQuery.isPending}
<p>Loading...</p>
{:else if todosQuery.isError}
<p>Error: {todosQuery.error.message}</p>
{:else if todosQuery.isSuccess}
{#each todosQuery.data as todo}
<button onclick={() => (todoCount = todo.id)}>{todo.title}</button>
{/each}
{/if}
<button onclick={() => (enabled = !enabled)}>Toggle enabled</button>
</div>
  • Svelte의 네이티브 <svelte:boundary> 컴포넌트를 사용하여 오류를 포착하고 재설정할 수 있습니다. 오류가 <svelte:boundary> 컴포넌트에 발생하도록 throwOnError 옵션을 true로 설정합니다.

  • 속성 추적은 Svelte의 세밀한 반응성을 통해 처리되므로 notifyOnChangeProps와 같은 옵션은 필요하지 않습니다