主要观点:在 Next.js 应用中实现高级过滤功能,包括按类别和名称过滤任务列表、分页、排序等。通常将状态放在 URL 中以便共享、可书签和可重新加载,但与组件状态协调困难,更好的是将 URL 作为单一真相来源。在 Next.js App Router 中管理此状态较难,本文探索如何实现高级搜索参数过滤,利用 React 19 特性如useOptimistic()
,最后切换到库nuqs。
关键信息:
- 介绍初始搜索和过滤组件的实现及存在的问题,如搜索触发无法即时知道、类别过滤点击后响应慢、多次点击类别时只有最后一个生效、搜索和点击类别顺序错误时搜索被丢弃等,原因是 Next.js 路由器的工作方式导致 URL 更新延迟。
- 提出解决搜索组件的 pending 状态跟踪方法,使用
useTransition
并展示加载 spinner。 - 解决类别过滤器的 pending 状态跟踪,使用
useTransition
并添加 data-pending 属性,还使用useOptimistic()
实现按钮状态的即时更新。 - 定义
filterSchema
,创建FilterContext
来协调搜索和过滤状态,使用useFilters
钩子在组件中获取和更新过滤器,添加额外的useTransition
来跟踪每个过滤的 pending 状态。 - 介绍使用nuqs库实现搜索参数管理,在根布局中添加
NuqsAdapter
,定义全局搜索参数类型,使用useQueryState
钩子获取和更新搜索参数,通过startTransition
显示用户反馈。
重要细节: - 提供了多个组件的代码示例,如
Search.tsx
、CategoryFilter.tsx
、FilterProvider.tsx
等,展示了不同部分的实现细节和逻辑。 - 提到数据库可能休眠,初始应用错误后需等待一分钟。
- 提供了工作示例的链接on Vercel和代码链接on GitHub。
- 建议观看在 Next.js Conf 的演讲on YouTube以获取更深入解释。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。