【发布时间】:2021-10-06 06:51:50
【问题描述】:
在使用 React Context 进行状态管理和基于文件系统的路由器的 Next.js 应用程序(全功能,not next export)中,您如何实现高级路由?
我想为某些页面设置先决条件,例如,如果您尝试加载 /foo 但上下文没有正确设置给定属性,它会将您路由到 /bar。
实际逻辑很复杂,因页面而异,所以我正在寻找一种易于维护的方法。
请注意,这些先决条件与授权无关,因此不需要在服务器端强制执行。这更像是“您需要先填写此表格才能到这里。”
上下文的使用施加了一些限制:
- 必须在 React 组件或自定义 Hook 中访问上下文
- 不能使用自定义服务器进行路由,因为这会丢失上下文 - 它必须使用客户端路由
- 必须检查当前上下文(我尝试装饰
useRouter,但如果在router.push之前更改了上下文,自定义Hook会看到旧值)
更新:在重新路由发生之前页面加载时避免闪烁也很好,因此在这种情况下,一个附加目标是返回一个加载指示器组件。
【问题讨论】:
-
这听起来像是标准的动态路由,甚至可能捕获所有路由都应该工作。你累了吗?它们都可以在客户端完成,并且都可以访问您的上下文。当您构建您的站点时,您甚至可以在 staticProps 中预先执行逻辑,并在使用 ISR 更新逻辑时进行更新,或者只检查每个请求。你有几个选择。 nextjs.org/docs/routing/dynamic-routes
-
@SeanW 我们已经在做动态路由和捕获所有路由。将此更多地视为基于客户端状态(通常适用于多个页面)的页面前提条件,而不是典型的路由问题。
-
使用Router HOC 包裹在 Next.js 中的自定义 HOC 可能是最简单的解决方案 - nextjs.org/docs/api-reference/next/router#withrouter
标签: next.js url-routing react-context