ModalRoot

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

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

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

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

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

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

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

Да, но нужно учитывать, что бизнес-логика должна либо вызываться внутри 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>
  );
};
СвойствоОписание
activeModalModalRootActiveModal

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

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

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

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

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

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

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

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

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

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

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

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

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

По умолчанию: -
usePortalboolean | HTMLElement | RefObject<HTMLElement | null> | null
По умолчанию: -