ModalRoot

Менеджер модальных окон.

Загружается...

В качестве children принимает коллекцию ModalPage и/или ModalCard. У каждого модального окна должен быть уникальный id.

Свойство activeModal переключает между модальными окнами.

  • При смене значения свойства activeModal происходит плавный переход от одного модального окна к другому.
  • При установке activeModal как null текущее модальное окно закрывается.

ModalRoot принимает свойство onClose, которое будет вызвано с идентификатором текущего активного модального окна или карточки после смахивания вниз или нажатия на крестик или нажатия на оверлей. Приложение должно установить в качестве нового значения activeModal либо идентификатор предыдущей модалки, либо null для скрытия. Каждой конкретной ModalPage или ModalCard можно передать свой обработчик onClose, если нужно переопределить поведение.

Также при использовании ModalRoot создаётся общий ModalOverlay для переданных компонентов, чтобы избегать моргания при переключении модальных окон.

Для более удобного управления модальными окнами вы можете использовать менеджер в виде хука useModalManager

Вы можете создавать обертки для ModalPage / ModalCard, но нужно учитывать, что бизнес-логика должна либо вызываться внутри ModalPage / ModalCard, либо включаться в зависимости от контекста useModalRootContext(), т.к. ModalRoot лишь передаёт через контекст свойство activeModal, а ModalPage / ModalCard сравнивают его значение со своим id / nav – если совпадает, монтируются; иначе размонтируются.

const SomeAsyncEffect = () => {
  const [data, setData] = useState({});
  useEffect(function fetchData() {
    // Здесь логика, которая должна вызываться при показе окна
    fetch("...")
      .then((r) => r.json())
      .then(setData);
  }, []);
  return <div>{data}</div>;
};
 
const ModalPageWrapper = ({ id, ...restProps }) => {
  const { activeModal } = useModalRootContext();
 
  useEffect(
    function enableSomeEffect() {
      if (id === activeModal) {
        // Здесь логика, которая должна вызываться при показе окна
      }
    },
    [id, activeModal]
  );
 
  return (
    <ModalPage id={id} {...restProps}>
      <SomeAsyncEffect />
    </ModalPage>
  );
};
 
const App = () => {
  return (
    <ModalRoot activeModal="example-1">
      <ModalPageWrapper id="example-1" />
      {/* или */}
      <ModalPage id="example-2">
        <SomeAsyncEffect />
      </ModalPage>
    </ModalRoot>
  );
};

Если вам необходимо отключить отображение фона для конкретной модалки в ModalRoot вы можете сделать так:

<ModalRoot
  activeModal={activeModal}
  disableModalOverlay={activeModal === "modal-1"}
>
  <ModalPage id="modal-1" />
  <ModalPage id="modal-2" />
</ModalRoot>
СвойствоОписание
activeModalModalRootActiveModal

Открывает модальное окно с переданным id.

По умолчанию: -
disableCloseAnimationboolean

Отключает анимацию закрытия модалки.

По умолчанию: -
disableModalOverlayboolean

Отключает отображение и взаимодействие с фоном модалки.

По умолчанию: -
disableOpenAnimationboolean

Отключает анимацию появления .

По умолчанию: -
modalOverlayTestIdstring

data-testid для маски.

По умолчанию: -
noFocusToDialogboolean

Отключает фокус на контейнер диалогового окна при открытии.

По умолчанию: -
onCloseModalRootCallbackFunction

Будет вызвано при начале закрытия активной модалки с её id.

По умолчанию: -
onClosedModalRootCallbackFunction

Будет вызвано при окончательном закрытии активной модалки с её id.

По умолчанию: -
onOpenModalRootCallbackFunction

Будет вызвано при начале открытия активной модалки с её id.

По умолчанию: -
onOpenedModalRootCallbackFunction

Будет вызвано при окончательном открытии активной модалки с её id.

По умолчанию: -
onOverlayClosed(() => void)
По умолчанию: -
onOverlayShowed(() => void)
По умолчанию: -
usePortalboolean | HTMLElement | RefObject<HTMLElement | null> | null
По умолчанию: -