Svenska

Lär dig implementera React Error Boundaries för smidig felhantering, förhindra applikationskrascher och förbättra användarupplevelsen. Utforska bästa praxis, avancerade tekniker och verkliga exempel.

React Error Boundaries: En Omfattande Guide till Robust Felhantering

I en värld av modern webbutveckling är en smidig och pålitlig användarupplevelse av yttersta vikt. Ett enda ohanterat fel kan krascha en hel React-applikation, vilket gör användare frustrerade och potentiellt förlorar värdefull data. React Error Boundaries erbjuder en kraftfull mekanism för att smidigt hantera dessa fel, förhindra katastrofala krascher och erbjuda en mer motståndskraftig och användarvänlig upplevelse. Denna guide ger en omfattande översikt över React Error Boundaries, som täcker deras syfte, implementering, bästa praxis och avancerade tekniker.

Vad är React Error Boundaries?

Error Boundaries är React-komponenter som fångar JavaScript-fel var som helst i sitt underordnade komponentträd, loggar dessa fel och visar ett reserv-UI istället för det komponentträd som kraschade. De fungerar som ett skyddsnät och förhindrar att fel i en del av applikationen river ner hela gränssnittet. Error Boundaries introducerades i React 16 och ersatte de tidigare, mindre robusta felhanteringsmekanismerna.

Tänk på Error Boundaries som `try...catch`-block för React-komponenter. Men till skillnad från `try...catch` fungerar de för komponenter och erbjuder ett deklarativt och återanvändbart sätt att hantera fel i hela din applikation.

Varför använda Error Boundaries?

Error Boundaries erbjuder flera avgörande fördelar:

Skapa en Error Boundary-komponent

För att skapa en Error Boundary-komponent måste du definiera en klasskomponent som implementerar antingen en eller båda av följande livscykelmetoder:

Här är ett grundläggande exempel på en Error Boundary-komponent:


class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(error) {
    // Uppdatera state så att nästa rendering visar reserv-UI.
    return { hasError: true };
  }

  componentDidCatch(error, info) {
    // Exempel "componentStack":
    //   in ComponentThatThrows (created by App)
    //   in App
    console.error("Caught an error: ", error, info.componentStack);
    // Du kan också logga felet till en felrapporteringstjänst
    // logErrorToMyService(error, info.componentStack);
  }

  render() {
    if (this.state.hasError) {
      // Du kan rendera vilket anpassat reserv-UI som helst
      return 

Något gick fel.

; } return this.props.children; } }

Förklaring:

Använda Error Boundaries

För att använda en Error Boundary, omslut helt enkelt komponenten eller komponenterna du vill skydda med ErrorBoundary-komponenten:



  


Om ComponentThatMightThrow kastar ett fel kommer ErrorBoundary att fånga felet, uppdatera sitt state och rendera sitt reserv-UI. Resten av applikationen kommer att fortsätta fungera normalt.

Placering av Error Boundaries

Placeringen av Error Boundaries är avgörande för effektiv felhantering. Överväg dessa strategier:

Exempel:


function App() {
  return (
    
); }

I detta exempel är varje huvudsektion av applikationen (Header, Sidebar, ContentArea, Footer) omsluten av en Error Boundary. Detta gör att varje sektion kan hantera fel oberoende, vilket förhindrar att ett enda fel påverkar hela applikationen.

Anpassa reserv-UI:t

Det reserv-UI som visas av en Error Boundary bör vara informativt och användarvänligt. Överväg dessa riktlinjer:

Exempel:


class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(error) {
    // Uppdatera state så att nästa rendering visar reserv-UI.
    return { hasError: true };
  }

  componentDidCatch(error, info) {
    // Du kan också logga felet till en felrapporteringstjänst
    console.error("Caught an error: ", error, info.componentStack);
  }

  render() {
    if (this.state.hasError) {
      // Du kan rendera vilket anpassat reserv-UI som helst
      return (
        

Hoppsan! Något gick fel.

Vi ber om ursäkt, men ett fel inträffade när vi försökte visa detta innehåll.

Vänligen försök att uppdatera sidan eller kontakta support om problemet kvarstår.

Kontakta support
); } return this.props.children; } }

Detta exempel visar ett mer informativt reserv-UI som inkluderar ett tydligt felmeddelande, föreslagna lösningar och länkar för att uppdatera sidan och kontakta support.

Hantera olika typer av fel

Error Boundaries fångar fel som inträffar under rendering, i livscykelmetoder och i konstruktorer för hela trädet under dem. De fångar *inte* fel för:

För att hantera dessa typer av fel måste du använda andra tekniker.

Händelsehanterare

För fel som inträffar i händelsehanterare, använd ett standard try...catch-block:


function MyComponent() {
  const handleClick = () => {
    try {
      // Kod som kan kasta ett fel
      throw new Error("Något gick fel i händelsehanteraren");
    } catch (error) {
      console.error("Fel i händelsehanterare: ", error);
      // Hantera felet (t.ex. visa ett felmeddelande)
      alert("Ett fel inträffade. Vänligen försök igen.");
    }
  };

  return ;
}

Asynkron kod

För fel som inträffar i asynkron kod, använd try...catch-block inuti den asynkrona funktionen:


function MyComponent() {
  useEffect(() => {
    async function fetchData() {
      try {
        const response = await fetch("https://api.example.com/data");
        const data = await response.json();
        // Bearbeta datan
        console.log(data);
      } catch (error) {
        console.error("Fel vid hämtning av data: ", error);
        // Hantera felet (t.ex. visa ett felmeddelande)
        alert("Kunde inte hämta data. Vänligen försök igen senare.");
      }
    }

    fetchData();
  }, []);

  return 
Laddar data...
; }

Alternativt kan du använda en global felhanteringsmekanism för ohanterade promise rejections:


window.addEventListener('unhandledrejection', function(event) {
  console.error('Ohanterad rejection (promise: ', event.promise, ', anledning: ', event.reason, ');');
  // Valfritt, visa ett globalt felmeddelande eller logga felet till en tjänst
  alert("Ett oväntat fel inträffade. Vänligen försök igen senare.");
});

Avancerade tekniker för Error Boundary

Återställa Error Boundary

I vissa fall kanske du vill ge användare ett sätt att återställa Error Boundary och försöka igen den operation som orsakade felet. Detta kan vara användbart om felet orsakades av ett tillfälligt problem, som ett nätverksproblem.

För att återställa en Error Boundary kan du använda ett state management-bibliotek som Redux eller Context för att hantera fel-state och tillhandahålla en återställningsfunktion. Alternativt kan du använda ett enklare tillvägagångssätt genom att tvinga Error Boundary att monteras om.

Exempel (Tvinga ommontering):


class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false, errorCount: 0, key: 0 };
  }

  static getDerivedStateFromError(error) {
    // Uppdatera state så att nästa rendering visar reserv-UI.
    return { hasError: true };
  }

  componentDidCatch(error, info) {
    // Du kan också logga felet till en felrapporteringstjänst
    console.error("Caught an error: ", error, info.componentStack);
    this.setState(prevState => ({ errorCount: prevState.errorCount + 1 }));
  }

  resetError = () => {
      this.setState({hasError: false, key: this.state.key + 1})
  }

  render() {
    if (this.state.hasError) {
      // Du kan rendera vilket anpassat reserv-UI som helst
      return (
        

Hoppsan! Något gick fel.

Vi ber om ursäkt, men ett fel inträffade när vi försökte visa detta innehåll.

); } return
{this.props.children}
; } }

I detta exempel läggs en 'key' till den omslutande div-taggen. Att ändra nyckeln tvingar komponenten att monteras om, vilket effektivt rensar fel-state. `resetError`-metoden uppdaterar komponentens `key`-state, vilket får komponenten att monteras om och rendera sina barn på nytt.

Använda Error Boundaries med Suspense

React Suspense låter dig "pausa" renderingen av en komponent tills något villkor är uppfyllt (t.ex. data har hämtats). Du kan kombinera Error Boundaries med Suspense för att ge en mer robust felhanteringsupplevelse för asynkrona operationer.


import React, { Suspense } from 'react';

function MyComponent() {
  return (
    
      Laddar...
}> ); } function DataFetchingComponent() { const data = useData(); // Anpassad hook som hämtar data asynkront return
{data.value}
; }

I detta exempel hämtar DataFetchingComponent data asynkront med hjälp av en anpassad hook. Suspense-komponenten visar en laddningsindikator medan data hämtas. Om ett fel inträffar under datahämtningsprocessen kommer ErrorBoundary att fånga felet och visa ett reserv-UI.

Bästa praxis för React Error Boundaries

Verkliga exempel

Här är några verkliga exempel på hur Error Boundaries kan användas:

Alternativ till Error Boundaries

Även om Error Boundaries är det rekommenderade sättet att hantera fel i React, finns det några alternativa tillvägagångssätt du kan överväga. Tänk dock på att dessa alternativ kanske inte är lika effektiva som Error Boundaries för att förhindra applikationskrascher och ge en sömlös användarupplevelse.

I slutändan erbjuder Error Boundaries ett robust och standardiserat tillvägagångssätt för felhantering i React, vilket gör dem till det föredragna valet för de flesta användningsfall.

Slutsats

React Error Boundaries är ett väsentligt verktyg för att bygga robusta och användarvänliga React-applikationer. Genom att fånga fel och visa reserv-UI:er förhindrar de applikationskrascher, förbättrar användarupplevelsen och förenklar felsökning. Genom att följa de bästa praxis som beskrivs i denna guide kan du effektivt implementera Error Boundaries i dina applikationer och skapa en mer motståndskraftig och pålitlig användarupplevelse för användare över hela världen.