第 2 章:页面与路由系统

⚙️ 第 2 章:页面与路由系统

Next.js 的路由系统是基于文件系统自动生成的,不需要引入第三方路由库(比如 react-router),大大简化了页面组织与跳转逻辑。


2.1 基于文件的路由机制(pages 目录)

Next.js 会将 pages 目录下的每个 .js/.ts/.jsx/.tsx 文件自动映射为一个路由:

目录结构:

bash 复制代码
pages/
├── index.js          // 首页,路径为 "/"
├── about.js          // 路径为 "/about"
├── contact.js        // 路径为 "/contact"

示例:pages/about.js

jsx 复制代码
export default function About() {
  return <h1>关于我们</h1>;
}

访问 http://localhost:3000/about 即可看到页面内容。

✅ 页面组件必须是默认导出(export default),否则无法被识别为路由页面。


2.2 动态路由 [id].js

动态路由用于匹配路径参数,比如博客文章、产品详情页等。

目录结构:

bash 复制代码
pages/
└── blog/
    └── [id].js     // 匹配任意 blog/:id

访问路径示例:

  • /blog/hello-world
  • /blog/123

示例代码:pages/blog/[id].js

jsx 复制代码
import { useRouter } from 'next/router';

export default function BlogPost() {
  const router = useRouter();
  const { id } = router.query;

  return <h1>当前文章 ID:{id}</h1>;
}

📝 参数 id 来自路由路径,会通过 router.query.id 访问到。


2.3 Catch-all 路由 [...slug].js

Catch-all 路由 能捕捉多个段路径,常用于构建类似文档、分类等不定深度的路由。

目录结构:

bash 复制代码
pages/
└── docs/
    └── [...slug].js   // 匹配 docs/* 多级路径

匹配示例:

  • /docs/guide
  • /docs/api/v1/get-user
  • /docs/a/b/c

示例代码:

jsx 复制代码
import { useRouter } from 'next/router';

export default function DocsPage() {
  const router = useRouter();
  const { slug } = router.query;

  return (
    <>
      <h1>文档路径:</h1>
      <pre>{JSON.stringify(slug, null, 2)}</pre>
    </>
  );
}

slug 是数组类型,比如访问 /docs/a/b,值为 ['a', 'b']


2.4 嵌套路由与页面导航 <Link>useRouter()

Next.js 支持目录嵌套,自动生成嵌套路由:

目录结构:

bash 复制代码
pages/
└── user/
    ├── index.js      // /user
    └── profile.js    // /user/profile

页面跳转方式 1:<Link>(推荐)

jsx 复制代码
import Link from 'next/link';

export default function Home() {
  return (
    <nav>
      <Link href="/about">关于我们</Link>
      <Link href="/user/profile">用户中心</Link>
    </nav>
  );
}

Link 组件内部可以是任意元素,不局限于 <a> 标签。

页面跳转方式 2:useRouter().push()

jsx 复制代码
import { useRouter } from 'next/router';

export default function RedirectButton() {
  const router = useRouter();

  const goToProfile = () => {
    router.push('/user/profile');
  };

  return <button onClick={goToProfile}>跳转到用户中心</button>;
}

2.5 页面传参方式(query、params)

✅ 场景一:路径参数(动态路由)

路径如 /post/123,文件为 [id].js,可通过:

js 复制代码
const { id } = useRouter().query;

✅ 场景二:查询参数(search string)

路径如 /search?keyword=nextjs&page=2

可以通过:

js 复制代码
const router = useRouter();
console.log(router.query); // { keyword: 'nextjs', page: '2' }

✅ 场景三:服务端获取参数

使用 getServerSideProps 时也可以获取:

js 复制代码
export async function getServerSideProps(context) {
  const { id } = context.params;      // 动态路径参数
  const { keyword } = context.query;  // 查询字符串

  return { props: { id, keyword } };
}

✅ 小结

功能 方法/技巧
静态页面路由 pages/*.js 自动生成
动态路径参数 [id].js, useRouter().query.id
多层路径参数 [...slug].js, 捕获路径数组
页面跳转 <Link href=""> / router.push()
获取参数 router.query / getServerSideProps
相关推荐
其美杰布-富贵-李13 分钟前
第 6 篇:相机与 OrbitControls
前端·javascript·three.js
lichenyang45317 分钟前
从图片生成任务到用户隔离:AIGC Creative Studio 后端与 PostgreSQL 建模实践
前端·后端
小黑技术栈1 小时前
关于前端的一些话
前端
阿黎梨梨1 小时前
从“能用”到“好维护”:React + TypeScript 实战指南
react.js
无人生还1 小时前
从 Vue3 到 React · 快速上手系列第 11 篇:状态管理
前端·vue.js·react.js
GuWenyue1 小时前
90%前端写React TS都踩坑!一套父子组件+Hooks完整实战,彻底搞懂类型约束
前端·react.js
Hilaku1 小时前
当 AI 一天写完一周的代码,我们还剩什么优势?
前端·javascript·程序员
尘世中一位迷途小书童2 小时前
无人机航线里的云台角度怎么调?Cesium 做了个视锥 + 鹰眼联动
前端·javascript·数据可视化
张元清2 小时前
React useMeasure Hook:用 ResizeObserver 测量 DOM 元素 (2026)
javascript·react.js
思码梁田2 小时前
CSS display 属性:从元素类型转换到隐藏元素的实用指南
前端·css·display·inline·block·none·inline-block