我想在react中监听bootstrap modal close事件,因为我在modal中有一个表单,并且想在modal close时清除字段。我知道如何在这样的jquery中做到这一点,
$('#modal-form').on('hidden.bs.modal', fnClearForm);
但是在这里我想在组件中绑定一个函数。
注意:我不能使用react-bootstrap。 这类似于question,但不能解决我的问题。
这是我的组成部分
class MyModal extends Component {
clearForm = () => {
-- code here --
}
render() {
return (
<div className="modal right fade" id="add-user-modal" role="dialog">
<div className="modal-dialog" role="document">
<div className="modal-content">
-- form goes here --
</div>
</div>
</div>
)
}
这是我打开模式的方式,
<a className="btn" data-toggle="modal" data-target="#add-user-modal">..</a>
答案 0 :(得分:1)
恕我直言,由于您不能将react软件包用于引导,而只能使用CDN。
我认为没有准确的方法来监听模态的结束。 另一件事是,几乎没有办法关闭boostrap模式。 (Escape键,单击背景也会关闭模式。)
我能想到的最好的方法是每次打开表格时都要清除它。
我们可能无法收听模态的关闭,但至少可以知道何时将其打开。
这是我制作的示例代码段
提琴:https://jsfiddle.net/keysl183/69z2wepo/318595/
class MyModal extends React.Component {
constructor(props){
super(props);
this.handleOnChange = this.handleOnChange.bind(this);
this.state= {
testInput:""
}
}
handleOnChange(e){
this.setState({
[e.target.name] : e.target.value
})
}
ClearForm =() =>{
this.setState({testInput:""});
}
render() {
return (
<div className="modal right fade" id="add-user-modal" role="dialog">
<div className="modal-dialog" role="document">
<div className="modal-content">
Hi <br></br>
Test Modal
<input type="text" onChange={this.handleOnChange} name="testInput" value={this.state.testInput} ></input>
<br></br>
</div>
</div>
</div>
)
}
}
class Hello extends React.Component {
constructor(props){
super(props);
this.MyModal = React.createRef();
}
render() {
return <div>
<MyModal ref={this.MyModal}></MyModal>
<a onClick={()=>{this.MyModal.current.ClearForm()}}className="btn" data-toggle="modal" data-target="#add-user-modal">SHOW MODAL</a>
</div>;
}
}
ReactDOM.render(
<Hello />,
document.getElementById('container')
);
这将在每次打开模态组件时清除其输入。
此外,我发现在切换模式时更容易创建引用而不是道具。 您可以避免混乱的道具,而只需在模式组件内部声明一个函数,然后在任何地方重用它即可。
答案 1 :(得分:0)
我一直在寻找相同的东西而没有使用react-bootstrap
,但是我真的很想知道模态何时打开然后关闭(按键,单击外部或关闭),以便我可以运行this.props.onClose
功能。我终于使用MutationObserver
进行了一些修改,并将其附加到Bootstrap模态div
上。如果没有提供onClose
道具,我还会添加一个“捕获”。
state = {
isOpen: false
}
modalRef = React.createRef()
// Check if already open and handle onClose if closing
observer = new MutationObserver(mutation => {
const hasShowClass = mutation[0].target.classList.contains('show')
const { isOpen } = this.state
if(hasShowClass && !isOpen) {
this.setState({
isOpen: true
})
} else if(!hasShowClass && isOpen) {
this.props.onClose()
this.setState({
isOpen: false
})
}
})
componentDidMount() {
this.props.onClose &&
this.observer.observe(this.modalRef, {
attributes: true,
attributeFilter: ['class']
})
}
componentWillUnmount() {
this.props.onClose && this.observer.disconnect()
}
<div ref={e => this.modalRef = e} className="modal fade" id={this.props.id} tabIndex="-1" role="dialog" aria-labelledby={`user-form-modal-label`} aria-hidden="true">
</div>