[英]React: stopPropagation() does not seem to working?
我有一个带有切换模态组件功能的页脚组件。 在模态组件中,我有一个背景包装器和嵌套在该包装器内的模态。 我已将 toggleModal 函数设置为道具并将其添加到模态的包装器中。 我不希望模态本身具有分配给它的点击功能,所以我在我的函数中使用了stopPropagation()
来停止事件冒泡,尽管这似乎不起作用。
页脚组件:
const Footer = () => {
const [showModal, setShowModal] = useState(false);
function toggleModal(e) {
e.stopPropagation();
setShowModal(!showModal);
}
return (
<div>
<button onClick={toggleModal}>Modal toggle</button>
<Modal show={showModal} toggle={toggleModal}>This is a modal</Modal>
</div>
)
}
模态组件:
const Modal = () => {
return (
<div className="modal__wrapper" onClick={props.toggle}>
<div className="modal p-3">
<div className="modal__close" onClick={props.toggle} role="button" aria-hidden="true">
X
</div>
{props.children}
</div>
</div>
)
}
阻止事件冒泡,尽管这似乎不起作用。
您的意思是事件冒泡不起作用,还是只是模态一般不起作用? 我发现了两个代码问题,修复后似乎可以使模态工作。 此外,您可能想要e.preventDefault()
的行为,但我不确定您的问题。
const Modal = (props) => {
show
prop 来显示/隐藏模态 div: props.show && <div className="modal__wrapper" onClick={props.toggle}>
要查看stopPropagation
和preventDefault
的行为差异,请尝试在按钮下方添加此radio
。 每次需要重置radio
以进行实验时,您都需要刷新页面。
<input type="radio" name="gender" value="male" onClick={toggleModal}/>
preventDefault
停止设置radio
,它阻止无线电组件的默认行为设置值。
stopPropagation
不会阻止radio
被设置,因为它只会阻止事件冒泡到父元素。 在text <input>
上防止诸如 Enter 键之类的事件影响要提交的父<form>
元素(如果需要)会很有用。
我希望这有助于解决您的问题。
这是发生的事情:
.modal
或其中的其他元素。 没有侦听器附加到元素,因此事件继续冒泡到祖先。.modal__wrapper
,它有一个点击事件的监听器。 侦听器不区分哪个元素是事件的直接目标:元素本身或其后代之一。 即使目标是包装器内的另一个元素,也会触发props.toggle()
。 侦听器停止传播。 事件停止冒泡,但无论如何都没有人在树的更高处收听它。我建议您将 ref 附加到包装器并检查事件目标是否是包装器本身。
模态组件如下所示:
const Modal = (props) => {
const wrapperRef = useRef();
const handleClick = e => {
if(e.target === wrapperRef.current) {
props.toggle(e);
}
};
return (
<div className="modal__wrapper" onClick={handleClick} ref={wrapperRef}>
<div className="modal p-3">
<div className="modal__close" onClick={props.toggle} role="button" aria-hidden="true">
X
</div>
{props.children}
</div>
</div>
);
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.