我在一个单独的组件中有以下Modal(TestModal):
<Modal
title="title"
centered={true}
visible={this.props.isOpen}
okText="Close"
onOk={this.props.onClose}
>
Test
</Modal>
然后在另一个组件中,我有这样的组件:
class ModalContainer extends React.Component {
state = {
isModalOpen: false,
}
render() {
return (
<div onClick={() => this.setState({ isModalOpen: true })}>
<TestModal isOpen={this.state.isModalOpen} onClose={() => this.setState({ isModalOpen: false })} />
</div>
);
}
}
现在,当我点击容器时,isOpen属性变为true,并将其传递到Modal,然后显示它。现在,当我点击isOk按钮时,它应该关闭modal(isModalOpen = false),但什么也没发生。当我使用console.log记录isModalOpen的值时,当我点击“关闭”按钮时,它一直显示true。由于某种原因,它没有变为false。
有什么想法,如果它是一个React问题或antd的问题?
React:16.13.1和:4.1.0
2条答案
按热度按时间xt0899hw1#
发生这种情况是因为
ModalContainer
上的div
中存在onClick
处理程序。当在Modal
上单击关闭按钮时,单击事件也会冒泡到div
单击处理程序,从而将状态再次设置为true
。解决这个问题的方法是停止点击事件的冒泡。你可以尝试这样做:
以下是CodeSandbox中实现的相同解决方案。链接:https://codesandbox.io/s/ecstatic-bohr-637jo?file=/src/App.js:402-589
djmepvbi2#
这对我很有效
onCancel={(e) => { e.stopPropagation(); setIsModalOpen1(false); }}