UNPKG

antd-mobile

Version:
31 lines (30 loc) 1.55 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = require("react"); // 监听点击组件外部的事件 function useClickOutside(handler, ref, hasKeyboardProps = false) { (0, _react.useEffect)(() => { function handleClick(event) { if (!ref.current || ref.current.contains(event.target)) { return; } handler(event); } // 向前兼容逻辑: // 1. 对于有键盘属性的 VirtualInput,在捕获阶段监听: // 这是为了确保在事件被阻止传播之前触发。比如输入框中的单个数字 click 事件会 stopPropagation, 但这里依然能捕获到 // 2. 对于无键盘属性的 VirtualInput 组件,在冒泡阶段监听: // 这种情况通常是 VirtualInput + NumberKeyboard 为兄弟关系,在以前版本中点击 NumberKeyboard **不会**触发 VirtualInput 的 blur 事件 // 原先原理:通过 NumberKeyboard 内部 onMouseDown 时 preventDefault 阻止的 VirtualInput 内原生的 blur 事件 // 新的原理:NumberKeyboard 的 Popup 默认会 stopPropagation click, 这里在冒泡阶段监听不到,不会调用 VirtualInput 的 onBlur 回调(非原生事件)。 document.addEventListener('click', handleClick, hasKeyboardProps ? true : false); return () => { document.removeEventListener('click', handleClick, hasKeyboardProps ? true : false); }; }, [handler, ref]); } var _default = useClickOutside; exports.default = _default;