如何优化函数以不收听React中无用的点击?
我有一个自定义挂钩以收听外部单击:
import {useffect,useref,useref,mutableRefobject}我从'react'
function useOnClickOutside(ref: MutableRefObject<HTMLElement | undefined>, handler: (ev: MouseEvent | TouchEvent) => void) {
useEffect(
() => {
const listener = (event: MouseEvent | TouchEvent) => {
// Do nothing if clicking ref's element or descendent elements
if (!ref.current || (event.target instanceof HTMLElement && ref.current.contains(event.target))) {
return;
}
handler(event);
};
document.addEventListener("mousedown", listener);
document.addEventListener("touchstart", listener);
return () => {
document.removeEventListener("mousedown", listener);
document.removeEventListener("touchstart", listener);
};
},
[ref, handler]
);
}
我使用它在每个页面中可用的组件中使用它,而对于处理程序,只需传递()=&gt; {setClose(true)}
如何在组件或钩子本身中优化它,以避免聆听与任何不同的无用点击。
I have a custom hook for listening to outside click:
import { useEffect, useRef, MutableRefObject } from 'react'
function useOnClickOutside(ref: MutableRefObject<HTMLElement | undefined>, handler: (ev: MouseEvent | TouchEvent) => void) {
useEffect(
() => {
const listener = (event: MouseEvent | TouchEvent) => {
// Do nothing if clicking ref's element or descendent elements
if (!ref.current || (event.target instanceof HTMLElement && ref.current.contains(event.target))) {
return;
}
handler(event);
};
document.addEventListener("mousedown", listener);
document.addEventListener("touchstart", listener);
return () => {
document.removeEventListener("mousedown", listener);
document.removeEventListener("touchstart", listener);
};
},
[ref, handler]
);
}
I am using it in the component which is available in every page and for the handler just passing ()=> {setClose(true)}
how can I optimize it either in the component or in the hook itself for avoiding to listen the useless clicks that doesn't make any difference.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论