此问题在此处已有答案:
React setState hook from scroll event listener(5个答案)
12小时前关门了。
在我的Next js应用程序中,我创建了一个Modal。当在modal容器外单击时,这个modal会关闭。但是当用户在外面滚动时,我如何让它自己关闭呢?
Page.js
const [showTypeModal, setShowTypeModal] = useState(false);
const handleTypeModalClose = () => setShowTypeModal(false);
<TypeModal onClose={handleTypeModalClose} visible={showTypeModal} />
TypeModal.js组件
const handleOnClose = (e) => {
if (e.target.id === "container" || e.target.id === "inner") onClose();
};
if (!visible) return null;
return (
<div
id="container"
onClick={handleOnClose}
className="fixed top-44 left-0 right-0 bottom-0 bg-gray-400 bg-opacity-30 backdrop-blur-sm hidden md:flex"
>
<div id="inner" className="w-3/6" onClick={handleOnClose} />
<div className="h-[60%] w-1/5 bg-white drop-shadow-md rounded-3xl flex flex-col justify-evenly items-start overflow-auto">
{homeType.map((type) => {
return (
<div
key={type.id}
onClick={() => dispatch(addType(type.name))}
className="hover:bg-[#f0fcfb] cursor-pointer w-full h-14 pl-10 last:rounded-b-3xl first:rounded-t-3xl flex items-center"
>
{type.name}
</div>
);
})}
</div>
</div>
);
我想要的是,当用户在“容器”div中滚动时,它会关闭,而不是在“内部”div中。
我试过useEffect,但这会关闭所有卷轴。
useEffect(() => {
window.addEventListener("scroll", onClose);
return () => window.removeEventListener("scroll", onClose);
}, []);
2条答案
按热度按时间o8x7eapl1#
您可以为
container
元素设置一个ref
,并在其上设置scroll
事件,而不是整个window
。和里面的
useEffect
挂钩。tjrkku2a2#
只需将on Scroll事件添加到您的主div或任何您想要的位置,并调用setState,使modal为false。