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
相关产品推荐
相关产品推荐

