⚠️ 本文档介绍用于处理404错误的新版notFound函数和notFoundComponent API。NotFoundRoute路由已弃用,将在未来版本中移除。更多信息请参阅从NotFoundRoute迁移。
TanStack Router中404错误有两种使用场景:
这两种情况底层都使用相同的notFound函数和notFoundComponent API实现。
当TanStack Router遇到不匹配任何已知路由模式或部分匹配但包含额外路径段的路径时,将自动抛出404错误。
根据notFoundMode选项,路由器会以不同方式处理这些自动错误:
默认情况下,路由器的notFoundMode设为fuzzy,表示当路径不匹配任何已知路由时,路由器将尝试使用最近匹配的、具有子路由(即有Outlet)且配置了404组件的路由。
❓ 为何这是默认设置? 模糊匹配能保留尽可能多的父级布局,为用户提供更多上下文信息以便基于预期位置导航到有效路径。
最近合适路由的选择标准:
当notFoundMode设为root时,所有404错误都将由根路由的notFoundComponent处理,而非从最近模糊匹配的路由冒泡上来。
通过给路由附加notFoundComponent可处理两种类型的404错误。例如:
export const Route = createFileRoute('/settings')({
component: () => (
<div>
<p>设置页面</p>
<Outlet />
</div>
),
notFoundComponent: () => <p>该设置页面不存在!</p>,
})
export const Route = createFileRoute('/settings')({
component: () => (
<div>
<p>设置页面</p>
<Outlet />
</div>
),
notFoundComponent: () => <p>该设置页面不存在!</p>,
})
或处理不存在的文章:
export const Route = createFileRoute('/posts/$postId')({
loader: async ({ params: { postId } }) => {
const post = await getPost(postId)
if (!post) throw notFound()
return { post }
},
component: ({ post }) => (
<div>
<h1>{post.title}</h1>
<p>{post.body}</p>
</div>
),
notFoundComponent: () => <p>文章未找到!</p>,
})
export const Route = createFileRoute('/posts/$postId')({
loader: async ({ params: { postId } }) => {
const post = await getPost(postId)
if (!post) throw notFound()
return { post }
},
component: ({ post }) => (
<div>
<h1>{post.title}</h1>
<p>{post.body}</p>
</div>
),
notFoundComponent: () => <p>文章未找到!</p>,
})
可通过createRouter配置全应用范围的默认404组件(仅对有子路由的路径有效):
const router = createRouter({
defaultNotFoundComponent: () => (
<div>
<p>未找到页面!</p>
<Link to="/">返回首页</Link>
</div>
),
})
const router = createRouter({
defaultNotFoundComponent: () => (
<div>
<p>未找到页面!</p>
<Link to="/">返回首页</Link>
</div>
),
})
在loader方法或组件中使用notFound函数手动抛出404错误:
export const Route = createFileRoute('/posts/$postId')({
loader: async ({ params: { postId } }) => {
const post = await getPost(postId)
if (!post) throw notFound() // 或 notFound({ throw: true })
return { post }
},
})
export const Route = createFileRoute('/posts/$postId')({
loader: async ({ params: { postId } }) => {
const post = await getPost(postId)
if (!post) throw notFound() // 或 notFound({ throw: true })
return { post }
},
})
通过notFound函数的route选项可指定特定父路由处理404错误:
throw notFound({ routeId: '/_pathlessLayout' })
throw notFound({ routeId: '/_pathlessLayout' })
import { rootRouteId } from '@tanstack/solid-router'
throw notFound({ routeId: rootRouteId })
import { rootRouteId } from '@tanstack/solid-router'
throw notFound({ routeId: rootRouteId })
虽然支持,但推荐在loader方法中抛出以避免闪烁问题。可使用CatchNotFound组件捕获组件中的404错误。
在notFoundComponent中:
详见SSR指南。
主要变更:
export const Route = createRootRoute({
notFoundComponent: () => <p>未找到页面!</p>,
})
export const Route = createRootRoute({
notFoundComponent: () => <p>未找到页面!</p>,
})
Your weekly dose of JavaScript news. Delivered every Monday to over 100,000 devs, for free.