Я рендеринг модалов в React.
Мой index.html
выглядит следующим образом:
<div id="root"></div>
<div id="modal"></div>
И все мои модалы отображаются (через портал) как потомок .modal
.
Каждый модальный элемент имеет следующую форму:
<div class="modal-background open">
<!-- children -->
</div>
Где класс может быть modal-background open
или modal-background closed
.Весь компонент:
interface OwnProps {
children: React.ReactNode
isOpen: boolean
onExit: () => void
}
export class Modal extends React.Component<OwnProps, any> {
_exit = () => this.props.onExit();
_renderModal = () => (
<div className={`modal-background ${this.props.isOpen ? "open" : "closed"}`} onClick={this._exit}>
{this.props.children}
</div>
);
render() {
if (this.props.isOpen) {
document.body.className += " no-scroll";
} else {
document.body.classList.remove("no-scroll");
}
let elem = document.querySelector("#modal");
if (elem == null) {
console.log("Could not render modal.");
return null;
}
return ReactDOM.createPortal(this._renderModal(), elem);
}
}
И CSS выглядит так:
.modal-background {
/* Other styling - this a dark backdrop for a modal child */
background-color: rgba(0,0,0,0.2);
transition: opacity 150ms ease-out;
&.closed {
opacity: 0;
pointer-events: none;
}
&.open {
pointer-events: all;
opacity: 1;
&:hover {
cursor: pointer;
}
}
}
Так что мой модал используется как <Modal><CustomModalElement/></Modal>
.
Когда я загружаю страницу, мои модальные элементы кратковременно мигают, показывая, что они не скрыты при загрузке (но через доли секунды после этого).
Я могу это исправить, добавив display: none
и display: inherit
в css, но затем япропустить хорошие переходы.
Есть ли лучший способ сделать это?