单击外部时反应关闭下拉菜单

新手上路,请多包涵

在 React 中构建自定义下拉菜单并在单击外部时尝试关闭它时遇到问题。

所以我创建了通用 HOC,所以我也可以将它用于其他场合。

我似乎遇到的问题是我不知道如何将 ref 从 hoc 传递到组件。

我一直在研究 forwardRef 和其他示例,但我无法弄清楚。

知道是否可能以及我该怎么做吗?

代码沙盒演示

import React, { useState, useRef, useEffect } from "react";

export default function withClickOutside(WrappedComponent) {
  const Component = (props) => {
    const [open, setOpen] = useState(false);

    const ref = useRef();

    useEffect(() => {
      const handleClickOutside = (event) => {
        if (!ref?.current?.contains(event.target)) {
          setOpen(false);
        }
      };
      document.addEventListener("mousedown", handleClickOutside);
    }, [ref]);

    return <WrappedComponent {...props} open={open} setOpen={setOpen} ref={ref}/>;
  };

  return Component;
}

原文由 Cristian Muscalu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 466
2 个回答

您需要处理传递的 ref 以便它实际附加到某些东西上:

 const Home = forwardRef(({ open, setOpen }, ref) => {
  console.log(open);

  return (
    <section ref={ref}>
      <h1>Feels good to be home!</h1>

      <button className="secondary" onClick={() => setOpen(!open)}>
        Dropdown Toggle
      </button>

      {open && (
        <ul>
          <li>One</li>
          <li>Two</li>
        </ul>
      )}
    </section>
  );
});

编辑 React withClickOutside(分叉)

原文由 thedude 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 React Hook 在元素外部单击时,只需遵循 5 个步骤即可关闭菜单/更改任何元素的状态

第 1 步:导入 useRef 并定义一个变量

import {useRef} from "react"

const catMenu = useRef(null)

第 2 步:使用 React Hook 进行状态更改(useState)

   const [openSlide, setopenSlide] = useState("");

第 3 步:定义一个 javascript 函数来设置状态

   const closeOpenMenus = (e)=>{
    if(catMenu.current && openSlide && !catMenu.current.contains(e.target)){
      setopenSlide(false)
    }
}

第 4 步:在文档中的任何位置添加鼠标按下时的事件侦听器

 document.addEventListener('mousedown',closeOpenMenus)

第 5 步:选择目标元素 (ref={variable_name})

 <div ref={catMenu}>... </div>

原文由 Aman Gupta 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题