Nederlands

Leer hoe u React Error Boundaries implementeert voor foutafhandeling, om crashes van applicaties te voorkomen en de gebruikerservaring te verbeteren. Ontdek best practices, geavanceerde technieken en praktijkvoorbeelden.

React Error Boundaries: Een Uitgebreide Gids voor Robuuste Foutafhandeling

In de wereld van moderne webontwikkeling is een soepele en betrouwbare gebruikerservaring van het grootste belang. Een enkele onafgehandelde fout kan een hele React-applicatie laten crashen, wat gebruikers gefrustreerd achterlaat en mogelijk waardevolle gegevens verloren doet gaan. React Error Boundaries bieden een krachtig mechanisme om deze fouten netjes af te handelen, catastrofale crashes te voorkomen en een veerkrachtigere en gebruiksvriendelijkere ervaring te bieden. Deze gids biedt een uitgebreid overzicht van React Error Boundaries, waarin hun doel, implementatie, best practices en geavanceerde technieken worden behandeld.

Wat zijn React Error Boundaries?

Error Boundaries zijn React-componenten die JavaScript-fouten overal in hun onderliggende componentenboom (child component tree) opvangen, deze fouten loggen en een terugval-UI (fallback UI) weergeven in plaats van de componentenboom die is gecrasht. Ze fungeren als een vangnet en voorkomen dat fouten in één deel van de applicatie de hele UI platleggen. Geïntroduceerd in React 16, vervingen Error Boundaries de eerdere, minder robuuste foutafhandelingsmechanismen.

Zie Error Boundaries als `try...catch`-blokken voor React-componenten. In tegenstelling tot `try...catch` werken ze echter voor componenten, wat een declaratieve en herbruikbare manier biedt om fouten in uw hele applicatie af te handelen.

Waarom Error Boundaries gebruiken?

Error Boundaries bieden verschillende cruciale voordelen:

Een Error Boundary Component maken

Om een Error Boundary-component te maken, moet u een class-component definiëren die een of beide van de volgende lifecycle-methoden implementeert:

Hier is een basisvoorbeeld van een Error Boundary-component:


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

  static getDerivedStateFromError(error) {
    // Werk de state bij zodat de volgende render de terugval-UI toont.
    return { hasError: true };
  }

  componentDidCatch(error, info) {
    // Voorbeeld "componentStack":
    //   in ComponentThatThrows (created by App)
    //   in App
    console.error("Een fout opgevangen: ", error, info.componentStack);
    // U kunt de fout ook loggen naar een foutrapportageservice
    // logErrorToMyService(error, info.componentStack);
  }

  render() {
    if (this.state.hasError) {
      // U kunt elke aangepaste terugval-UI renderen
      return 

Er is iets misgegaan.

; } return this.props.children; } }

Uitleg:

Error Boundaries gebruiken

Om een Error Boundary te gebruiken, wikkelt u eenvoudigweg de component of componenten die u wilt beschermen in de ErrorBoundary-component:



  


Als ComponentThatMightThrow een fout veroorzaakt, zal de ErrorBoundary de fout opvangen, zijn state bijwerken en zijn terugval-UI renderen. De rest van de applicatie blijft normaal functioneren.

Plaatsing van Error Boundaries

De plaatsing van Error Boundaries is cruciaal voor effectieve foutafhandeling. Overweeg deze strategieën:

Voorbeeld:


function App() {
  return (
    
); }

In dit voorbeeld is elke belangrijke sectie van de applicatie (Header, Sidebar, ContentArea, Footer) omwikkeld met een Error Boundary. Dit stelt elke sectie in staat om fouten onafhankelijk af te handelen, waardoor wordt voorkomen dat een enkele fout de hele applicatie beïnvloedt.

De terugval-UI aanpassen

De terugval-UI die door een Error Boundary wordt weergegeven, moet informatief en gebruiksvriendelijk zijn. Overweeg deze richtlijnen:

Voorbeeld:


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

  static getDerivedStateFromError(error) {
    // Werk de state bij zodat de volgende render de terugval-UI toont.
    return { hasError: true };
  }

  componentDidCatch(error, info) {
    // U kunt de fout ook loggen naar een foutrapportageservice
    console.error("Een fout opgevangen: ", error, info.componentStack);
  }

  render() {
    if (this.state.hasError) {
      // U kunt elke aangepaste terugval-UI renderen
      return (
        

Oeps! Er is iets misgegaan.

Onze excuses, er is een fout opgetreden bij het weergeven van deze inhoud.

Probeer de pagina te vernieuwen of neem contact op met support als het probleem aanhoudt.

Neem contact op met Support
); } return this.props.children; } }

Dit voorbeeld toont een meer informatieve terugval-UI met een duidelijke foutmelding, voorgestelde oplossingen en links om de pagina te vernieuwen en contact op te nemen met support.

Verschillende soorten fouten afhandelen

Error Boundaries vangen fouten op die optreden tijdens het renderen, in lifecycle-methoden en in constructors van de hele boom eronder. Ze vangen *geen* fouten op voor:

Om dit soort fouten af te handelen, moet u verschillende technieken gebruiken.

Event Handlers

Voor fouten die optreden in event handlers, gebruik een standaard try...catch-blok:


function MyComponent() {
  const handleClick = () => {
    try {
      // Code die mogelijk een fout veroorzaakt
      throw new Error("Er is iets misgegaan in de event handler");
    } catch (error) {
      console.error("Fout in event handler: ", error);
      // Handel de fout af (bijv. toon een foutmelding)
      alert("Er is een fout opgetreden. Probeer het opnieuw.");
    }
  };

  return ;
}

Asynchrone Code

Voor fouten die optreden in asynchrone code, gebruik try...catch-blokken binnen de asynchrone functie:


function MyComponent() {
  useEffect(() => {
    async function fetchData() {
      try {
        const response = await fetch("https://api.example.com/data");
        const data = await response.json();
        // Verwerk de gegevens
        console.log(data);
      } catch (error) {
        console.error("Fout bij ophalen van gegevens: ", error);
        // Handel de fout af (bijv. toon een foutmelding)
        alert("Het ophalen van gegevens is mislukt. Probeer het later opnieuw.");
      }
    }

    fetchData();
  }, []);

  return 
Gegevens laden...
; }

Als alternatief kunt u een globaal foutafhandelingsmechanisme gebruiken voor onafgehandelde promise rejections:


window.addEventListener('unhandledrejection', function(event) {
  console.error('Onafgehandelde rejection (promise: ', event.promise, ', reden: ', event.reason, ');');
  // Toon optioneel een globale foutmelding of log de fout naar een service
  alert("Er is een onverwachte fout opgetreden. Probeer het later opnieuw.");
});

Geavanceerde Error Boundary Technieken

De Error Boundary resetten

In sommige gevallen wilt u misschien een manier bieden voor gebruikers om de Error Boundary te resetten en de operatie die de fout veroorzaakte opnieuw te proberen. Dit kan handig zijn als de fout werd veroorzaakt door een tijdelijk probleem, zoals een netwerkprobleem.

Om een Error Boundary te resetten, kunt u een state management-bibliotheek zoals Redux of Context gebruiken om de foutstatus te beheren en een resetfunctie te bieden. Als alternatief kunt u een eenvoudigere aanpak gebruiken door de Error Boundary te dwingen opnieuw te mounten.

Voorbeeld (Hermontage forceren):


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

  static getDerivedStateFromError(error) {
    // Werk de state bij zodat de volgende render de terugval-UI toont.
    return { hasError: true };
  }

  componentDidCatch(error, info) {
    // U kunt de fout ook loggen naar een foutrapportageservice
    console.error("Een fout opgevangen: ", 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) {
      // U kunt elke aangepaste terugval-UI renderen
      return (
        

Oeps! Er is iets misgegaan.

Onze excuses, er is een fout opgetreden bij het weergeven van deze inhoud.

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

In dit voorbeeld wordt een 'key' toegevoegd aan de omringende div. Het veranderen van de key dwingt de component om opnieuw te mounten, waardoor de foutstatus effectief wordt gewist. De `resetError`-methode werkt de `key`-state van de component bij, waardoor de component opnieuw wordt gemount en zijn children opnieuw worden gerenderd.

Error Boundaries gebruiken met Suspense

React Suspense stelt u in staat om het renderen van een component op te schorten ("suspend") totdat aan een bepaalde voorwaarde is voldaan (bijv. gegevens zijn opgehaald). U kunt Error Boundaries combineren met Suspense om een robuustere foutafhandelingservaring te bieden voor asynchrone operaties.


import React, { Suspense } from 'react';

function MyComponent() {
  return (
    
      Laden...
}> ); } function DataFetchingComponent() { const data = useData(); // Custom hook die asynchroon gegevens ophaalt return
{data.value}
; }

In dit voorbeeld haalt de DataFetchingComponent asynchroon gegevens op met behulp van een custom hook. De Suspense-component toont een laadindicator terwijl de gegevens worden opgehaald. Als er een fout optreedt tijdens het ophalen van de gegevens, zal de ErrorBoundary de fout opvangen en een terugval-UI weergeven.

Best Practices voor React Error Boundaries

Praktijkvoorbeelden

Hier zijn enkele praktijkvoorbeelden van hoe Error Boundaries kunnen worden gebruikt:

Alternatieven voor Error Boundaries

Hoewel Error Boundaries de aanbevolen manier zijn om fouten in React af te handelen, zijn er enkele alternatieve benaderingen die u kunt overwegen. Houd er echter rekening mee dat deze alternatieven mogelijk niet zo effectief zijn als Error Boundaries in het voorkomen van applicatiecrashes en het bieden van een naadloze gebruikerservaring.

Uiteindelijk bieden Error Boundaries een robuuste en gestandaardiseerde aanpak voor foutafhandeling in React, waardoor ze de voorkeurskeuze zijn voor de meeste use-cases.

Conclusie

React Error Boundaries zijn een essentieel hulpmiddel voor het bouwen van robuuste en gebruiksvriendelijke React-applicaties. Door fouten op te vangen en terugval-UI's weer te geven, voorkomen ze applicatiecrashes, verbeteren ze de gebruikerservaring en vereenvoudigen ze het debuggen van fouten. Door de best practices in deze gids te volgen, kunt u Error Boundaries effectief implementeren in uw applicaties en een veerkrachtigere en betrouwbaardere gebruikerservaring creëren voor gebruikers over de hele wereld.