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

Next.js中导航栏滚动变色功能失效问题排查求助

Next.js中导航栏滚动变色功能失效问题排查求助

大家好,我正在把项目从Vite + React迁移到Next.js,想在Navbar.jsx组件里实现滚动时改变导航栏颜色的功能,但目前这个逻辑在Next.js环境里失效了。先给大家看在Vite + React里能正常工作的代码,再对比我写的Next.js版本,麻烦帮忙看看哪里出问题了。


能正常工作的Vite + React版Navbar.jsx

// 导航链接数组,后续会用.map渲染
const navigation = [ 
  {_id:101, title: 'HOME', href: '/'},
  {_id:102, title: 'ABOUT US', href: '/AboutUs'},
  {_id:103, title: 'SHOP', href: '/Shop'},
  {_id:104, title: 'MENU', href: '/Menu'},
  {_id:105, title: 'CONTACT US', href: '/ContactUs'},
];

const Navbar = () => {
    const { pathname } = useLocation();
    const active = useLocation().pathname; // 获取当前路径
    const [colour, setColour] = useState(false); // 控制导航栏颜色的状态
    const [cartOpen, setCartOpen] = useState(false) // 控制购物车开关

    const close = () => setCartOpen(false);
    const open = () => setCartOpen(true)

    useEffect(() => {
      close();

      const changeColour = () => {
        const isHome = matchPath("/", pathname)
        const isAboutUs = matchPath("/AboutUs", pathname)
        // 省略其他页面路径的判断逻辑...

        if (isHome && window.scrollY >= 650) {
            setColour(true)
        } else if (isAboutUs && window.scrollY >= 1) {
            setColour(true)
        } 
        // 省略其他页面的判断逻辑...
      }; 
      
      // 组件挂载时先执行一次,处理页面初始就处于滚动状态的情况
      changeColour();
      window.addEventListener('scroll', changeColour);

      return () => {
        window.removeEventListener('scroll', changeColour)
      }
    }, [pathname])

return (
  <div className={`${colour ? 'navbar navbarbg' : 'navbar'}`}>
    {/* 省略组件内部其他渲染逻辑 */}
  </div>
)
}

失效的Next.js版Navbar.jsx

const navigation = [ 
  { _id:101, title: 'HOME', href: '/' },
  { _id:102, title: 'ABOUT US', href: '/about' },
  { _id:103, title: 'SHOP', href: '/shop' },
  { _id:104, title: 'MENU', href: '/menu' },
  { _id:105, title: 'CONTACT US', href: '/contact' },
];

const Navbar = () => {
  const { pathname } = usePathname();
  const [colourOnScroll, setColourOnScroll] = useState(false); // 控制导航栏颜色的状态
  const [cartOpen, setCartOpen] = useState(false) // 控制购物车开关

  const close = () => setCartOpen(false);
  const open = () => setCartOpen(true)

  // 滚动变色逻辑
  const changeColourOnScroll = () => {
    const scrollThresholds = {
      '/': 650,
      '/about': 1,
      // 省略其他页面的滚动阈值配置...
    };

    const threshold = scrollThresholds[pathname] || 0;
    if (window.scrollY >= threshold) {
      setColourOnScroll(true)
    } else {
      setColourOnScroll(false)
    }
  }

  useEffect(() => {
    close();    
    const handleScroll = () => {
      changeColourOnScroll();
    }
    changeColourOnScroll(); // 组件挂载时执行一次,处理初始滚动状态

    window.addEventListener('scroll', handleScroll);

    return () => {
      window.removeEventListener('scroll', handleScroll)
    }
  }, [pathname])
    
  return (
    <div className={`${colourOnScroll ? 'navbar navbarbg' : 'navbar'}`}>
     {/* 省略组件内部其他渲染逻辑 */}
    </div>
  )
}

我已经确认替换了路由相关的API:从React Router的useLocation换成了Next.js的usePathname(也正确从'next/navigation'导入了),但滚动时导航栏还是不会变色。有没有大佬能帮我排查下哪里写错了?

备注:内容来源于stack exchange,提问作者ryanl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 13:14:51