Erkundung der Herausforderungen des bedingten Renderings in benutzerdefinierten React-Komponenten
<p>Ich habe ein Problem mit dem bedingten Rendering in einer benutzerdefinierten Komponente in meiner React-Anwendung. Ich habe daran gearbeitet, eine benutzerdefinierte Komponente für bedingtes Rendering zu erstellen, die Inhalte nur dann rendert, wenn bestimmte Bedingungen erfüllt sind. Hier ist mein aktueller Code: </p>
<pre class="brush:js;toolbar:false;">import React from 'react';
Funktion ConditionalRenderComponent({ Bedingung, Kinder }) {
zurückkehren (
<div>
{Bedingung &&
</div>
);
}
Export Standard ConditionalRenderComponent;
</pre>
<p>Bei der Verwendung dieser benutzerdefinierten Komponente ist mir aufgefallen, dass der Inhalt auch dann über das Attribut <code>children</code> übergeben wird, wenn <code>condition</code> abgerufen und ausgeführt werden. Dies unterscheidet sich vom Verhalten bei der direkten Verwendung von <code>condition && </div></code>, wo die Bedingung <code>false</code> ist. Der Zugriff auf die Inhalte ist ordnungsgemäß gesperrt. </p>
<p><strong>So verwende ich benutzerdefinierte Komponenten:</strong></p>
<pre class="brush:js;toolbar:false;">import React, { useState, useEffect } from 'react';
importiere ConditionalRenderComponent aus './ConditionalRenderComponent';
Funktion App() {
const [userData, setUserData] = useState(null);
const isLoggedIn = userData !== null;
useEffect(() => {
setTimeout(() => {
setUserData({
Benutzername: 'john_doe',
E-Mail: 'john@example.com'
});
}, 1000);
}, []);
zurückkehren (
<div>
<h1>Willkommen in meiner App</h1>
<ConditionalRenderComponent beding={isLoggedIn}>
<div>
<p>Hallo, {userData.username}! </p>
<p>Ihre E-Mail: {userData.email}</p>
</div>
</ConditionalRenderComponent>
{!isLoggedIn && <p>Bitte melden Sie sich an, um auf Benutzerdaten zuzugreifen. </p>}
</div>
);
}
Standard-App exportieren;
</pre>
<p>Im obigen Beispiel ist <code>userData</code> zunächst <code>null</code> und wird später mit vom Server abgerufenen Daten gefüllt. Die Bedingung <code>isLoggedIn</code> hängt davon ab, ob <code>userData</code> </p>
<p>Obwohl die Bedingung <code>isLoggedIn</code> lautet (bevor die Daten abgerufen werden), versucht der Inhalt in <code>ConditionalRenderComponent</code> um auf <code>userData</code> zuzugreifen und diese anzuzeigen. Dies führt zu der Fehlermeldung: „TypeError: Eigenschaften von Null können nicht gelesen werden (‚Benutzername‘ wird gelesen)“. </p>
<p><strong>Vergleich zum standardmäßigen bedingten Rendering: </strong></p>
<p>Hier ist ein Vergleich des Verhaltens unter Verwendung des Standardansatzes <code>&& </div></p>
<pre class="brush:js;toolbar:false;">// Standardbedingtes Rendering
{isLoggedIn && (
<div>
<p>Hallo, {userData.username}! </p>
<p>Ihre E-Mail: {userData.email}</p>
</div>
)}
</pre>
<p>Wie im obigen Code gezeigt, blockiert die Verwendung von Standardmethoden den Zugriff auf den Wert von <code>userData</code>, wenn die Bedingung <code>false</code> ist. </p>
<p>Ich bin mir nicht sicher, warum dieser Verhaltensunterschied auftritt, wenn eine benutzerdefinierte Komponente mit dem Attribut <code>children</code> verwendet wird. Ich habe versucht, Fehler zu beheben und nach Lösungen zu suchen, habe aber noch keine klare Antwort gefunden. </p>
<p> Für Hinweise oder Vorschläge, warum dies passieren könnte und wie die benutzerdefinierte Komponente geändert werden kann, um das erwartete bedingte Rendering-Verhalten für das Attribut <code>children</code> zu erreichen, wären wir sehr dankbar. </p>
<p>Vielen Dank im Voraus für Ihre Hilfe! </p>