gpt4 book ai didi

javascript - 使用钩子(Hook)检测 React 组件外部的点击

转载 作者:搜寻专家 更新时间:2023-10-30 20:59:37 25 4
gpt4 key购买 nike

我发现我正在跨应用程序重复使用当用户在元素外部单击时我可以隐藏它的行为。

随着钩子(Hook)的引入,我是否可以将这些东西放在钩子(Hook)中并在组件之间共享,从而节省我在每个组件中编写相同逻辑的时间?

我在一个组件中实现过一次如下。

const Dropdown = () => {
const [isDropdownVisible, setIsDropdownVisible] = useState(false);
const wrapperRef = useRef<HTMLDivElement>(null);

const handleHideDropdown = (event: KeyboardEvent) => {
if (event.key === 'Escape') {
setIsDropdownVisible(false);
}
};

const handleClickOutside = (event: Event) => {
if (
wrapperRef.current &&
!wrapperRef.current.contains(event.target as Node)
) {
setIsDropdownVisible(false);
}
};

useEffect(() => {
document.addEventListener('keydown', handleHideDropdown, true);
document.addEventListener('click', handleClickOutside, true);
return () => {
document.removeEventListener('keydown', handleHideDropdown, true);
document.removeEventListener('click', handleClickOutside, true);
};
});

return(
<DropdownWrapper ref={wrapperRef}>
<p>Dropdown</p>
</DropdownWrapper>
);
}

最佳答案

这是可能的。

您可以创建一个名为 useComponentVisible 的可重用 Hook

import { useState, useEffect, useRef } from 'react';

export default function useComponentVisible(initialIsVisible) {
const [isComponentVisible, setIsComponentVisible] = useState(initialIsVisible);
const ref = useRef<HTMLDivElement>(null);

const handleHideDropdown = (event: KeyboardEvent) => {
if (event.key === 'Escape') {
setIsComponentVisible(false);
}
};

const handleClickOutside = (event: Event) => {
if (ref.current && !ref.current.contains(event.target as Node)) {
setIsComponentVisible(false);
}
};

useEffect(() => {
document.addEventListener('keydown', handleHideDropdown, true);
document.addEventListener('click', handleClickOutside, true);
return () => {
document.removeEventListener('keydown', handleHideDropdown, true);
document.removeEventListener('click', handleClickOutside, true);
};
});

return { ref, isComponentVisible, setIsComponentVisible };
}

然后在您希望添加功能的组件中执行以下操作:

const DropDown = () => {

const { ref, isComponentVisible } = useComponentVisible(true);

return (
<div ref={ref}>
{isComponentVisible && (<p>Going into Hiding</p>)}
</div>
);

}

找一个codesandbox这里的例子。

关于javascript - 使用钩子(Hook)检测 React 组件外部的点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54560790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com