首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当下拉菜单从按钮React.js打开后,防止再次单击按钮?

当下拉菜单从按钮React.js打开后,防止再次单击按钮?
EN

Stack Overflow用户
提问于 2022-01-17 06:25:57
回答 2查看 786关注 0票数 1

当按钮被单击时,当下拉菜单被启用时,我试图阻止该按钮再次单击。单击->按钮将打开下拉菜单。关闭菜单的唯一方法是从外部单击,而不是从按钮,即从useOnClickOutside "usehooks-ts“中关闭。只有当菜单关闭时,该按钮才能单击并打开菜单。如果有人能帮忙解决这个问题,请提前感谢。

https://codesandbox.io/s/funny-wilson-4wbj0?file=/src/App.js (这里是沙箱,但尾风npm并没有在它上工作)。

代码语言:javascript
复制
import React, { useRef, useState } from "react";
import { useOnClickOutside } from "usehooks-ts";

export const DropDownMenu = () => {
  const ref = useRef(null);
  const [showMenu, setShowMenu] = useState(false);
  const handleClick = () => setShowMenu(!showMenu);

  const handleClickOutside = () => setShowMenu(false);

  useOnClickOutside(ref, handleClickOutside);

  return (
    <div className="mt-20">
      <button
        onClick={handleClick}
        className="bg-yellow-300 ml-5 text-sm2 
        border-solid border-2 border-blue-300"
      >
        <div>Open Menu</div>
      </button>
      <div
        ref={ref}
        className={`absolute top-8  w-240 opacity-0 bg-red-200 ml-20 
          ${showMenu ? "opacity-100 visible" : ""}`}
      >
        <ul>
          <li className="">Menu Item One</li>
          <li className="">Menu Item Two</li>
          <li className="">Menu Item Three</li>
        </ul>
      </div>
    </div>
  );
};

export default DropDownMenu;
EN

回答 2

Stack Overflow用户

发布于 2022-01-17 06:34:03

在handleClick中添加条件,以检查showMenu是否为false,然后继续进行:

代码语言:javascript
复制
const handleClick = () => !showMenu && setShowMenu(!showMenu);
票数 1
EN

Stack Overflow用户

发布于 2022-06-30 15:30:23

别想太多了。只需将ref放在按钮和下拉列表的父组件上,这样它就不会检测到子组件:)

代码语言:javascript
复制
import React, { useRef, useState } from "react";
import { useOnClickOutside } from "usehooks-ts";

export const DropDownMenu = () => {
  const ref = useRef(null);
  const [showMenu, setShowMenu] = useState(false);
  const handleClick = () => setShowMenu(!showMenu);

  const handleClickOutside = () => setShowMenu(false);

  useOnClickOutside(ref, handleClickOutside);

  return (
    <div className="mt-20" ref={ref}> // Place ref here
      <button
        onClick={handleClick}
        className="bg-yellow-300 ml-5 text-sm2 
        border-solid border-2 border-blue-300"
      >
        <div>Open Menu</div>
      </button>
      <div
        className={`absolute top-8  w-240 opacity-0 bg-red-200 ml-20 
          ${showMenu ? "opacity-100 visible" : ""}`}
      >
        <ul>
          <li className="">Menu Item One</li>
          <li className="">Menu Item Two</li>
          <li className="">Menu Item Three</li>
        </ul>
      </div>
    </div>
  );
};

export default DropDownMenu;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70737298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档