在 Next.js 应用路由器中管理高级搜索参数过滤 | 奥萝拉·沙夫夫

主要观点:在 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.tsxCategoryFilter.tsxFilterProvider.tsx等,展示了不同部分的实现细节和逻辑。
  • 提到数据库可能休眠,初始应用错误后需等待一分钟。
  • 提供了工作示例的链接on Vercel和代码链接on GitHub
  • 建议观看在 Next.js Conf 的演讲on YouTube以获取更深入解释。
阅读 7
0 条评论