Я пытаюсь создать модал многократного использования, который отображается высоко в DOM (прямой потомок <body>
) и получает контент, передаваемый ему откуда угодно.
Мне нужно установить состояние модального типа с помощью события триггера (если я не пропускаю другую опцию). Redux - не вариант, так как в приложении его нет.
Моя проблема в том, что, когда я передаю компонент, содержащий содержимое, в событие триггера, он отображает только объект, но не HTML. Мне понятно, почему это так, но я не могу найти способ извлечь контент из этого объекта.
Мой модал:
import React from "react"
import PropTypes from "prop-types"
import Rodal from 'rodal'
class ApplicationModal extends React.Component {
state = {
modalIsOpen: false,
htmlContent: ""
}
componentDidMount() {
$(window).on('modalToggle', (e, content) => {
this.modalToggle(() => this.setModalContent(content))
})
}
setModalContent = (content) => {
this.setState({htmlContent: content})
}
modalToggle = (callback) => {
this.setState({modalIsOpen: !this.state.modalIsOpen}, callback())
}
modalClose = () => {
this.setState({modalIsOpen: false})
}
modalOpen = () => {
this.setState({modalIsOpen: true})
}
render () {
return (
<React.Fragment>
<Rodal visible={this.state.modalIsOpen} onClose={this.modalClose} closeOnEsc={true} className={this.props.rodalClasses}>
<div id="modal-container">
<div dangerouslySetInnerHTML={{__html: this.state.htmlContent}}></div>
</div>
</Rodal>
</React.Fragment>
);
}
}
export default ApplicationModal
Моя страница:
import React from "react"
import PropTypes from "prop-types"
class MyPage extends React.Component {
render () {
// This works
const html = `
<div className="modal-content">
<p>This is a question.</p>
<p>This is an answer.</p>
</div>
`
// This does not work
const ModalContent = () => (
<div className="modal-content">
<p>This is a question.</p>
<p>This is an answer.</p>
</div>
)
return (
<React.Fragment>
<h1>My page</h1>
{/* This works */}
<a href='javascript:void(0)' onClick={() => $(window).trigger('modalToggle', html)}>Learn more</a>
{/* This does not work */}
<a href='javascript:void(0)' onClick={() => $(window).trigger('modalToggle', <ModalContent/>)}>Learn more</a>
</React.Fragment>
);
}
}
export default MyPage
Я хотел бы иметь возможность передавать полные компоненты в событие триггера, чтобы содержимое можно было визуализировать с помощью кнопок и динамических входов.
Я совершенно не прав?
В случае, если это не очевидно, Родал - просто симпатичная модальная библиотека.