我使用Carbon 的 SideNav组件作为页面的树形导航控件。叶子可以active
通过isActive
布尔属性或添加来设置aria-current='page'
。如果叶子在子菜单中,则在其任何子菜单处于活动状态时扩展菜单。活动项目跟踪不是开箱即用的,它必须添加。我有两个问题:
- 实施活动项目跟踪的正确方法是什么?我可以想到两种方法:
onClick()
为每个添加一个,SideNavMenuItem
或者,正如我目前实现的那样:将一个引用数组放在一起,然后使用useEffect()
从所有类中删除活动类并将其添加到选定的类 - 当包含组件安装时(例如在页面刷新或通过书签导航到页面)时,标记活动项目的正确方法是什么。我的参考代码通过将所需的类添加到菜单项来设置活动状态,但
SideNavMenu
只有在其任何子项处于活动状态时才会打开 - 这是我无法通过参考设置的属性。
我当前的示例基于一个小的 8 项树,但我必须将其扩展到更大的规模。
const MySidebar = () => {
const menuRefs = useRef(new Array());
useEffect(() => {
const className = "bx--side-nav__link--current";
menuRefs.current.forEach(ref => {ref.classList.remove(className)})
const ref = menuRefs.current.filter((ref) => ref.baseURI === ref.href);
if (ref) {
ref[0].classList.add(className);
}
});
return (
<SideNav
className="my-nav"
isFixedNav
expanded={true}
isChildOfHeader={false}
aria-label="Side navigation"
>
<SideNavItems>
<SideNavMenuItem ref={(element) => menuRefs.current[0] = element} element={Link} to="page1">Page 1</SideNavMenuItem>
<SideNavMenuItem ref={(element) => menuRefs.current[1] = element} element={Link} to="page2">Page 2</SideNavMenuItem>
<SideNavMenu title='Some submenu'>
<SideNavMenuItem ref={(element) => menuRefs.current[2] = element} element={Link} to="page3">Page 3</SideNavMenuItem>
<SideNavMenuItem ref={(element) => menuRefs.current[3] = element} element={Link} to="page4">Page 4</SideNavMenuItem>
<SideNavMenuItem ref={(element) => menuRefs.current[4] = element} element={Link} to="page5">Page 5</SideNavMenuItem>
<SideNavMenuItem ref={(element) => menuRefs.current[5] = element} element={Link} to="page6">Page 6</SideNavMenuItem>
<SideNavMenuItem ref={(element) => menuRefs.current[6] = element} element={Link} to="page7">Page 7</SideNavMenuItem>
</SideNavMenu>
<SideNavMenuItem ref={(element) => menuRefs.current[7] = element} element={Link} to="page8">Page 8</SideNavMenuItem>
</SideNavItems>
</SideNav>
);
};