0Pricing
React Academy · Lekcja

Budowanie komponentu modalnego za pomocą portali

Utwórz wielokrotnie używany modal renderowany w document.body za pomocą createPortal

Budowanie komponentu modalnego za pomocą portali to bezpłatna lekcja React Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej React Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs React Academy zawiera 4 lekcji w sumie.

Witamy

W tej lekcji zbudują Państwo wielokrotnego użytku komponent Modal, który korzysta z React.createPortal do renderowania w document.body oraz obsługuje zamykanie po kliknięciu tła i naciśnięciu klawisza Escape.

Szkielet komponentu Modal

Należy zacząć od podstawowej struktury: komponentu Modal przyjmującego właściwości `isOpen`, `onClose` i `children`. Gdy `isOpen` ma wartość false, komponent nie powinien nic renderować.
function Modal({ isOpen, onClose, children }) {
  if (!isOpen) return null;
  return createPortal(
    <div className="backdrop" onClick={onClose}>
      <div className="modal" onClick={e => e.stopPropagation()}>
        {children}
      </div>
    </div>,
    document.body
  );
}

Tło i zatrzymanie propagacji

Zewnętrzny element `backdrop` obejmuje cały ekran. Kliknięcie go wywołuje `onClose`. Wewnętrzny element `modal` wywołuje `e.stopPropagation()`, dzięki czemu kliknięcia wewnątrz modala nie propagują się do tła i nie zamykają go przypadkowo.

Zamykanie klawiszem Escape

Należy dodać `useEffect`, który nasłuchuje zdarzenia `keydown`. Gdy zostanie naciśnięty klawisz Escape, a modal jest otwarty, należy wywołać `onClose`. Podczas czyszczenia należy usunąć nasłuchiwacz.
useEffect(() => {
  if (!isOpen) return;
  const handle = (e) => { if (e.key === 'Escape') onClose(); };
  document.addEventListener('keydown', handle);
  return () => document.removeEventListener('keydown', handle);
}, [isOpen, onClose]);

Blokowanie przewijania strony

Po otwarciu modala zwykle należy uniemożliwić przewijanie strony znajdującej się pod nim. Wewnątrz `useEffect` należy dodać i usuwać `overflow: hidden` na `document.body`.
useEffect(() => {
  if (isOpen) {
    document.body.style.overflow = 'hidden';
  }
  return () => { document.body.style.overflow = ''; };
}, [isOpen]);

Podstawowy CSS modala

Tło powinno być stałą nakładką obejmującą cały ekran. Pudełko modala powinno znajdować się na środku. Minimalne rozwiązanie CSS wykorzystuje flexbox na tle do wyśrodkowania modala.
.backdrop {
  position: fixed; inset: 0;
  background: rgba(0,0,0,0.5);
  display: flex; align-items: center; justify-content: center;
  z-index: 1000;
}
.modal {
  background: white;
  border-radius: 8px;
  padding: 24px;
  min-width: 320px;
}

Używanie modala

Modalem należy sterować za pomocą zmiennej stanu typu boolean w komponencie nadrzędnym. Do komponentu Modal należy przekazać właściwości `isOpen` i `onClose`. Dowolną zawartość należy umieścić jako children.
function App() {
  const [open, setOpen] = useState(false);
  return (
    <>
      <button onClick={() => setOpen(true)}>Open Modal</button>
      <Modal isOpen={open} onClose={() => setOpen(false)}>
        <h2>Hello from the modal!</h2>
        <button onClick={() => setOpen(false)}>Close</button>
      </Modal>
    </>
  );
}

Dodawanie przycisku zamykania wewnątrz

W modalu zawsze należy umieścić wyraźny przycisk zamykania dla użytkowników, którzy nie mogą korzystać z klawiatury lub nie zauważą tła. `onClose` należy przekazać do zawartości za pomocą children lub właściwości.

Animacja za pomocą przejść CSS

Aby uzyskać efekt pojawiania się, zamiast zwracać null po zamknięciu, należy zawsze renderować portal, ale przełączać klasę CSS. Na tle należy użyć przejścia CSS właściwości `opacity` i `transform`.
// Toggle class based on isOpen
<div className={`backdrop ${isOpen ? 'visible' : 'hidden'}`}>

Komponowanie nagłówka i stopki modala

Modal należy podzielić na podkomponenty: `Modal.Header`, `Modal.Body`, `Modal.Footer`. Należy użyć wzorca komponentu złożonego, aby użytkownicy mogli komponować układ modala bez znajomości nazw klas.

Szybkie sprawdzenie

Dlaczego wywołujemy e.stopPropagation() w procedurze obsługi onClick wewnętrznego elementu modal?

Podsumowanie

Zbudowali Państwo Modal za pomocą createPortal: kliknięcie tła go zamyka, klawisz Escape go zamyka, przewijanie strony jest zablokowane podczas otwarcia, a stopPropagation zapobiega zamykaniu modala po kliknięciach wewnątrz.

Następny temat

Następna lekcja: **Handling Focus & Keyboard Traps in Modals** — zadbają Państwo o pozostanie fokusu wewnątrz otwartego modala, aby spełnić wymagania dostępności.

Często zadawane pytania

Czy lekcja „Budowanie komponentu modalnego za pomocą portali” jest bezpłatna?

Tak — pełny tekst „Budowanie komponentu modalnego za pomocą portali” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu React Academy, przejdź na CoddyKit PRO. Kurs React Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Budowanie komponentu modalnego za pomocą portali”?

Utwórz wielokrotnie używany modal renderowany w document.body za pomocą createPortal Ćwiczysz React Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć React Academy?

Nie wymagamy żadnego doświadczenia. React Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Budowanie komponentu modalnego za pomocą portali”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji React Academy?

Tak. Każda lekcja React Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Czym są React Portals?
  2. Budowanie komponentu modalnego za pomocą portali
  3. Obsługa fokusu i pułapek klawiatury w modalach
  4. Tooltipy i menu rozwijane za pomocą portali
← Powrót do React Academy