UNPKG

antd-mobile

Version:
33 lines (32 loc) • 1.67 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _rcUtil = require("rc-util"); var _react = require("react"); // 监听点击组件外部的事件 function useClickOutside(handler, ref, hasKeyboardProps = false) { const stableHandler = (0, _rcUtil.useEvent)(handler); (0, _react.useEffect)(() => { function handleClick(event) { if (!ref.current || ref.current.contains(event.target)) { return; } stableHandler(event); // 使用 ref 中的 handler } // 向前兼容逻辑: // 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); return () => { document.removeEventListener('click', handleClick, hasKeyboardProps); }; }, [ref]); // 只依赖 ref,不依赖 handler } var _default = useClickOutside; exports.default = _default;