У меня возникли проблемы с тем, как закрыть визуализированный компонент. В настоящее время я могу открыть модальный компонент на своей первой странице, но затем я хочу закрыть его одним нажатием кнопки через компонент. Как бы я это сделал?
import React, { Component } from 'react';
import AddModal from './addmodal';
class Page extends Component {
constructor(){
super();
this.state = { isModalOpen: false };
}
...//skip
handleAdd= () =>{
this.setState({ isModalOpen: true });
}
render(){
return (
<div>
<button onClick = {this.handleAdd} > Add </button>
<AddModal isOpen = {this.state.isModalOpen} />
</div>
)
}
}
import React, { Component } from 'react';
class AddModal extends Component {
// ... skip
handleClose = () => {
this.setState({ open: false });
};
render(){
return(
<modal inOpen = {this.props.isOpen} >
<Button onClick = {this.handleClose}>
Okay
</Button>
...//skip
</modal>
)
}
}
export default AddModal;



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам нужно, чтобы ваш модальный компонент вызывал обратный вызов onClose, чтобы родитель мог его закрыть:
import React, { Component } from 'react';
import AddModal from './addmodal';
class Page extends Component {
constructor(){
super();
this.state = { isModalOpen: false };
}
...//skip
handleAdd= () =>{
this.setState({ isModalOpen: true });
}
handleClose= () =>{
this.setState({ isModalOpen: false });
}
render(){
return (
<div>
<button onClick = {this.handleAdd} > Add </button>
<AddModal isOpen = {this.state.isModalOpen} handleClose = {this.handleClose}/>
</div>
)
}
}
import React, { Component } from 'react';
class AddModal extends Component {
// ... skip
render(){
return(
<modal inOpen = {this.props.isOpen} >
<Button onClick = {this.props.handleClose}> // call to parent
Okay
</Button>
...//skip
</modal>
)
}
}
export default AddModal;
Родительский компонент будет решать, открыто ли модальное окно или нет, поэтому он владеет состоянием дочернего элемента.
Основываясь на том, что опубликовал @jsdeveloper, я думаю, вы можете избавиться от беспорядка, используя одну и ту же функцию для обработки открытия и закрытия модального окна.
Мы будем использовать функцию toggleModal, которая изменяет isModalOpen на true, когда это false, и наоборот. Он использует обратный вызов, который принимает значение предыдущего состояния isModalOpen.
toggleModal = () => {
this.setState(prevState => ({
isModalOpen: !prevState.isModalOpen
}))
}
Итак, окончательный файл должен выглядеть примерно так.
import React, { Component } from 'react';
import AddModal from './addmodal';
class Page extends Component {
constructor() {
super();
this.state = {
isModalOpen: false
};
}
// ... //skip
toggleModal = () => {
this.setState((prevState) => ({
isModalOpen: !prevState.isModalOpen
}));
};
render() {
return (
<div>
<button onClick = {this.handleAdd}> Add </button>{' '}
<AddModal
isOpen = {this.state.isModalOpen}
toggleModal = {this.toggleModal}
/>
</div>
);
}
}
import React, { Component } from 'react';
class AddModal extends Component {
// ... skip
render() {
return (
<modal inOpen = {this.props.isOpen}>
<Button onClick = {this.props.toggleModal}>Close</Button>
//... skip
</modal>
);
}
}
export default AddModal;
Не могли бы вы разместить свой код в песочнице, например repl.it/languages/reactjs, чтобы вам было легче помочь?