In einer einfachen reactJS-Klasse hat this.setState() den Status nicht tatsächlich festgelegt. Ich weiß, dass es asynchron aufgerufen wird, aber selbst wenn die Komponente wieder rendert, wurde der Zustand nicht mutiert. So this.state.showModal
ist false
wenn Komponente montiert ist (wie erwartet) dann ist es true
"für immer".Warum setzt ReactJS den Status beim Aufruf von setState innerhalb von setTimeout?
hier ist ein einfaches Beispiel:
class MyComponent extends Component {
constructor (props) {
super(props)
this.state = {
showModal: false
}
this.showModal = this.showModal.bind(this)
this.hideModal = this.hideModal.bind(this)
}
showModal() {
this.setState({ showModal: true })
}
hideModal() {
this.setState({ showModal: false })
}
render() {
console.log(this.state.showModal) // Outputs true even after the hideModal() call
return (
<Components>
<div onClick={this.showModal}>
{
this.state.showModal === true
? <Modal
handles={handles}
close={this.hideModal}
/>
: '+'
}
</div>
</Components>
)
}
}
Hier ist der Modal Komponente:
setTimeout(() => this.setState({ showModal: false }), 0)
class Modal extends Component {
render() {
return (
<div className='configurator-modal'>
<button className='close' onClick={this.props.close}> x </button>
Modal
</div>
)
}
}
Aber, wenn ich die hideModal
Funktion mit einem Timeout wie folgt ersetzen
Der Zustand ist mutiert und rendere d wie beabsichtigt.
Ich frage mich nur, warum ReactJS möglicherweise intern den Status zurücksetzen oder einen Zustand von Mutation verhindern könnte?
Edit: Anrufe zu hideModal und ShowModal hinzugefügt
Sie müssen zeigen, wie Sie 'hidemodal' aufrufen? – Panther
Können Sie uns sagen, wie Sie die Methode 'hideModal' aufrufen? – vs1682
Ich habe meinen Post bearbeitet, leider habe ich versucht, den Code ein wenig zu viel zu vereinfachen. – 3Dos