Einführung
In diesem Lab werden wir eine schließbare Warnungskomponente (Closable Alert component) mit React erstellen. Die Komponente ermöglicht es Benutzern, eine Nachricht eines bestimmten Typs anzuzeigen und die Warnung zu schließen, wenn sie damit fertig sind. Am Ende dieses Labs haben Sie gelernt, wie Sie die Hooks useState() und useEffect() verwenden, um eine dynamische Komponente zu erstellen, die einfach an Ihre Bedürfnisse angepasst werden kann.
Schließbare Warnung (Closable Alert)
index.htmlundscript.jswurden bereits in der virtuellen Maschine (VM) bereitgestellt. Im Allgemeinen müssen Sie nur Code inscript.jsundstyle.csshinzufügen.
Rendert eine Warnungskomponente (Alert component) mit der Prop type.
Die Alert-Komponente akzeptiert die folgenden Props:
isDefaultShown: Ein boolescher Wert, der bestimmt, ob die Warnung zunächst angezeigt wird oder nicht (Standardwert istfalse).timeout: Eine Zahl, die die Dauer in Millisekunden angibt, bevor die Warnung ausblendet (Standardwert ist250).type: Ein String, der den Typ der Warnung bestimmt (z.B. "warning", "error", "info").message: Ein String, der die anzuzeigende Nachricht in der Warnung enthält.
Die Komponente führt die folgenden Aktionen aus:
- Verwendet den
useState()-Hook, um die ZustandsvariablenisShownundisLeavingzu erstellen und beide zunächst auffalsezu setzen. - Definiert eine Variable
timeoutId, um die Timer-Instanz zu speichern, um sie beim Entfernen der Komponente zu löschen. - Verwendet den
useEffect()-Hook, um den Wert vonisShownauftruezu aktualisieren und das Intervall mithilfe vontimeoutIdzu löschen, wenn die Komponente entfernt wird. - Definiert eine Funktion
closeAlert, um die Komponente aus dem DOM zu entfernen, indem eine Ausblendanimation angezeigt wird undisShownübersetTimeout()auffalsegesetzt wird. - Rendert die Warnungskomponente, wenn
isShowntrueist. Die Komponente hat die entsprechenden Stile basierend auf der Proptypeund blendet aus, wennisLeavingtrueist.
Hier ist der Code:
@keyframes leave {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
.alert {
padding: 0.75rem 0.5rem;
margin-bottom: 0.5rem;
text-align: left;
padding-right: 40px;
border-radius: 4px;
font-size: 16px;
position: relative;
}
.alert.warning {
color: #856404;
background-color: #fff3cd;
border-color: #ffeeba;
}
.alert.error {
color: #721c24;
background-color: #f8d7da;
border-color: #f5c6cb;
}
.alert.leaving {
animation: leave 0.5s forwards;
}
.alert.close {
position: absolute;
top: 0;
right: 0;
padding: 0 0.75rem;
color: #333;
border: 0;
height: 100%;
cursor: pointer;
background: none;
font-weight: 600;
font-size: 16px;
}
.alert.close::after {
content: "x";
}
const Alert = ({ isDefaultShown = false, timeout = 250, type, message }) => {
const [isShown, setIsShown] = React.useState(isDefaultShown);
const [isLeaving, setIsLeaving] = React.useState(false);
let timeoutId = null;
React.useEffect(() => {
setIsShown(true);
return () => {
clearTimeout(timeoutId);
};
}, [isDefaultShown, timeout, timeoutId]);
const closeAlert = () => {
setIsLeaving(true);
timeoutId = setTimeout(() => {
setIsLeaving(false);
setIsShown(false);
}, timeout);
};
return (
isShown && (
<div
className={`alert ${type} ${isLeaving ? "leaving" : ""}`}
role="alert"
>
<button className="close" onClick={closeAlert} />
{message}
</div>
)
);
};
ReactDOM.createRoot(document.getElementById("root")).render(
<Alert type="info" message="This is info" />
);
Klicken Sie bitte auf 'Go Live' in der unteren rechten Ecke, um den Web-Service auf Port 8080 auszuführen. Anschließend können Sie die Registerkarte Web 8080 aktualisieren, um die Webseite anzusehen.
Zusammenfassung
Herzlichen Glückwunsch! Sie haben das Lab zur schließbaren Warnung (Closable Alert) abgeschlossen. Sie können in LabEx weitere Labs üben, um Ihre Fähigkeiten zu verbessern.