Hier ist mein Ansatz.
import React, { useState } from 'react';
function ToggleBox({ title, children }) {
const [isOpened, setIsOpened] = useState(false);
function toggle() {
setIsOpened(wasOpened => !wasOpened);
}
return (
{title}
{isOpened && (
{children}
)}
);
}
Im obigen Code benutze ich beispielsweise:
{geöffnet && }
Dadurch wird SomeElement
nur gerendert, wenn geöffnet
wahr ist. Das funktioniert aufgrund der Art und Weise, wie JavaScript logische Bedingungen auflöst:
true && true && 2; // gibt 2 aus
true && false && 2; // gibt false aus
true && 'some string'; // gibt 'some string' aus
geöffnet && ; // gibt SomeElement aus, wenn `geöffnet` wahr ist, gibt andernfalls false aus (und false wird von React während des Renderings ignoriert)
// Vorsicht mit 'falsy'-Werten z.B.
const someValue = [];
someValue.length && // gibt 0 aus, was von React gerendert wird
// es wäre besser zu:
someValue.length > 0 && // wird nichts rendern, da wir den Wert auf boolean konvertieren
Gründe für die Verwendung dieses Ansatzes anstelle von CSS 'display: none';
- Auch wenn es 'billiger' sein könnte, ein Element mit CSS zu verstecken - in diesem Fall ist das 'versteckte' Element immer noch im React-Universum 'aktiv' (was es tatsächlich viel teurer machen könnte)
- Das bedeutet, dass wenn sich die Props des Elternelements ändern (z.B. ), selbst wenn Sie nur ein Register sehen, werden alle 5 Register neu gerendert
- Das versteckte Element kann immer noch Lebenszyklusmethoden ausführen - z.B. es kann nach jedem Update Daten vom Server abrufen, auch wenn es nicht sichtbar ist
- Das versteckte Element kann die App zum Absturz bringen, wenn es falsche Daten empfängt. Das könnte passieren, da man unsichtbare Knoten beim Aktualisieren des Zustands 'vergessen' kann
- Man kann aus Versehen einen falschen 'display'-Stil setzen, wenn man ein Element sichtbar macht - z.B. ein div ist standardmäßig 'display: flex', aber man setzt aus Versehen 'display: block' mit
display: invisible ? 'block' : 'none'
, was das Layout brechen könnte
- Das Verwenden von
someBoolean &&
ist sehr einfach zu verstehen und nachzuvollziehen, insbesondere wenn Ihre Logik im Zusammenhang mit dem Anzeigen oder Nicht-Anzeigen von etwas komplex wird
- In vielen Fällen möchten Sie den Elementzustand 'zurücksetzen', wenn es wieder erscheint. z.B. Sie möchten einen Schieberegler auf die Ausgangsposition setzen, jedes Mal wenn er angezeigt wird. (wenn dieses gewünschte Verhalten ist, den vorherigen Elementzustand zu speichern, selbst wenn er versteckt ist, was meiner Meinung nach selten ist - würde ich wahrscheinlich CSS verwenden, wenn das Merken dieses Zustands auf andere Weise kompliziert wäre)