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

Next.js项目点击移动端汉堡菜单链接后菜单未自动关闭如何解决

问题核心原因

控制菜单开合的isOpen状态仅在点击汉堡图标时触发变更,点击菜单项触发Next.js客户端导航时没有同步修改菜单状态,也没有清除body上的navbar-mobile类,因此菜单始终保持打开状态。

第一步:改造MobileMenu组件,接收导航回调

给MobileMenu新增onNavigate入参,点击菜单项时触发该回调执行关闭逻辑:

// 新增onNavigate入参
const MobileMenu = ({ onNavigate }) =>  {
  const navigation = [
    { link: '/applications', text: 'Applications' },
    { link: '/multi-media', text: 'Media' },
    { link: '/websites', text: 'Websites' },
    { link: '/mobile-apps', text: 'Mobile' },
    { link: '/support', text: 'Support' },
    { link: '/contact', text: 'Contact' },
    { link: '/', text: 'Login' },
  ];
  return (
      <NavMenuContainer>
        <NavList>
        <div className="flex pb-4 lg:px-6 lg:hidden">
        <Searchbar id="mobile-search" />
      </div>
          {navigation.map(nav => (
            <NavLink key={nav.text}>
              <Link href={nav.link}>
                {/* 点击导航时触发回调关闭菜单 */}
                <a onClick={onNavigate}>
                  {nav.text}
                </a>
              </Link>
            </NavLink>
          ))}
        </NavList>
        </NavMenuContainer>
  );
};
export default MobileMenu

第二步:改造HamburgerMenu组件,新增关闭逻辑并传递回调

拆分单独的关闭菜单方法,传递给MobileMenu组件:

export default function HamburgerMenu(props) {
  const [isOpen, setOpen] = useState(false);
  // 新增单独的关闭菜单方法
  const closeMenu = () => {
    document.body.classList.remove("navbar-mobile");
    setOpen(false);
  };
  const toggleMenu = () => {
    let dd = document.body;
    dd.classList.toggle("navbar-mobile");
    setOpen(!isOpen);
  };
  return (
    <Theburger>
      <HamburgerMenuContainer>
        <MenuToggle toggle={toggleMenu} isOpen={isOpen} />
        <MenuContainer
          initial={false}
          animate={isOpen ? "open" : "closed"}
          variants={menuVariants}
          transition={menuTransition}
        >
          <ContentContainer>
            {/* 传递关闭回调给MobileMenu */}
            <MobileMenu isOpen={isOpen} onNavigate={closeMenu} />
         </ContentContainer>
        </MenuContainer>
      </HamburgerMenuContainer>
    </Theburger>
  );
}

注意:如果你的自定义组件NavLink有阻止事件冒泡的配置,需要确保onClick事件能正常传递到内部的a标签,否则回调不会触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:09:01