TanStack Router unterstΓΌtzt eine Reihe von leistungsstarken Routing-Konzepten, mit denen Sie komplexe und dynamische Routing-Systeme einfach erstellen kΓΆnnen.
Jedes dieser Konzepte ist nΓΌtzlich und leistungsstark, und wir werden uns in den folgenden Abschnitten mit jedem einzelnen befassen.
Alle anderen Routen, auΓer der Root-Route, werden mit der Funktion createFileRoute konfiguriert, die Typsicherheit bei der Verwendung von Dateibasiertem Routing bietet.
import { createFileRoute } from '@tanstack/solid-router'
export const Route = createFileRoute('/')({
component: PostsComponent,
})
import { createFileRoute } from '@tanstack/solid-router'
export const Route = createFileRoute('/')({
component: PostsComponent,
})
Die Funktion createFileRoute nimmt ein einziges Argument entgegen, den Pfad der Datei-Route als String.
βββ βMoment, Sie lassen mich den Pfad der Routendatei an createFileRoute ΓΌbergeben?β
Ja! Aber keine Sorge, dieser Pfad wird automatisch vom Router fΓΌr Sie ΓΌber das TanStack Router Bundler Plugin oder den Router CLI geschrieben und verwaltet. Wenn Sie also neue Routen erstellen, Routen verschieben oder umbenennen, wird der Pfad automatisch fΓΌr Sie aktualisiert.
Der Grund fΓΌr diesen Pfadnamen hat alles mit der magischen Typsicherheit von TanStack Router zu tun. Ohne diesen Pfadnamen wΓΌsste TypeScript nicht, in welcher Datei wir uns befinden! (Wir wΓΌnschen uns, dass TypeScript dafΓΌr eine integrierte Funktion hΓ€tte, aber das gibt es noch nicht π€·ββοΈ)
Die Root-Route ist die oberste Route im gesamten Baum und kapselt alle anderen Routen als Kinder.
Obwohl sie keinen Pfad hat, hat die Root-Route Zugriff auf alle Funktionen wie andere Routen, einschlieΓlich
Um eine Root-Route zu erstellen, rufen Sie die Funktion createRootRoute() auf und exportieren Sie sie als Variable Route in Ihrer Routendatei.
// Standard root route
import { createRootRoute } from '@tanstack/solid-router'
export const Route = createRootRoute()
// Root route with Context
import { createRootRouteWithContext } from '@tanstack/solid-router'
import type { QueryClient } from '@tanstack/react-query'
export interface MyRouterContext {
queryClient: QueryClient
}
export const Route = createRootRouteWithContext<MyRouterContext>()
// Standard root route
import { createRootRoute } from '@tanstack/solid-router'
export const Route = createRootRoute()
// Root route with Context
import { createRootRouteWithContext } from '@tanstack/solid-router'
import type { QueryClient } from '@tanstack/react-query'
export interface MyRouterContext {
queryClient: QueryClient
}
export const Route = createRootRouteWithContext<MyRouterContext>()
Um mehr ΓΌber Kontexte in TanStack Router zu erfahren, lesen Sie den Leitfaden Router Context.
Grundlegende Routen stimmen mit einem bestimmten Pfad ΓΌberein, z. B. sind /about, /settings und /settings/notifications alles grundlegende Routen, da sie exakt mit dem Pfad ΓΌbereinstimmen.
Werfen wir einen Blick auf eine /about Route
// about.tsx
import { createFileRoute } from '@tanstack/solid-router'
export const Route = createFileRoute('/about')({
component: AboutComponent,
})
function AboutComponent() {
return <div>About</div>
}
// about.tsx
import { createFileRoute } from '@tanstack/solid-router'
export const Route = createFileRoute('/about')({
component: AboutComponent,
})
function AboutComponent() {
return <div>About</div>
}
Grundlegende Routen sind einfach und unkompliziert. Sie stimmen exakt mit dem Pfad ΓΌberein und rendern die bereitgestellte Komponente.
Index-Routen zielen speziell auf ihre Elternroute ab, wenn diese exakt ΓΌbereinstimmt und keine Kindroute ΓΌbereinstimmt.
Werfen wir einen Blick auf eine Index-Route fΓΌr eine /posts URL
// posts.index.tsx
import { createFileRoute } from '@tanstack/solid-router'
// Note the trailing slash, which is used to target index routes
export const Route = createFileRoute('/posts/')({
component: PostsIndexComponent,
})
function PostsIndexComponent() {
return <div>Please select a post!</div>
}
// posts.index.tsx
import { createFileRoute } from '@tanstack/solid-router'
// Note the trailing slash, which is used to target index routes
export const Route = createFileRoute('/posts/')({
component: PostsIndexComponent,
})
function PostsIndexComponent() {
return <div>Please select a post!</div>
}
Diese Route wird abgeglichen, wenn die URL exakt /posts lautet.
Routenpfadsegmente, die mit einem $ gefolgt von einem Label beginnen, sind dynamisch und erfassen diesen Teil der URL in das params Objekt zur Verwendung in Ihrer Anwendung. Zum Beispiel wΓΌrde ein Pfadname von /posts/123 mit der Route /posts/$postId ΓΌbereinstimmen, und das params Objekt wΓ€re { postId: '123' }.
Diese Parameter kΓΆnnen dann in der Konfiguration und den Komponenten Ihrer Route verwendet werden! Sehen wir uns eine Route posts.$postId.tsx an
import { createFileRoute } from '@tanstack/solid-router'
export const Route = createFileRoute('/posts/$postId')({
// In a loader
loader: ({ params }) => fetchPost(params.postId),
// Or in a component
component: PostComponent,
})
function PostComponent() {
// In a component!
const { postId } = Route.useParams()
return <div>Post ID: {postId}</div>
}
import { createFileRoute } from '@tanstack/solid-router'
export const Route = createFileRoute('/posts/$postId')({
// In a loader
loader: ({ params }) => fetchPost(params.postId),
// Or in a component
component: PostComponent,
})
function PostComponent() {
// In a component!
const { postId } = Route.useParams()
return <div>Post ID: {postId}</div>
}
π§ Dynamische Segmente funktionieren in jedem Pfadsegment. Sie kΓΆnnten zum Beispiel eine Route mit dem Pfad /posts/$postId/$revisionId haben, und jedes $ Segment wΓΌrde in das params Objekt erfasst werden.
Eine Route mit einem Pfad von nur $ wird als βSplatβ-Route bezeichnet, da sie immer jeden verbleibenden Teil des URL-Pfadnamens vom $ bis zum Ende erfasst. Der erfasste Pfadname ist dann im params Objekt unter der speziellen Eigenschaft _splat verfΓΌgbar.
Zum Beispiel ist eine Route, die auf den Pfad files/$ abzielt, eine Splat-Route. Wenn der URL-Pfadname /files/documents/hello-world lautet, wΓΌrde das params Objekt documents/hello-world unter der speziellen Eigenschaft _splat enthalten.
{
'_splat': 'documents/hello-world'
}
{
'_splat': 'documents/hello-world'
}
β οΈ In v1 des Routers werden Splat-Routen aus GrΓΌnden der AbwΓ€rtskompatibilitΓ€t auch mit einem * anstelle eines _splat SchlΓΌssels bezeichnet. Dies wird in v2 entfernt.
π§ Warum $ verwenden? Dank Tools wie Remix wissen wir, dass, obwohl * das gebrΓ€uchlichste Zeichen zur Darstellung eines Wildcards sind, sie nicht gut mit Dateinamen oder CLI-Tools zusammenarbeiten. Daher haben wir uns, genau wie sie, entschieden, stattdessen $ zu verwenden.
Optionale Pfadparameter ermΓΆglichen es Ihnen, Routensegmente zu definieren, die in der URL vorhanden sein kΓΆnnen oder nicht. Sie verwenden die Syntax {-$paramName} und bieten flexible Routing-Muster, bei denen bestimmte Parameter optional sind.
// posts.{-$category}.tsx - Optional category parameter
import { createFileRoute } from '@tanstack/solid-router'
export const Route = createFileRoute('/posts/{-$category}')({
component: PostsComponent,
})
function PostsComponent() {
const { category } = Route.useParams()
return <div>{category ? `Posts in ${category}` : 'All Posts'}</div>
}
// posts.{-$category}.tsx - Optional category parameter
import { createFileRoute } from '@tanstack/solid-router'
export const Route = createFileRoute('/posts/{-$category}')({
component: PostsComponent,
})
function PostsComponent() {
const { category } = Route.useParams()
return <div>{category ? `Posts in ${category}` : 'All Posts'}</div>
}
Diese Route stimmt sowohl mit /posts (Kategorie ist undefined) als auch mit /posts/tech (Kategorie ist "tech") ΓΌberein.
Sie kΓΆnnen auch mehrere optionale Parameter in einer einzigen Route definieren
// posts.{-$category}.{-$slug}.tsx
export const Route = createFileRoute('/posts/{-$category}/{-$slug}')({
component: PostsComponent,
})
// posts.{-$category}.{-$slug}.tsx
export const Route = createFileRoute('/posts/{-$category}/{-$slug}')({
component: PostsComponent,
})
Diese Route stimmt mit /posts, /posts/tech und /posts/tech/hello-world ΓΌberein.
π§ Routen mit optionalen Parametern haben eine niedrigere PrioritΓ€t als exakte Γbereinstimmungen, um sicherzustellen, dass spezifischere Routen wie /posts/featured vor /posts/{-$category} abgeglichen werden.
Layout-Routen werden verwendet, um Kindrouten mit zusΓ€tzlichen Komponenten und Logik zu umschlieΓen. Sie sind nΓΌtzlich fΓΌr
Werfen wir einen Blick auf eine Beispiel-Layout-Route namens app.tsx
routes/
βββ app.tsx
βββ app.dashboard.tsx
βββ app.settings.tsx
routes/
βββ app.tsx
βββ app.dashboard.tsx
βββ app.settings.tsx
Im obigen Baum ist app.tsx eine Layout-Route, die zwei Kindrouten umschlieΓt: app.dashboard.tsx und app.settings.tsx.
Diese Baumstruktur wird verwendet, um die Kindrouten mit einer Layout-Komponente zu umschlieΓen.
import { Outlet, createFileRoute } from '@tanstack/solid-router'
export const Route = createFileRoute('/app')({
component: AppLayoutComponent,
})
function AppLayoutComponent() {
return (
<div>
<h1>App Layout</h1>
<Outlet />
</div>
)
}
import { Outlet, createFileRoute } from '@tanstack/solid-router'
export const Route = createFileRoute('/app')({
component: AppLayoutComponent,
})
function AppLayoutComponent() {
return (
<div>
<h1>App Layout</h1>
<Outlet />
</div>
)
}
Die folgende Tabelle zeigt, welche Komponente(n) basierend auf der URL gerendert werden.
| URL-Pfad | Komponente |
|---|---|
| /app | <AppLayout> |
| /app/dashboard | <AppLayout><Dashboard> |
| /app/settings | <AppLayout><Settings> |
Da TanStack Router gemischte flache und Verzeichnisrouten unterstΓΌtzt, kΓΆnnen Sie das Routing Ihrer Anwendung auch mithilfe von Layout-Routen innerhalb von Verzeichnissen ausdrΓΌcken.
routes/
βββ app/
β βββ route.tsx
β βββ dashboard.tsx
β βββ settings.tsx
routes/
βββ app/
β βββ route.tsx
β βββ dashboard.tsx
β βββ settings.tsx
In diesem verschachtelten Baum ist die Datei app/route.tsx eine Konfiguration fΓΌr die Layout-Route, die zwei Kindrouten umschlieΓt: app/dashboard.tsx und app/settings.tsx.
Layout-Routen ermΓΆglichen es Ihnen auch, Komponenten- und Loaderlogik fΓΌr dynamische Routensegmente zu erzwingen.
routes/
βββ app/users/
β βββ $userId/
| | βββ route.tsx
| | βββ index.tsx
| | βββ edit.tsx
routes/
βββ app/users/
β βββ $userId/
| | βββ route.tsx
| | βββ index.tsx
| | βββ edit.tsx
Γhnlich wie Layout-Routen werden pfadlose Layout-Routen verwendet, um Kindrouten mit zusΓ€tzlichen Komponenten und Logik zu umschlieΓen. Pfadlose Layout-Routen erfordern jedoch keinen ΓΌbereinstimmenden path in der URL und werden verwendet, um Kindrouten mit zusΓ€tzlichen Komponenten und Logik zu umschlieΓen, ohne dass ein ΓΌbereinstimmender path in der URL erforderlich ist.
Pfadlose Layout-Routen werden mit einem Unterstrich (_) prΓ€fixiert, um anzuzeigen, dass sie "pfadlos" sind.
π§ Der Teil des Pfades nach dem _ PrΓ€fix wird als ID der Route verwendet und ist erforderlich, da jede Route eindeutig identifizierbar sein muss, insbesondere bei der Verwendung von TypeScript, um Fehler zu vermeiden und AutovervollstΓ€ndigung effektiv zu nutzen.
Werfen wir einen Blick auf eine Beispielroute namens _pathlessLayout.tsx
routes/
βββ _pathlessLayout.tsx
βββ _pathlessLayout.a.tsx
βββ _pathlessLayout.b.tsx
routes/
βββ _pathlessLayout.tsx
βββ _pathlessLayout.a.tsx
βββ _pathlessLayout.b.tsx
Im obigen Baum ist _pathlessLayout.tsx eine pfadlose Layout-Route, die zwei Kindrouten umschlieΓt: _pathlessLayout.a.tsx und _pathlessLayout.b.tsx.
Die Route _pathlessLayout.tsx wird verwendet, um die Kindrouten mit einer pfadlosen Layout-Komponente zu umschlieΓen.
import { Outlet, createFileRoute } from '@tanstack/solid-router'
export const Route = createFileRoute('/_pathlessLayout')({
component: PathlessLayoutComponent,
})
function PathlessLayoutComponent() {
return (
<div>
<h1>Pathless layout</h1>
<Outlet />
</div>
)
}
import { Outlet, createFileRoute } from '@tanstack/solid-router'
export const Route = createFileRoute('/_pathlessLayout')({
component: PathlessLayoutComponent,
})
function PathlessLayoutComponent() {
return (
<div>
<h1>Pathless layout</h1>
<Outlet />
</div>
)
}
Die folgende Tabelle zeigt, welche Komponente basierend auf der URL gerendert wird.
| URL-Pfad | Komponente |
|---|---|
| / | <Index> |
| /a | <PathlessLayout><A> |
| /b | <PathlessLayout><B> |
Da TanStack Router gemischte flache und Verzeichnisrouten unterstΓΌtzt, kΓΆnnen Sie Ihr Anwendungsrouting auch mithilfe von pfadlosen Layout-Routen innerhalb von Verzeichnissen ausdrΓΌcken.
routes/
βββ _pathlessLayout/
β βββ route.tsx
β βββ a.tsx
β βββ b.tsx
routes/
βββ _pathlessLayout/
β βββ route.tsx
β βββ a.tsx
β βββ b.tsx
Im Gegensatz zu Layout-Routen passen diese pfadlosen Layout-Routen jedoch nicht basierend auf URL-Pfadsegmenten, was bedeutet, dass diese Routen keine dynamischen Routensegmente in ihrem Pfad unterstΓΌtzen und daher nicht in der URL abgeglichen werden kΓΆnnen.
Das bedeutet, dass Sie dies nicht tun kΓΆnnen
routes/
βββ _$postId/ β
β βββ ...
routes/
βββ _$postId/ β
β βββ ...
Stattdessen mΓΌssten Sie dies tun
routes/
βββ $postId/
βββ _postPathlessLayout/ β
β βββ ...
routes/
βββ $postId/
βββ _postPathlessLayout/ β
β βββ ...
Nicht verschachtelte Routen kΓΆnnen erstellt werden, indem ein Eltern-Datei-Routensegment mit einem _ angehΓ€ngt wird. Sie werden verwendet, um eine Route von ihren Eltern zu ent-verschachteln und ihren eigenen Komponentenbaum zu rendern.
Betrachten Sie den folgenden flachen Routenbaum
routes/
βββ posts.tsx
βββ posts.$postId.tsx
βββ posts_.$postId.edit.tsx
routes/
βββ posts.tsx
βββ posts.$postId.tsx
βββ posts_.$postId.edit.tsx
Die folgende Tabelle zeigt, welche Komponente basierend auf der URL gerendert wird.
| URL-Pfad | Komponente |
|---|---|
| /posts | <Posts> |
| /posts/123 | <Posts><Post postId="123"> |
| /posts/123/edit | <PostEditor postId="123"> |
Dateien und Ordner kΓΆnnen von der Routengenerierung ausgeschlossen werden, indem ein - PrΓ€fix an den Dateinamen angehΓ€ngt wird. Dies gibt Ihnen die MΓΆglichkeit, Logik in den Routenverzeichnissen zu lokalisieren.
Betrachten Sie den folgenden Routenbaum
routes/
βββ posts.tsx
βββ -posts-table.tsx // ππΌ ignored
βββ -components/ // ππΌ ignored
β βββ header.tsx // ππΌ ignored
β βββ footer.tsx // ππΌ ignored
β βββ ...
routes/
βββ posts.tsx
βββ -posts-table.tsx // ππΌ ignored
βββ -components/ // ππΌ ignored
β βββ header.tsx // ππΌ ignored
β βββ footer.tsx // ππΌ ignored
β βββ ...
Wir kΓΆnnen aus den ausgeschlossenen Dateien in unsere Posts-Route importieren.
import { createFileRoute } from '@tanstack/solid-router'
import { PostsTable } from './-posts-table'
import { PostsHeader } from './-components/header'
import { PostsFooter } from './-components/footer'
export const Route = createFileRoute('/posts')({
loader: () => fetchPosts(),
component: PostComponent,
})
function PostComponent() {
const posts = Route.useLoaderData()
return (
<div>
<PostsHeader />
<PostsTable posts={posts} />
<PostsFooter />
</div>
)
}
import { createFileRoute } from '@tanstack/solid-router'
import { PostsTable } from './-posts-table'
import { PostsHeader } from './-components/header'
import { PostsFooter } from './-components/footer'
export const Route = createFileRoute('/posts')({
loader: () => fetchPosts(),
component: PostComponent,
})
function PostComponent() {
const posts = Route.useLoaderData()
return (
<div>
<PostsHeader />
<PostsTable posts={posts} />
<PostsFooter />
</div>
)
}
Die ausgeschlossenen Dateien werden nicht zu routeTree.gen.ts hinzugefΓΌgt.
Pfadlose Routengruppenverzeichnisse verwenden (), um Routendateien unabhΓ€ngig von ihrem Pfad zu gruppieren. Sie sind rein organisatorisch und beeinflussen den Routenbaum oder den Komponentenbaum in keiner Weise.
routes/
βββ index.tsx
βββ (app)/
β βββ dashboard.tsx
β βββ settings.tsx
β βββ users.tsx
βββ (auth)/
β βββ login.tsx
β βββ register.tsx
routes/
βββ index.tsx
βββ (app)/
β βββ dashboard.tsx
β βββ settings.tsx
β βββ users.tsx
βββ (auth)/
β βββ login.tsx
β βββ register.tsx
Im obigen Beispiel sind die Verzeichnisse app und auth rein organisatorisch und beeinflussen den Routenbaum oder den Komponentenbaum in keiner Weise. Sie werden verwendet, um zusammengehΓΆrige Routen zur einfacheren Navigation und Organisation zu gruppieren.
Die folgende Tabelle zeigt, welche Komponente basierend auf der URL gerendert wird.
| URL-Pfad | Komponente |
|---|---|
| / | <Index> |
| /dashboard | <Dashboard> |
| /settings | <Settings> |
| /users | <Users> |
| /login | <Login> |
| /register | <Register> |
Wie Sie sehen, sind die Verzeichnisse app und auth rein organisatorisch und beeinflussen den Routenbaum oder den Komponentenbaum in keiner Weise.
Ihre wΓΆchentliche Dosis JavaScript-Nachrichten. Jeden Montag kostenlos an ΓΌber 100.000 Entwickler geliefert.