Этот код работал для меня раньше, но я не уверен, что изменилось в этом другом компоненте, я пытаюсь использовать его в.
Я пытался использовать хуки, чтобы открывать и закрывать модальные и простообычный слушатель события click, но оба раза он закрывается при нажатии в любом месте страницы.
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>
Но та же проблема с этим тоже закрывается при щелчке в любом месте, в том числе внутри модального