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

ReactJS中如何为Material UI Tabs对应父div的子节点添加tabindex属性

你原来的代码出错是因为MUI Tabs组件的渲染结构是多层嵌套的,你绑定事件的tabSec容器的直接子节点并不是Tab对应的button元素,中间还嵌套了.MuiTabs-flexContainer等层级,所以直接遍历childNodes会把属性加到错误的元素上。

该需求在MUI + React的项目中完全可以实现,两种实现方案如下:

方案1:使用MUI Tab组件原生属性(最推荐)

MUI的Tab组件支持直接透传tabIndex属性到渲染生成的button元素上,你只需要根据当前选中的value动态赋值即可,完全不需要编写DOM操作逻辑:

<Tabs value={value} id="tabSec">
  <Tab
    tabIndex={value === 0 ? 0 : -1}
    label={
      <span className={value === 0 ? "active-tab" : "custom-style-on-tab"}>
        ABC
      </span>
    }
  />

  <Tab
    tabIndex={value === 1 ? 0 : -1}
    label={
      <span className={value === 1 ? "active-tab" : "custom-style-on-tab"}>
        XYZ
      </span>
    }
  />
</Tabs>

这个方案性能更优,也符合React的声明式开发规范,不会因为MUI版本调整DOM结构导致逻辑失效。

方案2:修正原有DOM操作逻辑

如果你确实需要保留自定义的键盘事件逻辑,只需要调整选择Tab按钮的选择器即可,直接匹配所有Tab对应的button元素:

const tabRoving = (element) => {
  if (!element) return;
  const handleKeydown = (e) => {
    if (e.keyCode === 13) {
      if (element.contains(document.activeElement)) {
        // 直接匹配所有Tab按钮,忽略嵌套层级
        const tabButtons = element.querySelectorAll('button[role="tab"]');
        tabButtons.forEach((btn) => {
          btn.setAttribute("tabindex", btn === document.activeElement ? "0" : "-1");
        });
      }
    }
  };
  element.addEventListener("keydown", handleKeydown);
  // 返回清理函数,避免内存泄漏
  return () => element.removeEventListener("keydown", handleKeydown);
};

useEffect(() => {
  const clearEvent = tabRoving(document.getElementById("tabSec"));
  return clearEvent;
}, []);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:45:02