#javascript #reactjs #components #element
#javascript #reactjs #Компоненты #элемент
Вопрос:
У меня возникли проблемы с пониманием того, как закрыть отображаемый компонент. В настоящее время я могу открыть модальный компонент на своей первой странице, но затем я хочу закрыть его при нажатии кнопки через компонент. Как бы я это сделал?
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;
Комментарии:
1. Не могли бы вы опубликовать свой код в изолированной среде, такой repl.it/languages/reactjs чтобы вам было проще помогать?
Ответ №1:
Вам нужно заставить ваш модальный компонент вызывать обратный вызов 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;
Ответ №2:
Родительский компонент будет решать, открыт модал или нет, следовательно, он владеет состоянием дочернего компонента.
Основываясь на том, что опубликовал @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;