简体   繁体   English

ReactJs - 悬停时链接下拉菜单应单独打开

[英]ReactJs - Link dropdown should open separately while hovering

I shortened the code but the logic is the same.我缩短了代码,但逻辑是一样的。

The problem is:问题是:

When I hover on "Home", the state activates for "Services" too and both of them make dropdowns open.当我在“主页”上使用 hover 时,state 也为“服务”激活,并且它们都打开了下拉菜单。 I just want that: when I hover on "Home", "Link One" and "Link Two" appear, When I hover on "Services", "Link Three" and "Link Four" appear... now, when I hover on "services", the state changes for "home" the same way, same time.我只想这样:当我在“主页”上出现 hover 时,出现“链接一”和“链接二”,当我在“服务”上出现 hover 时,出现“链接三”和“链接四”......现在,当我 ZE0542F579DF8E8132ZADE6F在“服务”上,state 以相同的方式、相同的时间更改为“家”。 and both of their dropdowns appear at the same time...并且他们的两个下拉菜单同时出现......

Have you any ideas?你有什么想法吗?

Should I create fiddle or codepen example for more clarity?为了更清楚,我应该创建小提琴或 codepen 示例吗?

const Header = () => {
 const [menuHoverActive, setMenuHoverActive] = useState(false)

 const handleHoverOnMouseEnter = () => {
    setMenuHoverActive(true)
 }

 const handleHoverOnMouseLeave = () => {
    setMenuHoverActive(false)
 }

   return (
    <nav className="">
                    <ul className="xl:inline-flex xl:flex-row xl:ml-auto xl:w-auto w-full xl:items-center items-start flex flex-col xl:h-auto">
                        <li className="relative">
                            <Link
                                onMouseEnter={handleHoverOnMouseEnter}
                                onMouseLeave={handleHoverOnMouseLeave}
                                className=""
                                to="/"
                            >
                                Home
                            </Link>
                            {menuHoverActive ? (
                                <ul className="flex bg-gray-700 flex-col xl:absolute xl:top-10">
                                    <li className="">
                                        <Link className="" to="/">
                                            Link One
                                        </Link>
                                    </li>
                                    <li className="">
                                        <Link className="" to="/">
                                            Link Two
                                        </Link>
                                    </li>
                                </ul>
                            ) : (
                                ''
                            )}
                        </li>
                        <li className="relative">
                            <Link
                                onMouseEnter={handleHoverOnMouseEnter}
                                onMouseLeave={handleHoverOnMouseLeave}
                                className=""
                                to="/"
                            >
                                Services
                            </Link>
                            {menuHoverActive ? (
                                <ul className="flex bg-gray-700 flex-col xl:absolute xl:top-10">
                                    <li className="">
                                        <Link className="" to="/">
                                            Link Three
                                        </Link>
                                    </li>
                                    <li className="">
                                        <Link className="" to="/">
                                            Link Four
                                        </Link>
                                    </li>
                                </ul>
                            ) : (
                                ''
                            )}
                        </li>
                    </ul>
                </nav>
   )

  }

In your code, you are trying to handle multiple menus hover with one Boolean variable.在您的代码中,您尝试使用一个 Boolean 变量来处理多个菜单 hover。 But that's not possible.但这是不可能的。 So look at the below solution I have managed it with an object.所以看看下面的解决方案,我用 object 管理它。

Solution:解决方案:

Used dyanamic variable to handle the hovering:使用动态变量来处理悬停:

const Header = () => {
 const [menuHoverActive, setMenuHoverActive] = useState({})

 const handleHoverOnMouseEnter = (param) => {
    setMenuHoverActive({[param]: true });
 }

 const handleHoverOnMouseLeave = (param) => {
    setMenuHoverActive({[param]: false });
 }

   return (
    <nav className="">
       <ul className="xl:inline-flex xl:flex-row xl:ml-auto xl:w-auto w-full xl:items-center items-start flex flex-col xl:h-auto">
           <li className="relative">
              <Link
                  onMouseEnter={() => handleHoverOnMouseEnter('home')}
                  onMouseLeave={() => handleHoverOnMouseLeave('home')}
                  className=""
                   to="/"
               >
                  Home
               </Link>
              
               {menuHoverActive && menuHoverActive.home ? (
                  <ul className="flex bg-gray-700 flex-col xl:absolute xl:top-10">
                      <li className="">
                         <Link className="" to="/">
                            Link One
                         </Link>
                       </li>
                       <li className="">
                          <Link className="" to="/">
                             Link Two
                          </Link>
                        </li>
                   </ul>
                ) : (
                    ''
            )}
        </li>
        <li className="relative">
           <Link
              onMouseEnter={() => handleHoverOnMouseEnter('services')}
              onMouseLeave={() => handleHoverOnMouseLeave('services')}
              className=""
              to="/"
            >
              Services
           </Link>
           {menuHoverActive && menuHoverActive.services ? (
             <ul className="flex bg-gray-700 flex-col xl:absolute xl:top-10">
                <li className="">
                   <Link className="" to="/">
                      Link Three
                   </Link>
                </li>
                <li className="">
                   <Link className="" to="/">
                      Link Four
                   </Link>
                </li>
             </ul>
          ) : (
             ''
         )}
      </li>
   </ul>
</nav> )}

Your state can hold only two possible values: true (hovering) or false (not hovering).您的 state 只能保存两个可能的值: true (悬停)或false (不悬停)。 You want to have (at least) three: 1. hovering on Home, 2. hovering on Services, and 3. not hovering on either.您想要(至少)三个:1. 悬停在 Home 上,2. 悬停在 Services 上,3. 不悬停在任何一个上。

One possible way would be to hold "home" or "services" for hovering states and, for instance, an empty string "" for not hovering on any.一种可能的方法是为悬停状态保留"home""services" ,例如,为不悬停任何状态保留一个空字符串""

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM