反应状态挂钩-切换课程

Jam*_*ell 1 reactjs react-hooks

我试图构建一个侧边栏导航菜单,以为我会利用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;
Run Code Online (Sandbox Code Playgroud)

有什么想法我要去哪里吗?

谢谢

Nor*_*Ste 5

只需使className动态,所以不要设置

<li className="p-sidebar-menu-item">
Run Code Online (Sandbox Code Playgroud)

将其转换为模板文字

<li className={`p-sidebar-menu-item`}>
Run Code Online (Sandbox Code Playgroud)

然后有条件地添加您的课程(在我的示例中为“黄色”课程)

<li className={`p-sidebar-menu-item ${menuActive ? "yellow" : ""}`}>
Run Code Online (Sandbox Code Playgroud)

看一下此CodeSandbox:在这里,我刚刚添加了您的组件,并更改了className属性生成的方式。

如果要避免使用三元运算符,可以使用classnames模块,然后将代码更新为

import c from "classnames";
...
...
...
<li className={c("p-sidebar-menu-item", {yellow: menuActive})}>
Run Code Online (Sandbox Code Playgroud)

另一个干净的解决方案可以是预先生成className字符串,例如

let classes = "p-sidebar-menu-item";
if(menuActive) {
  classes += " yellow";
}
<li className={classes}>
Run Code Online (Sandbox Code Playgroud)

让我知道您是否需要更多帮助