Wrapper-компоненты

Micromodal — это легковесная и простая в использовании библиотека для создания модальных окон на веб-страницах. Один из ключевых аспектов её функционала — возможность оборачивать модальные окна в специальные компоненты, что позволяет упростить управление их состоянием, а также повысить гибкость и масштабируемость кода. Такие компоненты принято называть wrapper-компонентами.

Основные цели использования Wrapper-компонентов

Wrapper-компоненты используются для организации модальных окон таким образом, чтобы:

  • Согласованно управлять состоянием модальных окон (открытие, закрытие, анимации).
  • Обеспечить удобное управление визуальными эффектами и анимациями для каждого окна.
  • Снизить дублирование кода, особенно в сложных интерфейсах с множеством модальных окон.

Micromodal сам по себе предоставляет минималистичный интерфейс для управления модальными окнами, но использование wrapper-компонентов позволяет более гибко подходить к организации модальных окон, особенно в крупных проектах.

Пример реализации wrapper-компонента

Для начала рассмотрим, как можно создать wrapper-компонент для модального окна с использованием Micromodal. Основная цель wrapper-компонента — это инкапсуляция логики работы с модальным окном и передача всех нужных данных в компонент.

<div class="modal micromodal-slide" id="modal-1" aria-hidden="true">
  <div class="modal__overlay" tabindex="-1">
    <div class="modal__container">
      <button class="modal__close" aria-label="Close modal" data-micromodal-close></button>
      <h2 class="modal__title">Модальное окно 1</h2>
      <p>Содержимое модального окна</p>
    </div>
  </div>
</div>
const modalWrapper = (() => {
  const modal = document.getElementById('modal-1');

  function open() {
    Micromodal.show('modal-1');
  }

  function close() {
    Micromodal.close('modal-1');
  }

  function setEventListeners() {
    const openBtn = document.querySelector('[data-modal-open]');
    const closeBtn = document.querySelector('[data-micromodal-close]');

    openBtn.addEventListener('click', open);
    closeBtn.addEventListener('click', close);
  }

  return {
    init: function () {
      setEventListeners();
    },
    open: open,
    close: close
  };
})();

modalWrapper.init();

В этом примере обертка для модального окна modalWrapper инкапсулирует работу с Micromodal. Компонент обеспечивает доступ к функциям открытия и закрытия окна, а также задает обработчики событий для кнопок. Это делает код более структурированным и позволяет легко расширять логику взаимодействия с модальными окнами.

Обработка нескольких модальных окон

Когда на странице используется несколько модальных окон, важно правильно организовать их взаимодействие. Wrapper-компоненты облегчают решение этой задачи. Вместо того чтобы напрямую работать с каждым модальным окном через идентификаторы, можно централизованно управлять ими через коллекцию компонентов.

Пример реализации для нескольких окон:

const modalWrapper = (() => {
  const modals = [
    { id: 'modal-1', openBtnSelector: '[data-modal-open-1]', closeBtnSelector: '[data-micromodal-close-1]' },
    { id: 'modal-2', openBtnSelector: '[data-modal-open-2]', closeBtnSelector: '[data-micromodal-close-2]' }
  ];

  function open(modalId) {
    Micromodal.show(modalId);
  }

  function close(modalId) {
    Micromodal.close(modalId);
  }

  function setEventListeners() {
    modals.forEach(modal => {
      const openBtn = document.querySelector(modal.openBtnSelector);
      const closeBtn = document.querySelector(modal.closeBtnSelector);

      openBtn.addEventListener('click', () => open(modal.id));
      closeBtn.addEventListener('click', () => close(modal.id));
    });
  }

  return {
    init: function () {
      setEventListeners();
    }
  };
})();

modalWrapper.init();

В этом примере создается список модальных окон с уникальными идентификаторами и соответствующими кнопками для открытия и закрытия. Каждый модальный компонент внутри modalWrapper теперь можно легко масштабировать для работы с множеством окон на одной странице.

Валидация и динамическое управление контентом

Важным преимуществом использования wrapper-компонентов является возможность динамически изменять контент модального окна перед его отображением. Это может быть полезно, если содержимое окна зависит от состояния страницы или пользовательского ввода.

Пример динамического контента:

const modalWrapper = (() => {
  const modal = document.getElementById('modal-1');
  const titleElement = modal.querySelector('.modal__title');
  const contentElement = modal.querySelector('.modal__content');

  function open(title, content) {
    titleElement.textContent = title;
    contentElement.textContent = content;
    Micromodal.show('modal-1');
  }

  function close() {
    Micromodal.close('modal-1');
  }

  function setEventListeners() {
    const openBtn = document.querySelector('[data-modal-open]');
    const closeBtn = document.querySelector('[data-micromodal-close]');

    openBtn.addEventListener('click', () => open('Новый заголовок', 'Новый текст контента'));
    closeBtn.addEventListener('click', close);
  }

  return {
    init: function () {
      setEventListeners();
    },
    open: open,
    close: close
  };
})();

modalWrapper.init();

Здесь при открытии модального окна изменяются его заголовок и содержимое на основе переданных данных. Это позволяет использовать одно модальное окно для различных целей, например, показывать пользователю различные уведомления или формы в зависимости от контекста.

Заключение

Wrapper-компоненты являются мощным инструментом для организации и управления модальными окнами в Micromodal. Они позволяют централизованно управлять состоянием нескольких окон, динамически изменять их контент и улучшать читаемость кода. Такие компоненты подходят для сложных веб-приложений, где требуется гибкость и расширяемость при работе с модальными окнами.