본문으로 건너뛰기

TanStack DB Svelte 어댑터

설치

npm install @tanstack/svelte-db

Svelte 유틸리티

Svelte 어댑터에서 사용할 수 있는 전체 유틸리티 목록은 Svelte 함수 참조를 확인합니다.

쿼리 작성(필터링, 조인, 집계 등)에 관한 종합적인 문서는 Live Queries Guide를 참조할 수 있습니다.

기본 사용법

DbProvider

브라우저 앱마다 하나의 DbClient를 사용하고, 서버 요청마다 하나씩 사용합니다. DbProvider 쿼리가 해당 클라이언트에 대해 컬렉션 설명자를 확인하도록 합니다:

<script lang="ts">
import { DbClient, DbProvider } from '@tanstack/svelte-db'
import App from './App.svelte'

const client = new DbClient()
</script>

<DbProvider {client}>
<App />
</DbProvider>

서버 사전 로드, 탈수화 및 스냅샷 전달에 대해서는 SSR 및 하이드레이션을 확인합니다.

useLiveQuery

useLiveQuery 유틸리티는 데이터가 변경될 때 컴포넌트를 자동으로 업데이트하는 라이브 쿼리를 생성합니다. Svelte 5 룬으로 구동되는 반응형 값을 반환합니다:

<script>
import { useLiveQuery } from '@tanstack/svelte-db'
import { eq } from '@tanstack/db'

const query = useLiveQuery({
query: (q) =>
q.from({ todos: todosCollection })
.where(({ todos }) => eq(todos.completed, false))
.select(({ todos }) => ({ id: todos.id, text: todos.text }))
})
</script>

{#if query.isLoading}
<div>Loading...</div>
{:else}
<ul>
{#each query.data as todo (todo.id)}
<li>{todo.text}</li>
{/each}
</ul>
{/if}

참고: Svelte 5에서 useLiveQuery는 getter를 통해 반응형 값을 반환합니다. query.dataquery.isLoading에 직접 액세스합니다(더 이상 $ 접두사가 필요하지 않음).

useLiveInfiniteQuery

라이브 업데이트가 포함된 정렬 및 페이지 매김 데이터를 사용하려면 useLiveInfiniteQuery을 사용합니다:

<script>
import { useLiveInfiniteQuery } from '@tanstack/svelte-db'
import { eq } from '@tanstack/db'

let category = $state('news')
const query = useLiveInfiniteQuery(
(q) =>
q
.from({ posts: postsCollection })
.where(({ posts }) => eq(posts.category, category))
.orderBy(({ posts }) => posts.createdAt, 'desc'),
{ pageSize: 20 },
[() => category],
)
</script>

{#each query.data as post (post.id)}
<article>{post.title}</article>
{/each}

{#if query.hasNextPage}
<button
disabled={query.isFetchingNextPage}
onclick={() => query.fetchNextPage()}
>
Load more
</button>
{/if}

fetchNextPage()는 페이지 요청이 완료된 후 해결되는 프로미스를 반환합니다. 오류는 query.error을 통해 노출되며 프로미스를 거부하지 않습니다.

쿼리에는 orderBy가 포함되어야 합니다. 종속성 배열은 쿼리 함수 형식에서만 사용할 수 있습니다. 정렬된 사전 생성 라이브 쿼리 컬렉션을 직접 전달할 수도 있습니다.

쿼리 식별성

useLiveQuery는 구조화된 쿼리 IR에서 ID를 파생합니다. 또한 Svelte는 쿼리를 작성하는 동안 읽은 반응형 값을 추적하므로 일반 빌더 쿼리에는 종속성 배열이나 queryKey가 필요하지 않습니다.

캡처된 props와 상태는 파생된 ID의 일부가 됩니다:

<script>
import { useLiveQuery } from '@tanstack/svelte-db'
import { gt } from '@tanstack/db'

let { minPriority } = $props()

const query = useLiveQuery({
query: (q) =>
q.from({ todos: todosCollection })
.where(({ todos }) => gt(todos.priority, minPriority))
})
</script>

<div>{query.data.length} high-priority todos</div>

파생된 ID가 변경되면:

  1. 이전 라이브 쿼리 컬렉션이 정리됩니다
  2. 업데이트된 값으로 새 쿼리가 생성됩니다
  3. 컴포넌트가 새 데이터로 다시 렌더링됩니다
  4. 유틸리티가 로딩 상태를 다시 표시합니다

queryKey.fn.where와 같은 불투명한 함수형 변형에 사용합니다. DB는 해당 함수가 클로저로 캡처한 값을 검사할 수 없기 때문입니다. 반응형 키 값은 getter를 통해 전달합니다:

<script>
import { useLiveQuery } from '@tanstack/svelte-db'

let search = $state('ship')

const query = useLiveQuery({
queryKey: () => [todosCollection.id, 'search', search],
query: (q) =>
q.from({ todos: todosCollection })
.fn.where(({ todos }) => todos.title.includes(search))
})
</script>

기존 종속성 배열도 계속 지원됩니다. 구조화된 쿼리에는 파생된 ID를 사용하고 불투명한 쿼리에는 queryKey을 사용하는 것이 좋습니다.

여러 속성에 액세스하기

쿼리 결과에서 모든 상태 속성에 직접 액세스할 수 있습니다:

<script>
import { useLiveQuery } from '@tanstack/svelte-db'
import { eq } from '@tanstack/db'

const query = useLiveQuery((q) =>
q.from({ todos: todosCollection })
.where(({ todos }) => eq(todos.active, true))
)
</script>

<div>
<div>Status: {query.status}</div>
<div>Loading: {query.isLoading}</div>
<div>Ready: {query.isReady}</div>
<div>Total: {query.data.length}</div>
</div>