#reactjs
#reactjs
Вопрос:
Здесь вопрос новичка. Как мне запустить компонент переключения модального параметра из родительского компонента? Я хочу, чтобы модал открывался при нажатии кнопки на родительском компоненте. Кнопка отправит форму, и как только форма будет отправлена, я хочу, чтобы модал запустился. Я пытаюсь запустить его в function handleSubmit(e)
Дочерний компонент: Modal.jsx
class ModalExample extends React.Component {
constructor(props) {
super(props);
this.state = {
modal: false
};
this.toggle = this.toggle.bind(this);
}
toggle() {
this.setState(prevState => ({
modal: !prevState.modal
}));
}
render() {
return (
<div>
<Modal isOpen={this.state.modal} toggle={this.toggle} className={this.props.className}>
<ModalHeader toggle={this.toggle}>Modal title</ModalHeader>
</Modal>
</div>
);
}
}
Путь: Parent.jsx
export default function ForgotPassword() {
function handleSubmit(e) {
e.preventDefault();
}
return (
<div className="container h-100">
<ModalExample toggle />
<button onClick={this.handleSubmit}>Open modal</button>
</div>
);
}
Комментарии:
1. вам нужно использовать ссылки
2. Не могли бы вы, пожалуйста, показать мне, что вы имеете в виду.
Ответ №1:
Ссылки можно использовать следующим образом
export default function ForgotPassword() {
function handleSubmit(e) {
e.preventDefault();
}
return (
<div className="container h-100">
<ModalExample ref={instance => { this.child = instance; }} />
<button onClick={() => { this.child.toggle(); }}>Open modal</button>
</div>
);
}
Ответ №2:
Могли бы быть способы получше, но способ, которым я это сделал, заключается в том, что я перенес функцию переключения в родительский класс и передал как функцию, так и значение состояния в modal в props.
Затем вы можете вызвать эту функцию props в своем модале, чтобы переключить его отображение, хотя это превратит ваш чистый компонент в компонент с отслеживанием состояния.
Дочерний компонент: Modal.jsx
class ModalExample extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<div>
<Modal isOpen={this.props.modal} toggle={this.props.toggle} className={this.props.className}>
<ModalHeader toggle={this.props.toggle}>Modal title</ModalHeader>
</Modal>
</div>
);
}
}
Родительский: Parent.jsx
class ForgotPassword() extends React.Component {
constructor(props) {
super(props);
this.state = {
modal: false
};
this.toggle = this.toggle.bind(this);
}
toggle() {
this.setState(prevState => ({
modal: !prevState.modal
}));
}
return (
<div className="container h-100">
<ModalExample toggle={this.toggle} modal={this.state.modal} />
<button onClick={this.handleSubmit}>Open modal</button>
</div>
);
}
Комментарии:
1. Да, я думал об этом. Это просто кажется повторяющимся. Если я использую модель в нескольких местах, я предполагаю, что лучше сохранить логику для модели в модальном компоненте.
2. Да, ответ Джибина также выглядит более чистым, я бы принял его.