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

Material UI Menu中TextField触发nextFocus.getAttribute不是函数错误如何解决

错误原因

该报错由Material UI Menu 组件内置的焦点导航逻辑触发:Menu 默认会监听所有内部键盘事件,用于支持上下方向键切换菜单项、回车选中这类原生菜单交互。你在Menu内部放置TextField做搜索,输入内容时会更新搜索状态触发组件重渲染,此时Menu的键盘事件处理器尝试计算下一个聚焦元素时,拿到的nextFocus不是有效DOM节点,调用getAttribute方法就会抛出异常。

解决方案

可以根据你的业务场景选择以下任意一种方案修复:

方案1:最小改动,阻止搜索框键盘事件冒泡

给TextField添加onKeyDown回调,阻止事件向上传递到Menu的事件处理器,避免触发Menu的默认焦点导航逻辑,仅需修改一行代码:

<TextField
  id="input"
  label="Search"
  value={searchValue}
  onChange={handleChange}
  // 新增这行即可
  onKeyDown={e => e.stopPropagation()}
/>

该方案不需要调整现有组件结构,改完即可正常使用。

方案2:替换为Popover组件,符合组件设计规范

如果你的弹出层不需要默认的菜单方向键导航、自动聚焦菜单项能力,Popover是更适合承载自定义内容(搜索框、自定义列表)的组件,本身没有内置的菜单导航逻辑,不会触发这类逻辑冲突。
只需将原来的Menu替换为Popover,调整对应属性即可,内部内容无需修改:

// 把原来的Menu组件替换成Popover
<Popover
  id="menu-appbar"
  anchorEl={anchorEl}
  anchorOrigin={{ vertical: "bottom", horizontal: "left" }}
  open={Boolean(anchorEl)}
  elevation={2}
  onClose={handleClose}
  // 新增Popover要求的定位属性
  transformOrigin={{ vertical: 'top', horizontal: 'left' }}
>
  {/* 原有内部的MenuItem、搜索框、列表代码完全保留 */}
</Popover>

该方案后续扩展弹出层内容时,不会再遇到类似的内置逻辑冲突问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:24:04