【问题标题】:Show and hide sub menu using React Hooks使用 React Hooks 显示和隐藏子菜单
【发布时间】:2019-10-13 08:21:39
【问题描述】:

我正在尝试使用 React Hooks 重做我的菜单,这是我最近的尝试。

我遇到的唯一问题是,当我单击sub-menu-click 时,所有子菜单都会打开。

我怎样才能使它在单击父项(即第 1 项)时仅打开子项?

谢谢。

import React, { useState } from 'react';

export default () => {
    const [menuOpen, setMenuOpen] = useState(false);
    const [subMenuOpen, setSubMenuOpen] = useState(false);
    const toggleClassName = menuOpen ? 'is-open' : '';

    const data = useStaticQuery(graphql`
        query {
            site {
                siteMetadata {
                    title
                }
            }
        }
    `);
    return (
        <Layout>
            <Menu>
                <div class="menu-left">
                    <Link to="/">{data.site.siteMetadata.title}</Link>
                </div>
                <Hamburger
                    className={toggleClassName}
                    onClick={() => setMenuOpen(!menuOpen)}
                >
                    <span></span>
                    <span></span>
                    <span></span>
                </Hamburger>
                <div class="menu-right">
                    <ul className={toggleClassName}>
                        <li class="menu-item has-children">
                            <Link to="/">
                                Item 1
                            </Link>
                            <div
                                class={`sub-menu-click`}
                                onClick={() => setSubMenuOpen(!subMenuOpen)}
                            >
                                <span></span>
                            </div>
                            <ul
                                class={`sub-menu && ${
                                    subMenuOpen ? 'is-open' : ''
                                }`}
                            >
                                <li class="menu-item">Sub-Item 1</li>
                                <li class="menu-item">Sub-Item 2</li>
                                <li class="menu-item">Sub-Item 3</li>
                            </ul>
                        </li>
                        <li class="menu-item has-children">
                            <Link to="/">
                                Item 2
                            </Link>
                            <div
                                class={`sub-menu-click`}
                                onClick={() => setSubMenuOpen(!subMenuOpen)}
                            >
                                <span
                                    class={`${subMenuOpen ? 'is-open' : ''}`}
                                ></span>
                            </div>
                            <ul
                                class={`sub-menu && ${
                                    subMenuOpen ? 'is-open' : ''
                                }`}
                            >
                                <li class="menu-item">Sub-Item 1</li>
                                <li class="menu-item">Sub-Item 2</li>
                                <li class="menu-item">Sub-Item 3</li>
                            </ul>
                        </li>
                    </ul>
                </div>
            </Menu>
        </Layout>
    );
};

【问题讨论】:

    标签: reactjs react-hooks


    【解决方案1】:

    最简单的解决方案是将SubMenu 移动到不同的组件并让它拥有自己的状态。

    const SubMenu = () => {
      const [subMenuOpen, setSubMenuOpen] = useState(false);
      return (
        <li class="menu-item has-children">
         <Link to="/">
              Item 1
         </Link>
         <div
            class={`sub-menu-click`}
            onClick={() => setSubMenuOpen(!subMenuOpen)}
          >
              <span></span>
          </div>
          <ul
              class={`sub-menu && ${
                  subMenuOpen ? 'is-open' : ''
              }`}
          >
              <li class="menu-item">Sub-Item 1</li>
              <li class="menu-item">Sub-Item 2</li>
              <li class="menu-item">Sub-Item 3</li>
          </ul>
      </li>
      )
    }
    

    并在 Menu 组件中为 SubMenu 渲染该组件。

    如果您需要从 Menu 组件控制 SubMenu 的打开,您有一个当前打开的 subMenuId 数组或根据您的用例的单个 ID。

    【讨论】:

    • 是的,实际上这就是我所做的``` const [subMenuOpen, setSubMenuOpen] = useState(false); const [subMenuOpen2, setSubMenuOpen2] = useState(false);``` 只是不确定它是否正确。
    • 这只是为您拥有的每个子菜单创建一个子菜单状态,当您根据需要添加/删除子菜单时会变得很痛苦。有一个单独的组件有什么问题?
    • 不,没有任何问题。我只是说明我在此处发布之前所做的事情。我会试试你的建议。谢谢。
    猜你喜欢
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2013-10-31
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    相关资源
    最近更新 更多