Dansk

Mestre React Suspense og Error Boundaries for robust styring af indlæsningstilstand og elegant fejlhåndtering. Lær at bygge robuste og brugervenlige applikationer.

React Suspense og Error Boundaries: Avanceret Indlæsning og Fejlhåndtering

React Suspense og Error Boundaries er kraftfulde funktioner, der giver udviklere mulighed for at bygge mere robuste og brugervenlige applikationer. De giver en deklarativ måde at håndtere indlæsningstilstande og uventede fejl på, hvilket forbedrer den overordnede brugeroplevelse og forenkler udviklingsprocessen. Denne artikel giver en omfattende guide til effektiv brug af React Suspense og Error Boundaries, der dækker alt fra grundlæggende koncepter til avancerede teknikker.

Forståelse af React Suspense

React Suspense er en mekanisme til at "suspendere" renderingen af en komponent, indtil en bestemt betingelse er opfyldt, typisk tilgængeligheden af data fra en asynkron operation. Dette giver dig mulighed for at vise fallback UI, såsom indlæsningsindikatorer, mens du venter på, at dataene indlæses. Suspense forenkler styringen af indlæsningstilstande, hvilket eliminerer behovet for manuel betinget rendering og forbedrer kodeens læsbarhed.

Nøglebegreber for Suspense

Grundlæggende implementering af Suspense

Her er et simpelt eksempel på, hvordan du bruger Suspense til at vise en indlæsningsindikator, mens du henter data:


import React, { Suspense } from 'react';

// Simuler hentning af data (f.eks. fra en API)
const fetchData = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve({ name: 'John Doe', age: 30 });
    }, 2000);
  });
};

// Opret en ressource, som Suspense kan bruge
const createResource = (promise) => {
  let status = 'pending';
  let result;
  let suspender = promise().then(
    (r) => {
      status = 'success';
      result = r;
    },
    (e) => {
      status = 'error';
      result = e;
    }
  );

  return {
    read() {
      if (status === 'pending') {
        throw suspender;
      } else if (status === 'error') {
        throw result;
      }

      return result;
    },
  };
};

const userData = createResource(fetchData);

// Komponent, der læser fra ressourcen
const UserProfile = () => {
  const data = userData.read();
  return (
    

Name: {data.name}

Age: {data.age}

); }; const App = () => { return ( Indlæser brugerdata...
}> ); }; export default App;

I dette eksempel:

Suspense med kodeopdeling

Suspense kan også bruges med React.lazy til at implementere kodeopdeling. Dette giver dig mulighed for kun at indlæse komponenter, når de er nødvendige, hvilket forbedrer den indledende sideindlæsningsydeevne.


import React, { Suspense, lazy } from 'react';

// Lazy load MyComponent-komponenten
const MyComponent = lazy(() => import('./MyComponent'));

const App = () => {
  return (
    Indlæser komponent...}>
      
    
  );
};

export default App;

I dette eksempel:

Forståelse af Error Boundaries

Error Boundaries er React-komponenter, der opfanger JavaScript-fejl hvor som helst i deres barnkomponenttræ, logger disse fejl og viser en fallback UI i stedet for at crashe hele applikationen. De giver en måde at håndtere uventede fejl elegant på, hvilket forbedrer brugeroplevelsen og gør din applikation mere robust.

Nøglebegreber for Error Boundaries

Grundlæggende implementering af Error Boundaries

Her er et simpelt eksempel på, hvordan du opretter en Error Boundary:


import React, { Component } from 'react';

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

  static getDerivedStateFromError(error) {
    // Opdater tilstanden, så den næste rendering viser fallback UI.
    return { hasError: true };
  }

  componentDidCatch(error, errorInfo) {
    // Du kan også logge fejlen til en fejlrapporteringstjeneste
    console.error(error, errorInfo);
  }

  render() {
    if (this.state.hasError) {
      // Du kan rendere en hvilken som helst brugerdefineret fallback UI
      return 

Noget gik galt.

; } return this.props.children; } } export default ErrorBoundary;

I dette eksempel:

Brug af Error Boundaries

For at bruge `ErrorBoundary`-komponenten skal du blot ombryde de komponenter, du vil beskytte, med den:


import React from 'react';
import ErrorBoundary from './ErrorBoundary';

const MyComponent = () => {
  // Simuler en fejl
  throw new Error('Der opstod en fejl!');
};

const App = () => {
  return (
    
      
    
  );
};

export default App;

I dette eksempel, hvis der opstår en fejl i `MyComponent`, vil `ErrorBoundary`-komponenten fange fejlen og vise fallback UI.

Kombinering af Suspense og Error Boundaries

Suspense og Error Boundaries kan kombineres for at give en robust og omfattende fejlhåndteringsstrategi for asynkrone operationer. Ved at ombryde komponenter, der kan suspendere, med både Suspense og Error Boundaries, kan du håndtere både indlæsningstilstande og uventede fejl elegant.

Eksempel på kombination af Suspense og Error Boundaries


import React, { Suspense } from 'react';
import ErrorBoundary from './ErrorBoundary';

// Simuler hentning af data (f.eks. fra en API)
const fetchData = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      // Simuler en vellykket datahentning
      // resolve({ name: 'John Doe', age: 30 });

      // Simuler en fejl under datahentning
      reject(new Error('Kunne ikke hente brugerdata'));

    }, 2000);
  });
};

// Opret en ressource, som Suspense kan bruge
const createResource = (promise) => {
  let status = 'pending';
  let result;
  let suspender = promise().then(
    (r) => {
      status = 'success';
      result = r;
    },
    (e) => {
      status = 'error';
      result = e;
    }
  );

  return {
    read() {
      if (status === 'pending') {
        throw suspender;
      } else if (status === 'error') {
        throw result;
      }

      return result;
    },
  };
};

const userData = createResource(fetchData);

// Komponent, der læser fra ressourcen
const UserProfile = () => {
  const data = userData.read();
  return (
    

Name: {data.name}

Age: {data.age}

); }; const App = () => { return ( Indlæser brugerdata...}> ); }; export default App;

I dette eksempel:

Avancerede teknikker og bedste praksis

Optimering af Suspense-ydeevne

Brugerdefinerede Error Boundaries

Du kan oprette brugerdefinerede Error Boundaries for at håndtere specifikke typer af fejl eller for at give mere informative fejlmeddelelser. For eksempel kan du oprette en Error Boundary, der viser en anden fallback UI baseret på typen af fejl, der opstod.

Server-Side Rendering (SSR) med Suspense

Suspense kan bruges med Server-Side Rendering (SSR) for at forbedre den indledende sideindlæsningsydeevne. Ved hjælp af SSR kan du præ-rendere den indledende tilstand af din applikation på serveren og derefter streame det resterende indhold til klienten. Suspense giver dig mulighed for at håndtere asynkron datahentning under SSR og for at vise indlæsningsindikatorer, mens dataene streames.

Håndtering af forskellige fejlsituationer

Overvej disse forskellige fejlsituationer, og hvordan du håndterer dem:

Global fejlhåndtering

Implementer en global fejlhåndteringsmekanisme for at fange fejl, der ikke fanges af Error Boundaries. Dette kan gøres ved at bruge en global fejlhåndterer eller ved at ombryde hele applikationen i en Error Boundary.

Eksempler og anvendelsesscenarier i den virkelige verden

E-handelsapplikation

I en e-handelsapplikation kan Suspense bruges til at vise indlæsningsindikatorer, mens du henter produktdata, og Error Boundaries kan bruges til at håndtere fejl, der opstår under checkout-processen. Forestil dig for eksempel en bruger fra Japan, der browser i en onlinebutik i USA. Produktbillederne og -beskrivelserne kan tage noget tid at indlæse. Suspense kan vise en simpel indlæsningsanimation, mens disse data hentes fra en server, der muligvis er halvvejs rundt om jorden. Hvis betalingsgatewayen fejler på grund af et midlertidigt netværksproblem (almindeligt på tværs af forskellige internetinfrastrukturer globalt), kan en Error Boundary vise en brugervenlig meddelelse, der beder dem om at prøve igen senere.

Social Media-platform

På en social medieplatform kan Suspense bruges til at vise indlæsningsindikatorer, mens du henter brugerprofiler og -indlæg, og Error Boundaries kan bruges til at håndtere fejl, der opstår ved indlæsning af billeder eller videoer. En bruger, der browser fra Indien, kan opleve langsommere indlæsningstider for medier, der hostes på servere i Europa. Suspense kan vise en pladsholder, indtil indholdet er fuldt indlæst. Hvis en bestemt brugers profildata er korrupte (sjældent, men muligt), kan en Error Boundary forhindre, at hele det sociale medie-feed crasher, og i stedet vise en simpel fejlmeddelelse som "Kunne ikke indlæse brugerprofil".

Dashboard-applikation

I en dashboard-applikation kan Suspense bruges til at vise indlæsningsindikatorer, mens du henter data fra flere kilder, og Error Boundaries kan bruges til at håndtere fejl, der opstår ved indlæsning af diagrammer eller grafer. En finansanalytiker i London, der får adgang til et globalt investeringsdashboard, indlæser muligvis data fra flere børser rundt om i verden. Suspense kan give indlæsningsindikatorer for hver datakilde. Hvis en børs' API er nede, kan en Error Boundary vise en fejlmeddelelse specifikt for den pågældende børs' data og forhindre, at hele dashboardet bliver ubrugeligt.

Konklusion

React Suspense og Error Boundaries er essentielle værktøjer til at bygge robuste og brugervenlige React-applikationer. Ved at bruge Suspense til at styre indlæsningstilstande og Error Boundaries til at håndtere uventede fejl, kan du forbedre den overordnede brugeroplevelse og forenkle udviklingsprocessen. Denne guide har givet et omfattende overblik over Suspense og Error Boundaries, der dækker alt fra grundlæggende koncepter til avancerede teknikker. Ved at følge den bedste praksis, der er beskrevet i denne artikel, kan du bygge robuste og pålidelige React-applikationer, der kan håndtere selv de mest udfordrende scenarier.

Efterhånden som React fortsætter med at udvikle sig, vil Suspense og Error Boundaries sandsynligvis spille en stadig vigtigere rolle i opbygningen af moderne webapplikationer. Ved at mestre disse funktioner kan du ligge i forkant og levere enestående brugeroplevelser.