CodeBlanks Logo Icon CodeBlanks

Olay yayılımı

Portal'da olayların yine de bileşene ulaştığını öğrenirsin.

Olay yayılımı

Portal çizim açısından farklı yerde olsa da React ağacında üst bileşeninin çocuğudur. Bu yüzden olaylar (click, change gibi) üst bileşene yayılır.

Bu davranış modal için yararlıdır: modal içindeki bir buton tıklandığında olay üst bileşene gider ve üst bileşen state'i güncelleyebilir. Portal olmasaydı olay modalın bulunduğu DOM dallarında kalırdı.

Olay yayılımını durdurmak için e.stopPropagation() kullanılır; bu, örtü tıklamasının içerik kutusuna yayılmasını önler.

stopPropagation kullanımı

Modalda içerik kutusuna tıklamak örtüyü tetiklememelidir. Bunun için içerik kutusunun tıklama işleyicisi e.stopPropagation() çağırır; böylece olay örtüye yayılmaz ve modal kapanmaz.

Ancak örtüye doğrudan tıklanırsa olay yayılır ve onClose çağrılır. Bu ayrım, kullanıcının içerikle etkileşimini bozmadan modalı kapatma kolaylığı sağlar.

Aynı desen açılır menülerde de kullanılır: menü içine tıklama kapatmaz, dışına tıklama kapatır.

Uygulama Modal stopPropagation

Aşağıdaki iskeleti tamamla. Modal bileşeni yaz; { open, onClose, children } alsın, open yanlışsa null, değilse createPortal ile bir dış <div className="modal" onClick={onClose}> ve iç <div className="content" onClick={(e) => e.stopPropagation()}>{children}</div> çizsin. Dışa aktar.

Başlangıç kodu

App.jsx
import { createPortal } from "react-dom";

// Modal bileşenini buraya yaz

Örnek çözüm

App.jsx
import { createPortal } from "react-dom";

function Modal({ open, onClose, children }) {
  if (!open) return null;
  return createPortal(
    <div className="modal" onClick={onClose}>
      <div className="content" onClick={(e) => e.stopPropagation()}>{children}</div>
    </div>,
    document.getElementById("modal-root")
  );
}

export default Modal;

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Portal olayları nereye yayılır?

  • DOM üst düğümüne
  • React üst bileşene Doğru cevap
  • Body'ye
  • Hiçbir yere

Açıklama: Portal olayları React ağacında üst bileşene yayılır.

2 Olay durdurma

Soru
function Box({ children }) {
  return <div onClick={(e) => { e.____(); handleClick(); }}>{children}</div>;
}
Cevap
function Box({ children }) {
  return <div onClick={(e) => { e.stopPropagation(); handleClick(); }}>{children}</div>;
}

Açıklama: stopPropagation olayın yukarı yayılmasını durdurur.

3 Olay yayılımı: kavramları eşleştir

Kavram Anlamı
createPortal Farklı düğüme çizer
stopPropagation Olay durdurur
React ağacı Olay yolu
onClose Kapatma işleyici

Orta seviye bölümündeki tüm dersler