Я хотел бы создать компонент API для диалогового окна на основе https://github.com/reactjs/react-modal
Я хочу, чтобы компонент рендеринга реагировал с renderDOM, получал экземпляр компонента и вызывал API модального режима, это означает, например, open (), close () и т. Д.
Итак, точнее, я бы хотел работать с текущим состоянием компонента (как API работает), а не с реквизитом.
У меня есть простой базовый класс для всех модальностей:
export class BaseModal extends Modal {
constructor() {
super();
this.state = BaseModal._getInitState();
}
static get style() {
return {
content: {
top: '50%',
left: '50%',
right: 'auto',
bottom: 'auto',
marginRight: '-50%',
transform: 'translate(-50%, -50%)'
}
};
}
open() {
this.setState({isOpen: true});
}
close() {
this.setState({isOpen: false});
}
render() {
return this.state.isOpen ? (
<div className="modal modal__{this.name}">
<Modal isOpen={this.state.isOpen}
onRequestClose={this.close}
style={BaseModal.style}
contentLabel={this.getHeaderContent()}
parentSelector={BaseModal._getParentSelector}>
<button onClick={this.close}>X</button>
<div className="modal__body">
{this.getBodyContent()}
</div>
<div className="modal__footer">
{this.getFooterContent()}
</div>
</Modal>
</div>
) : null;
}
getHeaderContent() {
throw new Error("Not implement in child class.");
}
getBodyContent() {
throw new Error("Not implement in child class.");
}
getFooterContent() {
throw new Error("Not implement in child class.");
}
static _getInitState() {
let state = {};
state.isOpen = false;
}
}
Теперь у меня есть дочерний компонент:
export class RecommendTripModal extends BaseModal {
getHeaderContent() {
return "Test modal dialog";
}
getBodyContent() {
return <p>Test modal body</p>;
}
getFooterContent() {
return <p>Test modal footer</p>;
}
}
Хорошо, это хорошо, но теперь я хочу назвать что-то вроде этого:
let recommendedTripModal = ReactDOM.render(React.createElement(RecommendTripModal, null), document.querySelector("#modals"));
//open dialog
recommendedTripModal.open();
Но сейчас проблема с контекстом. Потому что this.state.isOpen
имеет контекст RecomTripModal, а состояние равно нулю. Есть ли способ, как решить эту проблему с реагировать? И это твердый путь? Или я должен создать требуемый API другим способом?
Спасибо, что уделили время!