2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家
React 指针钩子:无缺陷地实现悬停、长按、双击、刮擦和点击外部区域功能
指针事件是 React 中无人撰写文章探讨的部分,因为每个人都假设这些问题早已得到解决。但事实并非如此。标准的解决方案——onMouseEnter、onClick、用于处理双击的 setTimeout、用于处理点击外部区域的窗口监听器——在演示环境中都能正常工作,但在生产环境中都会失效。当光标穿过子元素时,它们会出现闪烁。它们在触摸结束后 300 毫秒会触发 iOS 上的幽灵点击。它们会遗漏通过门户(portal)渲染的元素。它们会将一次双击计为两次单击,因为第二次单击的处理程序在第一次被取消之前就运行了。
文档对象模型(DOM)的事件模型就是如此。浏览器在移动端和桌面端提供了不同的手势处理管道,dblclick 的规范比 React 出现得更早,而 composedPath() 是将点击事件可靠地穿透阴影边界和门户的唯一方法。这些状况都不会改变。你能改变的是,是否让你应用中的每个组件都从头开始重新实现这些变通方案。
ReactUse 提供了六个小型指针钩子来弥补这些差距。本文将逐一介绍它们: naive(简单直观)版本中的缺陷、该钩子取而代之的做法,以及你实际可以用它构建的具体组件。如果你读过关于 ref 逃生舱口的文章,其中一个细节会让你感到熟悉——这些钩子大多数在内部使用 useLatest,以便即使回调函数的身份标识发生变化,监听器也能保持稳定。
为何指针事件是一片沼泽
一个两行代码的例子。一个在点击外部区域时关闭的下拉菜单:
function Dropdown() {
const [open, setOpen] = useState(false);
const ref = useRef<HTMLDivElement>(null);
useEffect(() => {
function handler(e: MouseEvent) {
if (ref.current && !ref.current.contains(e.target as Node)) {
setOpen(false);
}
}
document.addEventList
免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。