我使用contains来确定是否在模式窗口之外发生了单击,并基于此关闭模式窗口.

问题如下:即使表单判断isFormNotEmpty的条件返回true,Click事件处理程序也总是执行else分支,记录"Loser!"我敢肯定,在这种情况下,isFormNotEmpty的价值确实是true.

const handleClickOutside: EventListener = (event) => {
        if (modalRef.current && !modalRef.current.contains(event.target as Node)) {
            if (isFormNotEmpty) {
                console.log("SUCCESS!");
                const shouldClose = window.confirm("Some form fields are not empty. Do you really want to close the modal?");
                if (shouldClose) {
                    hideModal();
                }
            } else {
                console.log("LOOSER!");
                hideModal();
            }
        }
    };
useEffect(() => {
    if (window) {
      window.addEventListener("mousedown", handleClickOutside);
      return () => {
        window.removeEventListener("mousedown", handleClickOutside);
      };
    }
  }, []);

有一个情态词

{isModalOpen && (
        <div
          className={`fixed top-0 left-0 right-0 bottom-0 flex justify-center items-center z-50 overflow-y-scroll ${
            className && className
          }`}>
          <div className="fixed top-0 left-0 right-0 bottom-0 bg-black opacity-50"></div>
          <div
            className="relative w-full max-w-2xl max-h-full tablet-max:px-5"
            ref={modalRef}>
            <div className="relative bg-white rounded-lg shadow dark:bg-whiteText">
              <div className="flex items-center justify-between p-4 border-b rounded-t dark:border-gray-600">
                {lottie && <Lottie animationData={lottie} className="w-12" />}
                <h3 className="text-xl font-semibold text-gray-900">{title}</h3>
                <button
                  type="button"
                  className="text-gray-400 bg-transparent hover:bg-primary hover:text-gray-900 rounded-lg text-sm p-1.5 ml-auto inline-flex items-center"
                  onClick={hideModal}>
                  <svg
                    aria-hidden="true"
                    className="w-5 h-5"
                    fill="currentColor"
                    viewBox="0 0 20 20"
                    xmlns="http://www.w3.org/2000/svg">
                    <path
                      fillRule="evenodd"
                      d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
                      clipRule="evenodd"></path>
                  </svg>
                  <span className="sr-only">Close modal</span>
                </button>
              </div>
              <div className="p-2 space-y-6">{children}</div>
            </div>
          </div>
        </div>
      )}

我的目标是当单击发生在其边界之外时关闭该模式,除非某些表单域不为空.

推荐答案

isFormNotEmpty添加到useEffect的依赖数组中,如下所示:

useEffect(() => {
    if (window) {
      window.addEventListener("mousedown", handleClickOutside);
      return () => {
        window.removeEventListener("mousedown", handleClickOutside);
      };
    }
}, [isFormNotEmpty]);

否则,您将始终在事件处理程序中引用初始值isFormNotEmpty,因为它在第一次渲染时注册在内存中,并且永远不会更新.

Reactjs相关问答推荐

Reaction路由的问题-在Effect使用API调用响应设置状态之前呈现页面

如何在react组件中使用formik进行验证

包装组件可以避免子组件重新渲染.?

从Microsoft Excel粘贴复制的单元格时,将Excel单元格格式(粗体、下划线、斜体)带入Reaction

有没有办法将MUI网格元素与Flex-Start对齐?

如何在中间件中获取 nextAuth 会话

PWA:注册事件侦听器不会被触发

如何测试根据 prop 更改 CSS 属性的 useEffect 钩子?

在 useSelector() 中使用 array.map() 如何导致组件在分派操作时重新渲染?

Mui DataGrid 在第二页和前一页上显示项目时出现问题

当我在 React Router Dom 中使用两个参数并直接在页面上导航时,数据获取没有发生

我收到Uncaught TypeError: props.handleSelect is not a function

带有 webpack 错误多个文件匹配路由名称的 Expo-router.无法Bundle 或部署应用程序

Redux,状态未定义

错误:无效挂钩调用.钩子只能在函数组件的主体内部调用.使用 next/router 时

为什么我在运行一些 npm react 命令时会收到这些警告?

为什么 React 会多次调用我的应用程序的某些函数?

React Hooks 表单在日志(log)中显示未定义的用户名

ClearInterval 在 React 中的 useRef 没有按预期工作

在 React 中访问作为 prop 传递的状态变量