Мне нравятся модальные окна, потому что они экономят много времени, необходимого для загрузки новой вкладки. В этом посте мы узнаем, как создать потрясающий многоразовый модальный файл с помощью React с нуля.

Вот шаги для этого урока:

Что мы узнаем

  1. Создайте простую файловую структуру
  2. Используйте состояние переключения реакции, чтобы создать простое модальное окно
  3. Передача данных между компонентами с помощью свойств
  4. Предупредить пользователя о необходимости передать параметр при использовании компонента

Совет: при использовании компонентов React делитесь ими с Bit, чтобы они стали многократно используемыми строительными блоками, которые ваша команда может легко обмениваться, использовать и синхронизировать в ваших проектах. Строя из общей коробки Lego, вы строите быстрее. Попытайся:



Создание Modal компонентной структуры

Итак, сначала давайте добавим шаблонный код.

import React from "react";
export default class Modal extends React.Component {
  render() {
    return <div>Hello Modal</div>;
  }
}

Затем давайте включим Modal в главный App.

import React from "react";
import Modal from "./Component/Modal";
import "./styles.css";
class App extends React.Component {
  render() {
    return (
      <div className="App">
        <h1>Hello CodeSandbox</h1>
        <Modal />
      </div>
    );
  }
}
export default App;

Теперь введите App компонент в точку входа.

import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

Вот результат после начальной настройки.

Переключение состояния модального окна

Механизм модального окна состоит в том, чтобы показать и скрыть. Этого довольно легко добиться в реакции из-за встроенного состояния переключения.

Сначала создайте кнопку для переключения состояния.

<button  onClick={e => {
              this.showModal();
         }}
          > show Modal </button>

Теперь создайте showModal функцию

state = {
    show: false
  };
  showModal = e => {
    this.setState({
      show: true
    });
  };

Теперь примените это состояние к Modal компоненту.

<Modal show={this.state.show} />

Затем сделайте условный рендеринг из Modal с состоянием show.

Не забудьте вернуть null, если show равно false, это ничего не отображает. Визуализируйте компонент, когда show равно true.

export default class Modal extends React.Component {
  render() {
      if(!this.props.show){
          return null;
      }
    return <div>Hello Modal</div>;
  }
}

Нажмите кнопку - результат должен быть примерно таким.

Сделайте контент динамичным

Сейчас содержимое Modal жестко запрограммировано. Давайте сделаем его динамичным, передав опору.

<Modal show={this.state.show}>Message in Modal</Modal>

Замените Сообщение на {this.props.children} в компоненте Modal.

export default class Modal extends React.Component {
  render() {
    if (!this.props.show) {
      return null;
    }
    return <div>{this.props.children}</div>;
  }
}

Это отобразит все, что передается этому компоненту, что идеально подходит для динамического модального окна.

Закройте модальный

После открытия модального окна его нужно закрыть.

Давайте добавим новую кнопку закрытия.

return (
      <div>
        <div>{this.props.children}</div>
        <div>
          <button
            onClose={e => {
              this.onClose(e);
            }}
          >
            Close
          </button>
        </div>
      </div>
    );

Определите функцию onClose.

onClose = e => {
    this.props.show = false;
  };

Теперь установите состояние show на false, что заставит Modal скрываться.

Ждать! Это не работает, потому что состояние show определено в компоненте App.

Итак, передайте значение обратно компоненту приложения.

onClose = e => {
    this.props.onClose && this.props.onClose(e);
  };

Теперь передайте весь объект события обратно App компоненту, затем активируйте showModal

<Modal onClose={this.showModal} show={this.state.show}>
          Message in Modal
</Modal>

И переключите состояние show:

showModal = e => {
    this.setState({
      show: !this.state.show
    });
  };

Результат скрывает кнопку закрытия, как и ожидалось.

Стилизация модального окна

Прямо сейчас вы не видите модального тела, потому что его там нет.

Давайте создадим modal.css.

Возьмите фрагмент CSS из Codepen здесь.

Кроме того, включите JavaScript в Modal.js и добавьте класс modal в возвращаемый div и другие классы, как показано ниже.

import React from "react";
import "./modal.css";
export default class Modal extends React.Component {
  onClose = e => {
    this.props.onClose && this.props.onClose(e);
  };
  render() {
    if (!this.props.show) {
      return null;
    }
    return (
      <div class="modal" id="modal">
        <h2>Modal Window</h2>
        <div class="content">{this.props.children}</div>
        <div class="actions">
          <button class="toggle-button" onClick={this.onClose}>
            close
          </button>
        </div>
      </div>
    );
  }
}

В компоненте App добавьте к кнопке класс toggle-button.

<div className="App">
        <button
          class="toggle-button"
          id="centered-toggle-button"
          onClick={e => {
            this.showModal(e);
          }}
        >

А теперь результат! Разве это не красиво? 💅

Требовать onClose

Если компонент, вызывающий Modal, не проходит onClose, Modal не закроется, так как состояние show не имеет никакого эффекта. Чтобы исправить это, предупредите компонент о передаче onClose.

Импорт prop-types.

import PropTypes from "prop-types";

Добавьте следующее в конец файла вне класса.

Modal.propTypes = {
  onClose: PropTypes.func.isRequired,
  show: PropTypes.bool.isRequired
};

Это приводит к предупреждению, как показано ниже.

Резюме

В этом руководстве вы узнали, как реализовать простой модальный компонент, который вы создали с помощью div и использовали состояние переключения для отображения и скрытия модального окна. Мы прошли различные шаги от создания файловой структуры до стилизации нашего модального окна. Вы можете найти полный код на GitHub здесь:



Надеюсь, вам понравился этот пост, и, пожалуйста, оставьте несколько 👏 и оставьте комментарий ниже, чтобы спросить меня о чем угодно! Я всегда рад поговорить и помочь.

Учить больше