我试图构建一个侧边栏导航菜单,并认为我会利用React中新的State钩子。我已经阅读了文档,但似乎找不到与我需要的示例相似的示例,这很简单,只需单击一下即可切换CSS类,从而依次打开和关闭菜单。
这是我尝试过的:
const SidebarMenuItem = ({ component }) => {
const [ menuActive, setMenuState ] = useState(false);
return (
<li className="p-sidebar-menu-item">
menuActive:
{ menuActive }
<button className="p-sidebar-menu-item__link" onClick={() => setMenuState(!menuActive)}>{ component.component }</button>
{ component.children && (
<ul className="p-sidebar-menu">
<li><a href={`/${component.slug}`}>Overview</a></li>
{ component.children.map((subPage, key) => (
<li key={ key }>
<a href={`/${subPage.slug}`}>{ subPage.name }</a>
</li>
))}
</ul>
)}
</li>
)
}
export default SidebarMenuItem;
有什么想法我要去哪里吗?
谢谢
答案 0 :(得分:1)
只需将className动态化即可,而不是设置
<li className="p-sidebar-menu-item">
将其转换为模板文字
<li className={`p-sidebar-menu-item`}>
,然后有条件地添加您的课程(在我的示例中为“黄色”课程)
<li className={`p-sidebar-menu-item ${menuActive ? "yellow" : ""}`}>
看看这个CodeSandbox:在这里,我刚刚添加了您的组件,并更改了className
属性的生成方式。
如果要避免使用三元运算符,则可以使用classnames module,然后将代码更新为
import c from "classnames";
...
...
...
<li className={c("p-sidebar-menu-item", {yellow: menuActive})}>
另一种干净的解决方案可以是预先生成className字符串,例如
let classes = "p-sidebar-menu-item";
if(menuActive) {
classes += " yellow";
}
<li className={classes}>
让我知道是否需要更多帮助
答案 1 :(得分:0)
我认为您只需要
const [ menuActive, setMenuState ] = useState(false);
也在代码中将setState的名称更改为setMenuState
答案 2 :(得分:0)
别忘了使用prevState,否则您可能会遇到错误。
<button
className="p-sidebar-menu-item__link"
onClick={() => setMenuState((prevMenuActive) => !prevMenuActive)}>
{component.component}
</button>