navigation Navigation


Event Propagation


Event Propagation in React Portals behandelt das Verhalten von Ereignissen, die innerhalb von Portals ausgelöst werden und sich durch die DOM-Hierarchie bewegen. Das Verständnis dieses Prozesses ist entscheidend, um unerwartete Nebenwirkungen zu vermeiden und eine präzise Steuerung der Benutzerinteraktionen in Anwendungen mit Portals zu gewährleisten. Durch gezielte Handhabung von Event Propagation lassen sich komplexe UI-Elemente zuverlässig und konsistent implementieren.

Inhaltsverzeichnis

    Ein wichtiger Aspekt von Portals, der oft übersehen wird, ist die Handhabung von Events. Obwohl ein Portal seinen DOM-Inhalt an einer anderen Stelle rendert, verhält es sich in Bezug auf Event-Propagation so, als wäre es noch Teil seiner ursprünglichen React-Komponenten-Hierarchie.

    Events Bubbling von einem Portal werden durch den React-Komponentenbaum propagiert, nicht durch den DOM-Baum.

    Schauen wir uns ein Beispiel an. In diesem Beispiel werden wir ein Klick einmal von einem regulären Component im Komponentenbaum und von einem Component in einem Portal auslösen.

    Damit wir einen Einhängepunkt für unser Portal haben, ergänzen wir die index.html und fügen dort ein DIV-Element mit der ID portal-destination ein.

    index.html
    <!doctype html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8" />
        <link rel="icon" type="image/svg+xml" href="/vite.svg" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Vite + React</title>
    </head>
    
    <body>
        <div id="root"></div>
        <div id="portal-destination"></div>
        <script type="module" src="/src/main.jsx"></script>
    </body>
    
    </html>

    Im nächsten Schritt bauen legen wir eine neue Datei EventPropagationSimple.jsx an und werden darin unser Component und unser Portal erstellen.

    EventPropagationSimple.jsx
    import { createPortal } from 'react-dom';
    
    function EventPropagationSimple() {
        
        const handleClick = () => {
            console.log('Parent wurde geklickt');
        };
    
        return (
            <div className="parent" onClick={handleClick}>
                <h2>Parent Component</h2>
                <p>Klick mich, und der Event-Handler wird ausgelöst.</p>
    
                {createPortal(
                    <button>Klick mich</button>,
                    document.getElementById('portal-destination')
                )}
            </div>
        );
    
    }
    
    export default EventPropagationSimple;

    Als Resultat haben wir folgende DOM-Struktur im Browser.

    React Portals - Struktur für Event Propagation im Browser

    Wenn wir nun auf das Component <div class="parent">...</div> oder auf den Button “Klick mich” drauf klicken, wird jedes Mal ein Log in der Konsole erzeugt, also in beiden Fällen die Funktion handleClick() ausgeführt.

    React Portals - Log nach Klick auf Component und auf den Button