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

Next.js Dynamic Route 直接输入URL或刷新页面失效如何解决?

问题根因

这是Next.js Pages Router的默认特性:useRouter 返回的路由对象在页面首次注水(hydrate)完成前,query 字段是空对象。直接访问URL/刷新页面时首次渲染拿不到dashboardID,只有客户端路由跳转(比如点击Link组件跳转)时,路由已经完成初始化,才能直接拿到query参数。

解决方案

方案1:等待路由初始化完成再渲染组件

判断router.isReady为true之后再传递参数,避免首次渲染传undefined导致组件失效,适配静态导出(SSG/Output: 'export')的场景:

import { useRouter } from 'next/router'

const DashboardPage = () => {
  const router = useRouter();
  // 路由未准备完成时返回加载态即可
  if (!router.isReady) return <div>加载中...</div>;

  const { dashboardID } = router.query;
  return <Dashboard dashboardID={dashboardID}/>;
}

export default DashboardPage

方案2:通过服务端渲染预取参数

如果使用SSR渲染模式,可以在getServerSideProps里直接拿到路由参数,直接传给页面组件,首次渲染就能拿到参数,无需加载态,更利于SEO:

const DashboardPage = ({ dashboardID }) => {
  return <Dashboard dashboardID={dashboardID}/>;
}

export async function getServerSideProps(context) {
  const { dashboardID } = context.params;
  return {
    props: {
      dashboardID
    }
  }
}

export default DashboardPage

注意事项

  • 请确认动态路由页面文件名符合Next.js规范:如果要匹配/dashboard/xxx格式的路径,需要在pages/dashboard目录下创建名为[dashboardID].js的文件,否则直接访问会返回404。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:54:03