В статье мы поговорим как можно реализовать компонент — модальное окно на Vue js, который можно переиспользовать в любом месте вашего проекта и динамически подставлять данные в компонент используя слоты.

Структура модального окна

Для начала определим структуру. Внутри модального окна будет четыре главных блока — заголовок (.modal-title), контент (.modal-content), футер (.modal-footer) и кнопка закрытия. Плюс нам понадобится обертка с затемнением на весь экран чтобы при нажатии на нее окно закрывалось. В основном компоненте модального окна мы будем использовать именованные слоты. Они позволят нам передавать блоки в основной компонент. Подробнее о слотах во Vue js можно почитать здесь.

Назовем основной компонент modal-window.vue и выглядеть он будет так:

Мы используем директиву v-show чтобы показывать и скрывать модальное окно в зависимости от значения параметра show. Подробнее о директивах тут. Так же у нас есть функция closeModal — функция меняет значение show на false и окно закрывается. Срабатывает функция при клике на кнопку закрытия модального окна и на клик по серой подложке. При добавлении обработчика события клика на элемент подложки мы использовали модификатор события self, который говорит о том, что клик будет срабатывать только на этом элементе и не будет происходить погружение события. В тэги <slot></slot> мы поместили контент, который будет отображаться по умолчанию если мы ничего не передадим в слот.

Использование модального окна с данными по умолчанию

Теперь создадим компонент app.vue и вызовем модальное окно, которое у нас получилось.

Для этого мы импортировали компонент ModalWindow в компонент App и задали ему ref="modal", чтобы в последующем мы могли обратиться к модальному окну. При нажатии на кнопку .show-modal-button выполняется функция showModal. В этой функции мы обращаемся к компоненту модального окна <modal-window></modal-window> через this.$refs.modal и меняем значение свойства show на true. У нас получился такой результат.

Модальное окно на Vue js

Передаем данные в слоты

Теперь посмотрим как мы можем переиспользовать модальное окно с  другими данными. Для этого создадим еще одну кнопку и еще одно модальное окно. После изменений компонент App будет выглядеть следующим образом.

Во втором модальном окне мы передаем в слоты с помощью тега <template> и атрибута v-slot:slotname другие данные. Таким образом блок <h3 class="modal-title">Добавить отзыв</h3> заменит блок по умолчанию, который указан в компоненте модального окна. В слот footer мы передали кнопку, при клике на которую мы можем, например, отправить данные из textarea, которую мы передали в слот body.

Добавляем анимацию

Нашему компоненту не хватает немного изящности. Для этого добавим анимацию модального окна. Вернемся к исходному компоненту и добавим специальный компонент-обертку <transiton></transition>. Дадим ему атрибут name="modal". Компонент transition отвечает за анимацию переходов добавляя классы. Эти классы мы и будем использовать для стилизации анимации. Подробнее об этих классах можно почитать по ссылке.

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

Модальное окно на Vue js - пишем компонент

Из статьи мы узнали как написать переиспользуемый компонент — модальное окно на Vue js с использованием слотов и стандартного компонента анимации.