VorwortAb React 16 wurde das Konzept der Fehlergrenzen eingeführt, mit dem in den untergeordneten Komponenten generierte Fehler erfasst, Fehlerprotokolle aufgezeichnet und Downgrade-Inhalte angezeigt werden können. Die spezifische offizielle Website-Adresse Fehlergrenzen verhindern, dass ein Komponentenfehler dazu führt, dass die gesamte Seite mit einem leeren Bildschirm unbrauchbar wird. Sie verwenden eine sanfte Verschlechterung, um eine alternative Benutzeroberfläche bereitzustellen. Fehlergrenzen können Fehler während des Renderings, im Lebenszyklus und im Konstruktor des gesamten Komponentenbaums erfassen. Seit React 16 führt jeder Fehler, der nicht von einer Fehlergrenze erfasst wird, dazu, dass der gesamte React-Komponentenbaum ausgehängt wird. Bedeutung von ErrorBoundary
Beim Durchsuchen einer Seite kann die Benutzererfahrung aufgrund von Ausnahmen, die vom Backend zurückgegeben werden, oder einiger Fehlerprüfungen im Frontend schlecht sein. Stellen Sie sich vor, Sie sitzen mit Ihrer Frau im Zug, essen Hot Pot und singen Lieder, So implementieren Sie die offizielle Website👉 Wenn eine Klassenkomponente eine (oder beide) der beiden Lebenszyklusmethoden static getDerivedStateFromError() oder componentDidCatch() definiert, wird sie zu einer Fehlergrenze. Wenn ein Fehler auftritt, verwenden Sie static getDerivedStateFromError(), um die alternative Benutzeroberfläche zu rendern, und componentDidCatch(), um die Fehlermeldung auszudrucken 👈 Klasse ErrorBoundary erweitert React.Component { Konstruktor(Requisiten) { super(Requisiten); dieser.Zustand = { hasError: false }; } statisch getDerivedStateFromError(Fehler) { // Aktualisieren Sie den Status, damit beim nächsten Rendering die verschlechterte Benutzeroberfläche angezeigt werden kann. return { hatFehler: true }; } componentDidCatch(Fehler, Fehlerinfo) { // Sie können Fehlerprotokolle auch an den Server melden logErrorToMyService(error, errorInfo); } rendern() { wenn (dieser.Zustand.hatFehler) { // Sie können die heruntergestufte Benutzeroberfläche anpassen und das Rendering zurückgeben <h1>Etwas ist schiefgelaufen.</h1>; } gib diese.Eigenschaften.Kinder zurück; } } Dann können Sie es als reguläre Komponente verwenden: <Fehlergrenze> <MeinWidget /> </Fehlergrenze> Fehlergrenzen funktionieren ähnlich Kapselt eine konfigurierbare ErrorBoundary Nachdem wir verstanden haben, wie die offizielle Website die Fehlergrenzkomponente implementiert, können wir eine 1. Erstellen Sie eine konfigurierbare ErrorBoundary-Klassenkomponente Im Vergleich zum
Klasse ErrorBoundary erweitert React.Component { Zustand = { Fehler: falsch }; statisch getDerivedStateFromError(Fehler) { Rückgabe { Fehler }; } componentDidCatch(Fehler, Fehlerinfo) { wenn (this.props.onError) { //Das Berichtsprotokoll wird durch die von der übergeordneten Komponente eingefügte Funktion this.props.onError(error, errorInfo.componentStack); ausgeführt. } } rendern() { const { fallback, FallbackComponent } = this.props; const { Fehler } = dieser.Zustand; if (Fehler) { const fallbackProps = { Fehler }; //Feststellen, ob es sich um ein React-Element handelt wenn (React.isValidElement(fallback)) { Fallback zurückgeben; } //Komponentenmethode if (FallbackComponent) { return <FallbackComponent {...fallbackProps} />; } throw new Error("Die ErrorBoundary-Komponente muss an die Fallback-Benutzeroberfläche übergeben werden"); } gib diese.Eigenschaften.Kinder zurück; } } Auf diese Weise können die zugrunde liegende 1. Fügen Sie eine Methode in ErrorBoundary hinzu, um festzustellen, ob eine eingefügte Reset-Methode vorhanden ist. Wenn eine Reset-Methode vorhanden ist, führen Sie sie aus und setzen Sie den Fehler im Status zurück, um den Fehlerstatus auf „false“ zu setzen.Fehlergrenze zurücksetzen = () => { wenn (this.props.onReset) this.props.onReset(); this.setState({ Fehler: false }); }; 2. Fügen Sie zum Rendern einen Funktionskomponententyp in Render hinzu. Die Reset-Methode und die Fehlerinformationen können als Parameter zur Verarbeitung an die aktuelle Komponente übergeben werden.rendern() { const { fallback, FallbackComponent, fallbackRender } = this.props; const { Fehler } = dieser.Zustand; if (Fehler) { const fallbackProps = { Fehler, resetErrorBoundary: this.resetErrorBoundary, }; ... wenn (Typ von FallbackRender === "Funktion") returniere FallbackRender(FallbackProps); ... } gib diese.Eigenschaften.Kinder zurück; } 2. Umhüllen Sie ErrorBoundary mit einer höherwertigen Funktion und geben Sie diese zurückimportiere React von „react“; importiere DefaultErrorBoundary aus "./core"; const catchreacterror = (Boundary = DefaultErrorBoundary) => InnerComponent => { Requisiten zurückgeben => ( <Grenze {...Eigenschaften}> <InnerComponent {...props} /> </Grenze> ); }; Nutzung und TestsIn einer Click-to-Increment-Demo wird eine Ausnahme ausgelöst, wenn die Zahl einen bestimmten Wert erreicht. Hier werden die Klassenkomponente und die Funktionskomponente als Komponenten getestet, die die Ausnahme auslösen.
//Funktionskomponente const fnCount1 = ({ count }) => { if (Anzahl == 3) throw new Error("Anzahl ist drei"); gibt <span>{Anzahl}</span> zurück; }; //Klassenkomponente class fnCount2 extends React.Component { rendern() { const { count } = diese.props; if (Anzahl == 2) throw new Error("Anzahl ist zwei"); gibt <span>{Anzahl}</span> zurück; } }
const errorbackfn = ({ Fehler: { Nachricht }, resetErrorBoundary }) => ( <div> <p>Etwas ist schiefgelaufen</p> <pre>{Nachricht}</pre> <button onClick={resetErrorBoundary}>Erneut versuchen</button> </div> );
const errorbackcom = () => <h1>Ein Fehler ist aufgetreten und kann nicht rückgängig gemacht werden</h1>;
//Umschließe die Komponente, die die Ausnahme initiiert hat, und gib eine Komponente höherer Ordnung zurück, die die Fehlerbearbeitung verarbeiten kann. const SafeCount1 = catchreacterror()(fnCount1); const SafeCount2 = catchreacterror()(fnCount2); //Hauptkomponente testen const App = () => { const [Anzahl, Anzahl festlegen] = useState(0); const ListenError = (arg, info) => console.log("Error: " + arg.message, info); //Rückruf, wenn ein Fehler auftritt const onReset = () => setCount(0); //Rückruf, wenn auf Zurücksetzen geklickt wird return ( <div Klassenname="App"> <Abschnitt> <button bei Klick={() => setCount(Anzahl => Anzahl + 1)}>+</button> <button bei Klick = {() => setCount(Anzahl => Anzahl - 1)}>-</button> </Abschnitt> <hr /> <div> Klassenkomponente: <Sicherheitsanzahl2 Anzahl={Anzahl} fallbackRender={errorbackfn} beim Zurücksetzen={beim Zurücksetzen} beiFehler={ListenError} /> </div> <div> Funktionskomponente: <SichereAnzahl1 Anzahl={Anzahl} FallbackComponent={errorbackcom} beiFehler={ListenError} /> </div> </div> ); }; Mission erfüllt! Aufgetretene Probleme und ZusammenfassungEs gibt viele Fälle, in denen Fehlergrenzen bei React nicht allmächtig sind, wie zum Beispiel
Im obigen Beispiel existiert this.o nicht, daher wird ein Fehler gemeldet. Window.onerror kann es erfassen, die Fehlergrenze jedoch nicht.
Serverseitiges Rendering und Fehlergrenzen selbst Zusammenfassen
Vielen Dank, dass Sie sich die Zeit genommen haben, diesen Artikel zu lesen. Ich hoffe, er kann Ihnen weiterhelfen. Ich gehe davon aus, dass Sie ein allgemeines Verständnis der Fehlergrenzen in React haben und eine einfache Das könnte Sie auch interessieren:
|
<<: MySQL 8.0.3 RC steht kurz vor der Veröffentlichung. Werfen wir einen Blick auf die Änderungen
>>: So zählen Sie die Anzahl bestimmter Zeichen in einer Datei unter Linux
Schreiben Sie zuerst ein SQL Wählen Sie DISTINCT ...
Inhaltsverzeichnis 1. MHA 1. Konzept 2. Zusammens...
Der Grund dafür ist, dass alle Dateien in UTF8 kod...
Dieser Artikel erläutert anhand von Beispielen da...
Inhaltsverzeichnis Veränderungen im Lebenszyklus ...
CSS ist der Bereich von Stil, Layout und Präsenta...
Als Neuling, der gerade mit dem Linux-System in K...
Der Vorgang der Installation der MySQL-Datenbank ...
Für gleichmäßig verteilte Layouts verwenden wir i...
Die stabile Version (GA) von MySQL 8.0.18 wurde g...
<br />Wenn Sie auf den Link klicken, wird di...
Inhaltsverzeichnis Eine Kastanie zum Abdecken Par...
1. Quelle des Problems Ein Freund von @水米田 hat mi...
Vorwort Wenn es um Datenbanktransaktionen geht, f...
Da das Unternehmen mich bat, einen WebService-Ser...