当前位置: 首页 > news >正文

next.js 如何实现动态路由?

在 Next.js 12 中,动态路由和参数传递主要通过文件系统路由(File-system Routing)实现。以下是详细步骤和示例:

一、创建动态路由

  1. ‌文件命名规则‌

pages 目录下创建文件名用 [参数名].js 格式的文件,例如:

pages/posts/[id].js // 单个参数
pages/[category]/[id].js // 多段参数

  1. 匹配的 URL 示例‌
  • /posts/123id: '123'
  • /news/456category: 'news', id: '456'

二、传递参数

  1. 使用 <Link> 组件导航
import Link from 'next/link';// 传递单个参数
<Link href="/posts/123">Post 123</Link>// 传递多个参数(自动拼接 URL)
<Link href="/news/456?author=John">Post 456</Link>
  1. 编程式导航(useRouter
import { useRouter } from 'next/router';function MyComponent() {const router = useRouter();const navigate = () => {// 传递单个参数router.push('/posts/123');// 传递多个参数(URL 自动拼接)router.push({pathname: '/news/[id]',query: { id: '456', author: 'John' },});};return <button onClick={navigate}>跳转</button>;
}

三、获取参数

  1. 在页面组件中获取参数
    使用 useRouterquery 对象:
import { useRouter } from 'next/router';function Post() {const router = useRouter();const { id } = router.query; // 获取动态路由参数const { author } = router.query; // 获取查询参数(如 ?author=John)return <div>Post ID: {id}, Author: {author}</div>;
}
  1. getStaticPropsgetServerSideProps 中获取参数
    动态路由参数通过 context.params 传递:
export async function getStaticProps(context) {const { id } = context.params; // 获取动态路由参数const res = await fetch(`https://api.example.com/posts/${id}`);const post = await res.json();return { props: { post } };
}// 必须定义 getStaticPaths 来生成静态页面
export async function getStaticPaths() {return {paths: [{ params: { id: '1' } }, { params: { id: '2' } }],fallback: true, // 或 'blocking'};
}

四、高级用法

  1. 可选参数(Optional Parameters)
    使用双括号 [[...参数名]] 格式:
pages/posts/[[...slug]].js

匹配的 URL:

  • /postsslug: undefined
  • /posts/123slug: ['123']
  • /posts/123/456slug: ['123', '456']
  1. 捕获所有路径(Catch-all Routes)
    使用 [...参数名].js 格式:
pages/posts/[...slug].js

匹配的 URL:

  • /posts/123slug: ['123']
  • /posts/123/456slug: ['123', '456']

五、注意事项

  1. ‌fallback 模式‌

使用 getStaticPaths 时,若未预生成所有路径,需设置 fallback: true'blocking',并在页面处理加载状态。

  1. ‌客户端渲染与服务器渲染‌
  • 直接访问页面时(如刷新),参数会在首次渲染时存在。
  • 客户端导航时,参数可能稍后加载,需处理 router.isReady
useEffect(() => {if (router.isReady) {const { id } = router.query;}
}, [router.isReady]);
  1. 参数类型

所有参数均为字符串,需手动转换数字类型。

通过以上方法,你可以在 Next.js 12 中轻松实现动态路由、参数传递和获取。

http://www.xdnf.cn/news/43615.html

相关文章:

  • 【消息队列RocketMQ】一、RocketMQ入门核心概念与架构解析
  • Git拉分支技巧:从零开始创建并推送分支
  • 每天学一个 Linux 命令(28):ln
  • 产品经理学习过程
  • 深度剖析即梦 AI:开启创意无限的智能创作时代
  • springboot--web开发响应参数注解
  • Web前端:百度首页克隆 - 前端开发练习
  • 网络设备基础运维全攻略:华为/思科核心操作与巡检指南
  • 2.2 BackgroundWorker的使用介绍
  • Python实现对大批量Word文档进行批量自动化排版(15)
  • 数字系统与编码
  • 2020 年 7 月大学英语四级考试真题(组合卷)——解析版
  • 并发设计模式实战系列(4):线程池
  • RabbitMQ和Seata冲突吗?Seata与Spring中的事务管理冲突吗
  • Chromium 134 编译指南 Ubuntu篇:环境搭建与源码获取(一)
  • PyTorch基础笔记
  • python爬虫复习
  • 杨氏矩阵、字符串旋转、交换奇偶位,offsetof宏
  • Java发生OOM是否必然导致JVM退出
  • 30天开发操作系统 第26天 -- 为窗口移动提速
  • 如何将自己封装的组件发布到npm上:详细教程
  • 组装一台intel n95纯Linux Server服务器
  • UniFlash以串口方式烧录MSPM0G3507(无需仿真器)
  • 方案精读:数字政府智慧政务服务一网通办服务解决方案【附全文阅读】
  • 精通 Spring Cache + Redis:避坑指南与最佳实践
  • 鸿蒙ArkUI之布局实战,线性布局(Column,Row)、弹性布局(Flex)、层叠布局(Stack),详细用法
  • 【后端】【Django】Django 模型中的 `clean()` 方法详解:数据校验的最后防线
  • 【2025面试常问Java八股】AQS介绍(AbstractQueuedSynchronizer 抽象队列同步器)
  • 深入剖析 Java Web 项目序列化:方案选型与最佳实践
  • 嵌入式人工智能应用-第三章 opencv操作 5 二值化、图像缩放