这是 TanStack Router 最值得 Next.js 工程师认真看的部分。复杂筛选、表格、排序、分页、分享链接——都在这里。
TanStack Router 使用 JSON-first search params:第一层仍兼容 URLSearchParams,但 number、boolean、array、object 可以被解析/序列化,并通过 validateSearch 形成可信类型。
const productSearchSchema = z.object({
page: z.number().catch(1),
sort: z.enum(['newest', 'oldest', 'price']).catch('newest'),
tags: z.array(z.string()).catch([]),
})
export const Route = createFileRoute('/products')({
validateSearch: productSearchSchema,
component: ProductsPage,
})
function ProductsPage() {
const search = Route.useSearch()
// search.page: number
// search.sort: 'newest' | 'oldest' | 'price'
// search.tags: string[]
}<Link
to="/products"
search={(prev) => ({ ...prev, page: prev.page + 1 })}
>
Next page
</Link>| Next 常见做法 | TanStack 做法 | 后果 |
|---|---|---|
useSearchParams() 读字符串 | validateSearch 输出 typed object | 组件不用重复 parse |
router.push('/x?page=2') | Link search={{ page: 2 }} | 导航参数类型可检查 |
| URL 状态和 data fetching 手动同步 | loaderDeps 声明依赖 | 缓存 key 更明确 |
一个产品列表的 page/sort/tags 是否适合放在 search params?