본문으로 건너뛰기

정적 라우트 데이터

라우트를 생성할 때 라우트 옵션에 staticData 속성을 선택적으로 지정할 수 있습니다. 라우트를 생성할 때 동기적으로 사용할 수 있다면 이 객체에는 원하는 모든 것을 포함할 수 있습니다.

라우트 자체에서 이 데이터에 액세스할 수 있을 뿐 아니라, 모든 매치에서 match.staticData 속성을 통해 액세스할 수도 있습니다.

예제

React

src/routes/posts.tsx
import { createFileRoute } from '@tanstack/react-router'

export const Route = createFileRoute('/posts')({
staticData: {
customData: 'Hello!',
},
})

이후 라우트에 액세스할 수 있는 모든 곳에서, 라우트로 다시 매핑할 수 있는 매치를 포함해 이 데이터에 액세스할 수 있습니다.

src/routes/__root.tsx
import { createRootRoute } from '@tanstack/react-router'

export const Route = createRootRoute({
component: () => {
const matches = useMatches()

return (
<div>
{matches.map((match) => {
return <div key={match.id}>{match.staticData.customData}</div>
})}
</div>
)
},
})

Solid

src/routes/posts.tsx
import { createFileRoute } from '@tanstack/solid-router'

export const Route = createFileRoute('/posts')({
staticData: {
customData: 'Hello!',
},
})

이후 라우트에 액세스할 수 있는 모든 곳에서, 라우트로 다시 매핑할 수 있는 매치를 포함해 이 데이터에 액세스할 수 있습니다.

src/routes/__root.tsx
import { createRootRoute, useMatches } from '@tanstack/solid-router'
import { For } from 'solid-js'

export const Route = createRootRoute({
component: () => {
const matches = useMatches()

return (
<div>
<For each={matches()}>
{(match) => <div>{match.staticData.customData}</div>}
</For>
</div>
)
},
})

정적 데이터 강제

라우트에 정적 데이터가 있도록 강제하려면 선언 병합을 사용해 라우트의 static 옵션에 타입을 추가할 수 있습니다.

React

declare module '@tanstack/react-router' {
interface StaticDataRouteOption {
customData: string
}
}

Solid

declare module '@tanstack/solid-router' {
interface StaticDataRouteOption {
customData: string
}
}

이제 customData 속성 없이 라우트를 생성하려고 하면 타입 오류가 발생합니다.

export const Route = createFileRoute('/posts')({
staticData: {
// Property 'customData' is missing in type '{ customData: number; }' but required in type 'StaticDataRouteOption'.ts(2741)
},
})

선택적 정적 데이터

정적 데이터를 선택 사항으로 만들려면 속성에 ?를 추가하면 됩니다.

React

declare module '@tanstack/react-router' {
interface StaticDataRouteOption {
customData?: string
}
}

Solid

declare module '@tanstack/solid-router' {
interface StaticDataRouteOption {
customData?: string
}
}

StaticDataRouteOption에 필수 속성이 있으면 객체를 전달해야 합니다.

일반적인 패턴

레이아웃 표시 여부 제어

staticData를 사용해 레이아웃 요소를 표시하거나 숨길 라우트를 제어합니다.

src/routes/admin/route.tsx
export const Route = createFileRoute('/admin')({
staticData: { showNavbar: false },
component: AdminLayout,
})
// routes/__root.tsx
function RootComponent() {
const showNavbar = useMatches({
select: (matches) =>
!matches.some((m) => m.staticData?.showNavbar === false),
})

return showNavbar ? (
<Navbar>
<Outlet />
</Navbar>
) : (
<Outlet />
)
}

브레드크럼용 라우트 제목

React

src/routes/posts/$postId.tsx
export const Route = createFileRoute('/posts/$postId')({
staticData: {
getTitle: () => 'Post Details',
},
})
src/components/Breadcrumbs.tsx
function Breadcrumbs() {
const matches = useMatches()

return (
<nav>
{matches
.filter((m) => m.staticData?.getTitle)
.map((m) => (
<span key={m.id}>{m.staticData.getTitle()}</span>
))}
</nav>
)
}

Solid

src/routes/posts/$postId.tsx
export const Route = createFileRoute('/posts/$postId')({
staticData: {
getTitle: () => 'Post Details',
},
})
src/components/Breadcrumbs.tsx
import { useMatches } from '@tanstack/solid-router'
import { For } from 'solid-js'

function Breadcrumbs() {
const matches = useMatches()

return (
<nav>
<For each={matches().filter((m) => m.staticData?.getTitle)}>
{(m) => <span>{m.staticData.getTitle()}</span>}
</For>
</nav>
)
}

staticData와 Context 중 사용 시점

staticDatacontext
동기식이며 라우트 생성 시 정의됨비동기 가능(beforeLoad를 통해)
로드 시작 전에 사용 가능params/search에 의존 가능
라우트의 모든 인스턴스에서 동일함자식 라우트로 전달됨

정적 라우트 메타데이터에는 staticData를 사용합니다. 요청마다 달라지는 동적 데이터나 인증 상태에는 context를 사용합니다.