【发布时间】:2021-01-31 08:37:13
【问题描述】:
我正在尝试获取一些关于如何解决问题的参考。
我无权访问我正在尝试编辑的代码库。它是一个具有内置功能的软件,我需要重写它,并且我无法将 ref 传递给我需要检测事件的组件。
我需要检测包含 ID gatsby-focus-wrapper 的组件中的点击。但在这个组件中,还有其他类为 component-wrapper 的组件。
TL;DR 所以点击应该在gatsby-focus-wrapper 类内但在component-wrapper 之外。
我正在用这个钩子检测外部事件:
export const useOnClickOutside = (ref: any, handler: any, canClickOutside = true) => {
useEffect(() => {
const listener = (event: any) => {
// Do nothing if clicking ref's element or descendent elements
if (!ref.current || ref.current.contains(event.target)) {
return;
}
handler(event);
};
const onEscape = (event: any) => {
if (event.keyCode === 27) {
handler(event);
}
};
if (canClickOutside) {
document.addEventListener('keydown', onEscape);
document.addEventListener('mousedown', listener);
document.addEventListener('touchstart', listener);
return () => {
document.removeEventListener('keydown', onEscape);
document.removeEventListener('mousedown', listener);
document.removeEventListener('touchstart', listener);
};
}
return undefined;
},
[ref, handler, canClickOutside]
);
};
但现在我面临另一个挑战。
有什么想法吗?
【问题讨论】:
-
尝试传递点击应该在外部的引用数组。
-
@evolutionxbox 引用应该传递给组件。而且我无权访问这些组件,因为我无权访问代码库。通过传递 ref 我的意思是:
<Component ref={ref} />并且不能这样做。 -
好的。那么这将使我的建议无法撤销。
标签: javascript reactjs typescript ecmascript-6