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

MUI AppBar搭配next/link按钮点击异常:仅文字可触发导航

解决MUI MenuItem结合Next.js Link仅文字可导航的问题

问题核心是当前嵌套结构限制了点击区域:Link包裹MenuItem,但MenuItem内部又嵌套了独立的<a>标签,导致只有点击<a>标签区域才会触发导航,而MenuItem的点击仅执行关闭菜单的逻辑。

下面是两种可行的修改方案,都能保留Next.js Link的预加载等特性,同时让整个MenuItem区域可点击导航:

方案一:利用MUI组件的component属性(推荐)

通过给MenuItem设置component="a",结合Link的passHref属性,让MenuItem直接成为Link的载体,整个区域都会触发导航:

...
<Menu
  id="menu-appbar"
  anchorEl={anchorElNav}
  anchorOrigin={{
    vertical: "bottom",
    horizontal: "left",
  }}
  open={Boolean(anchorElNav)}
  onClose={handleCloseNavMenu}
  sx={{
    display: { xs: "block", md: "none" },
  }}
>
  <Link href="/categories" passHref>
    <MenuItem onClick={handleCloseNavMenu} component="a">
      <Typography textAlign="center">Categories</Typography>
    </MenuItem>
  </Link>
...

说明:

  • passHref让Next.js Link把href传递给内部的a标签(也就是MenuItem渲染后的a标签)
  • component="a"告诉MUI把MenuItem渲染为<a>标签,代替默认的<li>,这样整个MenuItem区域都属于可点击的导航元素
  • onClick={handleCloseNavMenu}保留关闭菜单的逻辑,点击时同时触发导航和菜单关闭

方案二:手动通过Router跳转

如果不想修改MenuItem的渲染组件,可以用Next.js的useRouter钩子手动触发导航,同时保留Link的预加载特性:

import { useRouter } from 'next/router';

// 在组件内部初始化router
const router = useRouter();

// 修改菜单部分代码
...
<Menu
  id="menu-appbar"
  anchorEl={anchorElNav}
  anchorOrigin={{
    vertical: "bottom",
    horizontal: "left",
  }}
  open={Boolean(anchorElNav)}
  onClose={handleCloseNavMenu}
  sx={{
    display: { xs: "block", md: "none" },
  }}
>
  {/* 保留Link用于预加载 */}
  <Link href="/categories" prefetch>
    <MenuItem onClick={() => {
      handleCloseNavMenu();
      router.push('/categories');
    }}>
      <Typography textAlign="center">Categories</Typography>
    </MenuItem>
  </Link>
...

说明:

  • prefetch让Next.js提前预加载目标页面资源,保留Link的核心特性
  • 点击MenuItem时先执行关闭菜单的逻辑,再通过router.push触发导航,整个MenuItem区域的点击都会生效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 00:47:20