You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NextJS多动态路由配置问题:[early].tsx未被正确识别

问题:Next.js 动态页面[early].tsx无法匹配路由

我通过NextJS的动态页面创建功能实现了[video].tsx动态页面,代码如下:

const Video = (props) => {
  const router = useRouter()
  const { video } = router.query
  const videoData = GeneralVideo.find((d) => d.link === video)
}

链接设置为:

<Link href={'/videos/' + item.link} passHref={true}>

生成的URL如http://localhost:3000/videos/100004_SF可正常匹配[video].tsx页面。

现在我希望新增一套[early].tsx动态页面,代码如下:

const Early = (props) => {
  const router = useRouter()
  const { early } = router.query
  const videoData = GeneralVideo.find((d) => d.linkEarly === early)
}

链接设置为:

<Link href={'/videos/' + item.linkEarly} passHref={true}>

生成的URL如http://localhost:3000/videos/100159_SF_early可正常生成,但[early].tsx组件未被正确识别,页面为空。请问我的配置哪里出错了?


原因与解决方案

问题原因

Next.js的文件路由规则中,同一目录下的动态路由文件(如[video].tsx和[early].tsx)会遵循先定义先匹配的优先级逻辑。所有/videos/xxx格式的URL都会被[video].tsx先捕获,导致[early].tsx永远不会被触发,所以页面显示为空。

解决方案1:调整路由目录结构

给early类型的页面单独设置子目录,让路由路径区分开:

  1. 调整目录结构:
pages/
  videos/
    [video].tsx
    early/
      [early].tsx
  1. 修改Link的跳转路径:
<Link href={`/videos/early/${item.linkEarly}`} passHref={true}>

这样访问http://localhost:3000/videos/early/100159_SF_early时,就会正确匹配[early].tsx组件。

解决方案2:在现有动态页面中兼容两种逻辑

如果不想修改路由结构,可以在[video].tsx中添加判断逻辑,区分普通视频和early视频:

const Video = (props) => {
  const router = useRouter()
  const { video } = router.query

  // 判断参数是否属于early类型
  if (video?.endsWith('_early')) {
    const earlyData = GeneralVideo.find((d) => d.linkEarly === video)
    // 渲染early视频的内容
    return (
      <div>
        <h1>Early视频:{earlyData?.title}</h1>
        {/* 其他early视频相关内容 */}
      </div>
    )
  }

  // 处理普通视频逻辑
  const videoData = GeneralVideo.find((d) => d.link === video)
  return (
    <div>
      <h1>普通视频:{videoData?.title}</h1>
      {/* 其他普通视频相关内容 */}
    </div>
  )
}

内容的提问来源于stack exchange,提问作者ChrisBean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 10:36:26