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

Next.js动态路由页面如何针对性修改公共Navbar组件样式

Next.js 动态路由页面修改公共 Navbar 样式方案

原有代码问题

  • 采用URL精确相等判断,无法匹配/Places/[id]这类带动态参数的路由路径
  • 直接读取window.location在Next.js服务端渲染阶段会报错,且空依赖的useEffect不会在路由切换时重新执行,样式无法同步更新

适配方案

根据你使用的Next.js路由模式选择对应方案:

方案1:Pages Router 适用

直接使用Next.js内置的useRouter钩子获取路由定义路径,精准匹配动态路由:

import { useRouter } from 'next/router'

const Navbar = () => {
  const router = useRouter()
  // 直接匹配路由文件定义的路径格式,无需处理动态id
  const isPlace = router.pathname === '/Places/[id]'

  return (
    <div className="fullNav" style={{opacity: isPlace ? "0.5" : "1"}}> 
      {/* 导航栏其他内容 */}
    </div>
  )
}

无需额外使用useState和useEffect,路由切换时会自动触发组件重渲染更新样式。

方案2:App Router 适用

使用usePathname钩子获取当前路径,用正则匹配动态详情页,同时排除/Places列表页:

import { usePathname } from 'next/navigation'

const Navbar = () => {
  const pathname = usePathname()
  // 正则匹配 /Places/xxx 格式的路径,仅匹配动态id详情页
  const isPlace = /^\/Places\/[^/]+$/.test(pathname)

  return (
    <div className="fullNav" style={{opacity: isPlace ? "0.5" : "1"}}> 
      {/* 导航栏其他内容 */}
    </div>
  )
}

兜底兼容方案(不推荐,仅用于临时调试)

如果你一定要沿用原有读取window.location的逻辑,只需要修改判断条件为正则匹配即可,注意要处理服务端渲染的window不存在问题:

const [isPlace, setIsPlace] = useState(false);
useEffect(() => {
  const url = window.location.href;
  // 匹配所有带id的Places详情页
  if (/\/Places\/[^/]+$/.test(url)) {
    setIsPlace(true)
  } else {
    setIsPlace(false)
  }
}, [window.location.href]);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:45:02