Реализация функции закрытия модального окна по клику вне его области в React — простой и эффективный способ


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

Для реализации такой функциональности в React.js можно использовать методы жизненного цикла компонента, такие как componentDidMount и componentWillUnmount. В методе componentDidMount мы можем добавить обработчик события к глобальному объекту window или document. В методе componentWillUnmount мы должны удалить этот обработчик, чтобы избежать утечки памяти.

Еще одним подходом может быть использование хука useEffect для добавления обработчика событий в компоненте. Хук useEffect выполняет код после каждого рендера компонента и предоставляет возможность выполнять действия при монтировании и размонтировании компонента. Таким образом, мы можем добавить обработчик события в хуке useEffect и удалить его при размонтировании компонента.

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

Создание модального окна в React

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

Существует несколько подходов к созданию модального окна в React. Один из самых популярных — использование портала react-dom, который позволяет создавать элементы вне основного дерева React. Это особенно полезно, когда мы хотим разместить модальное окно поверх всего контента на странице.

Для начала, мы должны импортировать необходимые зависимости:

import React, { useState } from 'react';import { createPortal } from 'react-dom';

Затем, мы создаем компонент модального окна и определяем его состояние:

const Modal = ({ children, onClose }) => {const [modalOpen, setModalOpen] = useState(true);const handleCloseModal = () => {setModalOpen(false);onClose();};return createPortal(<div className="modal"><div className="modal-content"><button onClick={handleCloseModal} className="close-button">Закрыть</button>{children}</div></div>,document.getElementById('modal-root'));};

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

Внутри компонента мы создаем состояние modalOpen, которое отвечает за открытие и закрытие модального окна. При клике на кнопку «Закрыть», мы вызываем функцию handleCloseModal, которая закрывает окно и вызывает функцию обратного вызова onClose.

Используя createPortal, мы передаем содержимое модального окна в div с идентификатором «modal-root» в DOM.

Наконец, чтобы использовать наш компонент Modal, мы можем добавить его в основной компонент:

const App = () => {const handleOpenModal = () => {// Показать модальное окно};const handleCloseModal = () => {// Закрыть модальное окно};return (<div className="app"><button onClick={handleOpenModal} className="open-modal-button">Открыть модальное окно</button><Modal onClose={handleCloseModal}><p>Содержимое модального окна</p></Modal></div>);};

В данном случае, мы создаем две функции обработчика: handleOpenModal и handleCloseModal, которые будут вызываться при открытии и закрытии модального окна соответственно. Затем мы добавляем кнопку, которая будет вызывать функцию handleOpenModal, и передаем содержимое модального окна через дочерний элемент в компонент Modal.

Теперь, когда пользователь нажимает кнопку «Открыть модальное окно», модальное окно будет отображаться на экране. При клике на кнопку «Закрыть», окно закроется и вызовется функция handleCloseModal.

Таким образом, мы смогли создать модальное окно в React, используя мощь React-компонентов и портала react-dom. Надеюсь, эта статья помогла вам понять, как создавать модальные окна в React и как создать функциональное и приятное взаимодействие с пользователем.

Добавление функционала закрытия по клику мимо модального окна

В React, существует несколько способов реализации такого функционала. Один из простых способов — это использование хука useRef и обработчика события click.

Сначала, создайте ссылку useRef для хранения ссылки на DOM-элемент модального окна:

const modalRef = useRef();

Затем, создайте обработчик события handleClickOutside для закрытия модального окна, если клик произошел вне его области:

const handleClickOutside = (event) => {if (modalRef.current && !modalRef.current.contains(event.target)) {closeModal(); // функция для закрытия модального окна}}

Для того чтобы обработчик события клика сработал, необходимо добавить его на корневой элемент веб-приложения, например, в компоненте App или в компоненте, содержащем модальное окно:

useEffect(() => {document.addEventListener("click", handleClickOutside, false);return () => {document.removeEventListener("click", handleClickOutside, false);}}, []);

В данном примере, обработчик события handleClickOutside добавляется при монтировании компонента, а также удаляется при размонтировании, чтобы избежать утечек памяти.

Наконец, присвойте ссылку useRef созданному модальному окну:

<div ref={modalRef}>... // содержимое модального окна</div>

Теперь, при клике вне модального окна, оно будет закрываться.

Использование useRef хука для получения ссылки на элемент

Для начала, необходимо импортировать useRef из библиотеки React:

import React, { useRef } from 'react';

Затем, можно создать переменную с использованием хука useRef:

const modalRef = useRef(null);

Далее, необходимо присвоить ref свойство модального окна используя созданную переменную:

<div ref={modalRef} className="modal">// Контент модального окна</div>

Для отображения и скрытия модального окна, можно использовать обработчик события:

const handleClickOutside = (event) => {if (modalRef.current && !modalRef.current.contains(event.target)) {// Здесь можно добавить логику закрытия модального окна}};

Наконец, можно применить обработчик события к document:

useEffect(() => {document.addEventListener("mousedown", handleClickOutside);return () => {document.removeEventListener("mousedown", handleClickOutside);};}, []);

В этом примере, модальное окно будет закрываться при клике мимо него. При клике на само модальное окно, оно не будет закрываться.

Использование useRef хука для получения ссылки на элемент позволяет легко отслеживать события, связанные с элементом, что может быть полезно во многих ситуациях, включая закрытие модального окна по клику мимо него.

Добавление обработчика события клика на весь документ

Чтобы реализовать закрытие модального окна по клику вне его области, необходимо добавить обработчик события клика на весь документ. Используя функциональные возможности React, можно достичь данного эффекта следующим образом:

  1. Создать новый компонент-обертку для модального окна, который будет отслеживать клики на весь документ.
  2. Импортировать и добавить хук useEffect в компонент-обертку. Установить обработчик события клика на документ внутри useEffect.
  3. В обработчике события клика проверить, является ли целевой элемент (элемент, на котором произошло событие) потомком модального окна. Если нет, то закрыть модальное окно.

Использование компонента-обертки с обработчиком события клика на весь документ позволяет легко реализовать закрытие модального окна при клике вне его области, обеспечивая удобство пользователю и улучшение пользовательского опыта в React.

Проверка, что клик произошел вне модального окна

Для проверки является ли элемент дочерним элементом модального окна можно использовать метод contains, который доступен у корневого элемента модального окна. Метод contains возвращает true, если переданный элемент является дочерним элементом, иначе — false.

Ниже приведен пример кода, который реализует данную проверку:

{`const Modal = ({ onClose }) => {const modalRef = useRef(null);useEffect(() => {const handleClickOutside = (event) => {if (modalRef.current && !modalRef.current.contains(event.target)) {onClose();}}document.addEventListener('click', handleClickOutside);return () => {document.removeEventListener('click', handleClickOutside);}}, []);return (
{/* Контент модального окна */}
 );}`}

В примере используется хук useRef для создания ссылки (modalRef) на корневой элемент модального окна. Обработчик клика (handleClickOutside) проверяет, является ли целевой элемент клика дочерним элементом модального окна с помощью метода contains. Если элемент не является дочерним элементом, вызывается функция onClose, которая закрывает модальное окно.

Чтобы обработчик клика был добавлен только один раз и удалялся после размонтирования компонента, используется хук useEffect с пустым массивом зависимостей [].

Закрытие модального окна по клику мимо него

Для начала, нам понадобится добавить обработчик события «клик» на всю веб-страницу. Для этого достаточно добавить слушатель события на сам document.

document.addEventListener('click', handleCloseModal);

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

function handleCloseModal(event) {const modal = document.getElementById('modal');const clickedInsideModal = modal.contains(event.target);if (!clickedInsideModal) {closeModal();}}

В данном примере мы используем функцию closeModal, которую вам нужно будет написать самостоятельно. Она должна закрывать модальное окно, например, скрывать его или удалить из DOM.

Для добавления обработчика события при монтирования компонента и его удаления при размонтировании, можно использовать useEffect. Передайте функцию handleCloseModal в качестве коллбэка в useEffect и добавьте обработчик события при монтировании. Также не забудьте удалить обработчик события при размонтировании компонента, чтобы избежать утечки памяти.

useEffect(() => {document.addEventListener('click', handleCloseModal);return () => {document.removeEventListener('click', handleCloseModal);};}, []);

Теперь модальное окно будет закрываться, если кликнуть мимо него. Не забудьте добавить проверку на наличие модального окна перед вызовом функции closeModal.

Добавить комментарий

Вам также может понравиться