启动动态路由@

Start a dynamic route with @

提问人:Lord_Sarcastic 提问时间:11/17/2023 更新时间:11/17/2023 访问量:34

问:

在我的NextJS应用程序(我使用页面路由器)中,我在文件夹中有一个名为 - 类似于YouTube的用户配置文件链接的文件。但是,访问显示 404 页面。如何使用页面路由器在NextJS上允许用户配置文件页面的格式?@[username].tsxpages/@lordsarcastic@[username]

ReactJS URL 下一个.js URL路由

评论

0赞 Vlad Vladov 11/17/2023
为什么不想使用 [username].tsx 并在 Add 中检查用户名以 @ 开头?
0赞 Lord_Sarcastic 11/17/2023
这也行得通。但是,我也避免对嵌套路由重复这些检查。

答:

1赞 Fabio Nettis 11/17/2023 #1

您可以使用客户端文件来实现您的目标。首先,您需要在项目中创建以下结构。template.(js|ts)

app/
├─ [username]/
│  ├─ page.js
│  ├─ template.js

我们之所以使用模板,是因为它们类似于布局,因为它包装了每个子布局或页面,但与跨路由维护状态的布局不同,模板在导航时为每个子布局创建一个新实例。在文件模板中,您可以执行如下操作:

"use client";

import { useParams, useRouter } from "next/navigation";

// templates are server components by default but do not receive any
// params, henceforth we need to rely on hooks on the client side.
export default function UserTemplate({ children }) {
  const router = useRouter();  
  const { username } = useParams();

  if (!username?.startsWith("@")) {
    router.replace("/");
  }

  return <>{children}</>;
}

这只会在客户端呈现您的布局,并且您的页面、子页面和页面内的后续组件仍将是服务器组件,因为客户端组件可以将服务器组件作为子组件接收。此设置可防止对嵌套路由重复这些检查。

评论

0赞 Lord_Sarcastic 11/18/2023
谢谢你。但是,我使用的是页面目录而不是应用程序目录。这如何适用?
0赞 Fabio Nettis 11/19/2023
@Lord_Sarcastic 可悲的是,这将更难在页面目录中复制。