【发布时间】:2019-07-15 04:57:34
【问题描述】:
这段代码以前对我有用,但我不确定我尝试使用它的其他组件发生了什么变化。
我尝试使用钩子打开和关闭模式,并且只是简单地点击事件侦听器,但两次点击页面上的任何位置都会关闭。
componentDidMount() {
document.addEventListener('click', this.handleOutsideClick);
}
componentWillUnmount() {
document.removeEventListener('click', this.handleOutsideClick);
}
handleOutsideClick = (e) => {
if (this.state.showInfoModal && !this.node.contains(e.target)) this.handleInfoToggle();
console.log(this.state.showInfoModal, e.target, this.node, 'clicked outside');
}
handleInfoToggle = (event) => {
const { showInfoModal } = this.state;
if (event) event.preventDefault();
this.setState({ showInfoModal: !showInfoModal });
};
renderSomething = (args) => {
return(
<span ref={(node) => { this.node = node; }}>
{something === true && <span className={styles.somethingelse}>
<HintIcon onClick={this.handleInfoToggle} /></span>}
<Modal visible={showInfoModal} onCancel={this.handleInfoToggle}>
some information to show
</Modal>
</span>
)
}
render() => {
return (
{this.renderSomething(args)}
)
}
不确定这是否足够信息。但这让我发疯。
我还尝试添加有人建议的 dontCloseModal 函数:
dontCloseModal = (e) => {
e.stopPropagation();
console.log(e);
this.setState({
showInfoModal: true
});
}
<div onClick={this.dontCloseModal}></div>
(((这将绕过<Modal/>组件)))
const refs = React.createRef(); // Setup to wrap one child
const handleClick = (event) => {
const isOutside = () => {
return !refs.current.contains(event.target);
};
if (isOutside) {
onClick();
}
};
useEffect(() => {
document.addEventListener('click', handleClick);
return function() {
document.removeEventListener('click', handleClick);
};
});
return (element, idx) => React.cloneElement(element, { ref: refs[idx] });
}
export default ClickOutside;
尝试使用这样的组件 ^^ 并添加 <ClickOutside onClick={this.closeInfoModal()}></ClickOutside>
但是同样的问题也会在点击任何地方(包括模态内部)时关闭
【问题讨论】:
-
你是从哪个库导入 Modal 的?
-
我使用了
react-modal,但这是在另一个名为的模态中使用的父模态,这是我用于模态的。我希望我说得通。问题是,它在应用程序的另一个模式中完美地工作,但这里有些不同,它在点击页面上的任意位置时关闭模式。 -
您是否考虑将
shouldCloseOnOverlayClick={false}添加到模态框,例如<Modal shouldCloseOnOverlayClick={false} />这可以防止从模态组件外部关闭模态框 -
嗨@trailblazer - 看看这个答案stackoverflow.com/a/54633645/4490712
-
@jank 谢谢!这确实解决了我的问题,但现在我无法在单击模式中的
x按钮时关闭模式:(
标签: reactjs modal-dialog