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

NextJS中如何获取动态slug参数及查询历史slug名称?

NextJS 动态路由参数获取与历史Slug查询方法

一、获取嵌套动态路由中的postID参数

你的路由结构是[postID]/[title].tsx,NextJS的useRouter钩子(Pages Router)会把所有动态路由参数都放在query对象里,直接用router.query.postID就能拿到,注意要处理路由还没加载完成时query可能为undefined的情况,用可选链或者条件判断都可以。

修改后的代码示例:

import { useRouter } from 'next/router'
import React from 'react'

export default function PostDetail() {
    const router = useRouter()
    // 用可选链避免路由未加载时的报错
    const title = router.query.title
    const postID = router.query.postID

  return (
    <div>
      <p>文章ID: {postID}</p>
      <p>文章标题: {title}</p>
    </div>
  )
}

如果是用NextJS 13+的App Router,用useParams钩子会更简洁:

import { useParams } from 'next/navigation'
import React from 'react'

export default function PostDetail() {
    const params = useParams()
    const title = params.title
    const postID = params.postID

  return (
    <div>
      <p>文章ID: {postID}</p>
      <p>文章标题: {title}</p>
    </div>
  )
}

二、查询之前的Slug名称的最佳方法

1. 通过历史记录解析(Pages Router)

可以借助浏览器的history API结合router.asPath来获取上一个路径,再解析出slug,不过这种方式需要自己处理路径拆分:

import { useRouter } from 'next/router'
import { useEffect } from 'react'

export default function SomeComponent() {
    const router = useRouter()

    useEffect(() => {
        // 获取上一条历史记录的路径
        const previousPath = history.state?.back || ''
        // 拆分路径取最后一段作为slug(根据你的路由结构调整)
        const previousSlug = previousPath.split('/').pop()
        console.log('之前的slug:', previousSlug)
    }, [router.asPath])

    return <div>...</div>
}

2. 路由跳转时传递状态(推荐)

在跳转到新页面时,通过router.push的状态参数把之前的slug传过去,这样目标页面直接就能拿到,更可靠:

// 列表页跳转代码
import { useRouter } from 'next/router'

function PostList() {
    const router = useRouter()

    const goToDetail = (postID, title, previousSlug) => {
        router.push(`/${postID}/${title}`, undefined, {
            state: { previousSlug }
        })
    }

    return <button onClick={() => goToDetail(1, 'test-title', 'old-post-slug')}>查看详情</button>
}

然后在详情页获取:

import { useRouter } from 'next/router'

export default function PostDetail() {
    const router = useRouter()
    // 优先取路由状态里的slug,避免刷新后丢失
    const previousSlug = router.state?.previousSlug

    return <div>之前的slug: {previousSlug}</div>
}

3. App Router 中的实现方式(NextJS 13+)

App Router里用useRouter的state来传递和获取同样方便:

// 列表页跳转组件
import { useRouter } from 'next/navigation'

function PostList() {
    const router = useRouter()

    const goToDetail = (postID, title, previousSlug) => {
        router.push(`/${postID}/${title}`, {
            state: { previousSlug }
        })
    }

    return <button onClick={() => goToDetail(1, 'test-title', 'old-post-slug')}>查看详情</button>
}

详情页获取:

import { useRouter } from 'next/navigation'

export default function PostDetail() {
    const router = useRouter()
    const previousSlug = router.state?.previousSlug

    return <div>之前的slug: {previousSlug}</div>
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:16:11