Несколько вопросов здесь.Во-первых, отойдите от прямого манипулирования DOM
.React использует виртуальный DOM
, поэтому вам не нужно вручную добавлять или удалять DOM
элементы.React автоматически обрабатывает эту DOM
манипуляцию с помощью метода render
.Кроме того, вам нужно будет управлять этим Modal
, используя какой-то state
(isOpen).Это может быть через локальное состояние React или через состояние Redux.В любом случае, его нужно контролировать и сравнивать.Проще говоря, если он открыт, то визуализируйте Modal
, если он закрыт, то визуализируйте null
.
Кроме того, этот компонент Modal
может быть структурирован для повторного использования.Просто добавьте его как child
к другому parent
компоненту с состоянием и включите в него все, что вы хотите визуализировать children
.
Рабочий пример :
компоненты / Example.js (родительский компонент)
import React, { Component } from "react";
import Modal from "../Modal";
import "./styles.css";
class Example extends Component {
state = { isOpen: false };
handleOpenModal = () => {
this.setState({ isOpen: true });
};
handleCloseModal = () => {
this.setState({ isOpen: false });
};
render = () => (
<div className="example">
<h2>Simple Modal Example</h2>
<button
className="uk-button uk-button-primary uk-button-small"
onClick={this.handleOpenModal}
>
Open Modal
</button>
<Modal isOpen={this.state.isOpen} onCloseModal={this.handleCloseModal}>
<h1 className="title">Hello!</h1>
<p className="subtitle">There are two ways to close this modal</p>
<ul>
<li>Click outside of this modal in the grey overlay area.</li>
<li>Click the close button below.</li>
</ul>
<button
className="uk-button uk-button-danger uk-button-small"
onClick={this.handleCloseModal}
>
Close
</button>
</Modal>
</div>
);
}
export default Example;
компоненты / Modal.js (дочерний компонент - он содержит множество более мелких компонентов, которые были разделены для повторного использования и простоты понимания - они в основном простые div
с некоторыми styles
прикрепленными - см. Примечания ниже)
import React from "react";
import PropTypes from "prop-types";
import BackgroundOverlay from "../BackgroundOverlay"; // grey background
import ClickHandler from "../ClickHandler"; // handles clicks outside of the modal
import Container from "../Container"; // contains the modal and background
import Content from "../Content"; // renders the "children" placed inside of <Modal>...</Modal>
import ModalContainer from "../ModalContainer"; // places the modal in the center of the page
// this is a ternary operator (shorthand for "if/else" -- if cond ? then : else)
// below can be read like: if isOpen is true, then return/render the modal, else return null
const Modal = ({ children, isOpen, onCloseModal }) =>
isOpen ? (
<Container>
<BackgroundOverlay />
<ModalContainer>
<ClickHandler isOpen={isOpen} closeModal={onCloseModal}>
<Content>{children}</Content>
</ClickHandler>
</ModalContainer>
</Container>
) : null;
// these proptype declarations are to ensure that passed down props are
// consistent and are defined as expected
Modal.propTypes = {
children: PropTypes.node.isRequired, // children must be a React node
isOpen: PropTypes.bool.isRequired, // isOpen must be a boolean
onCloseModal: PropTypes.func.isRequired // onCloseModal must be a function
};
export default Modal;