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

Next.js 13 App Router动态路由实现问题求助

Next.js 13 App Router 实现动态路由/:section?/:subsection? 及客户端组件参数获取方案

一、正确的动态路由文件夹结构

要实现/:section?/:subsection?这种两级可选动态路由,不能用固定的section文件夹,得遵循Next.js App Router的动态路由命名规则:

  • 一级动态参数文件夹命名为[section]
  • 二级动态参数文件夹嵌套在[section]下,命名为[subsection]
  • 为每一级路由创建对应的page.tsx,处理不同层级的访问请求

最终结构如下:

src/app/
├── [section]/
│   ├── [subsection]/
│   │   └── page.tsx  # 匹配 /:section/:subsection
│   └── page.tsx      # 匹配 /:section
├── post/
│   └── page.tsx      # 固定路由,匹配 /post(优先级高于动态路由)
└── page.tsx          # 匹配根路径 /

这样既满足了动态路由需求,又能保留你想要的固定路由(比如/post),Next.js会优先匹配固定路由,不会和动态路由冲突。

二、获取路由参数的方法

1. 服务器组件获取参数

在各级page.tsx(默认是服务器组件)中,直接通过props的params对象获取:

// src/app/[section]/page.tsx
export default function SectionPage({ params }: { params: { section?: string } }) {
  return <div>当前Section:{params.section}</div>;
}

// src/app/[section]/[subsection]/page.tsx
export default function SubsectionPage({ params }: { params: { section?: string; subsection?: string } }) {
  return (
    <div>
      Section:{params.section}<br/>
      Subsection:{params.subsection}
    </div>
  );
}

2. 客户端组件获取参数

客户端组件需要使用next/navigation提供的useParams钩子,必须先声明'use client'指令:

'use client';

import { useParams } from 'next/navigation';

export default function ClientComponent() {
  const params = useParams<{ section?: string; subsection?: string }>();
  
  return (
    <div>
      客户端获取Section:{params.section}<br/>
      客户端获取Subsection:{params.subsection}
    </div>
  );
}

之前拿不到参数大概率是路由结构不符合动态路由规则,导致useParams无法识别对应参数。

三、替代rewrites的方案

你之前尝试用next-config.js的rewrites没成功,其实没必要用rewrites——正确的动态路由结构已经能实现需求。如果一定要通过rewrites映射到你理想的section文件夹结构,可以这样配置:

// next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
  async rewrites() {
    return [
      {
        source: '/:section?/:subsection?',
        destination: '/section/:section?/:subsection?',
      },
    ];
  },
};

module.exports = nextConfig;

然后在src/app/section/下创建动态路由结构:

src/app/section/
├── [section]/
│   ├── [subsection]/
│   │   └── page.tsx
│   └── page.tsx
└── page.tsx

但这种方式多了一层嵌套,不如直接在根目录配置动态路由简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 17:03:23