Hrvatski

Naučite kako implementirati React Error Boundaries za elegantno upravljanje greškama, sprječavanje rušenja aplikacije i poboljšanje korisničkog iskustva. Istražite najbolje prakse, napredne tehnike i stvarne primjere.

React Error Boundaries: Sveobuhvatan Vodič za Robusno Upravljanje Greškama

U svijetu modernog web razvoja, glatko i pouzdano korisničko iskustvo je od presudne važnosti. Jedna neobrađena greška može srušiti cijelu React aplikaciju, ostavljajući korisnike frustriranima i potencijalno gubeći vrijedne podatke. React Error Boundaries pružaju moćan mehanizam za elegantno rukovanje tim greškama, sprječavanje katastrofalnih rušenja i pružanje otpornijeg i korisnički prihvatljivijeg iskustva. Ovaj vodič pruža sveobuhvatan pregled React Error Boundaries, pokrivajući njihovu svrhu, implementaciju, najbolje prakse i napredne tehnike.

Što su React Error Boundaries?

Error Boundaries su React komponente koje hvataju JavaScript greške bilo gdje u stablu svojih podređenih komponenti, bilježe te greške i prikazuju zamjensko korisničko sučelje (fallback UI) umjesto stabla komponenti koje se srušilo. Djeluju kao sigurnosna mreža, sprječavajući da greške u jednom dijelu aplikacije sruše cijelo korisničko sučelje. Uvedeni u Reactu 16, Error Boundaries zamijenili su prethodne, manje robusne mehanizme za rukovanje greškama.

Zamislite Error Boundaries kao `try...catch` blokove za React komponente. Međutim, za razliku od `try...catch`, oni rade za komponente, pružajući deklarativan i višekratno iskoristiv način za rukovanje greškama u cijeloj vašoj aplikaciji.

Zašto koristiti Error Boundaries?

Error Boundaries nude nekoliko ključnih prednosti:

Kreiranje Error Boundary Komponente

Da biste kreirali Error Boundary komponentu, morate definirati klasnu komponentu koja implementira jednu ili obje sljedeće metode životnog ciklusa:

Evo osnovnog primjera Error Boundary komponente:


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

  static getDerivedStateFromError(error) {
    // Ažurirajte stanje kako bi sljedeći render prikazao zamjensko korisničko sučelje.
    return { hasError: true };
  }

  componentDidCatch(error, info) {
    // Primjer "componentStack":
    //   in ComponentThatThrows (created by App)
    //   in App
    console.error("Uhvaćena je greška: ", error, info.componentStack);
    // Grešku možete zabilježiti i u servisu za izvještavanje o greškama
    // logErrorToMyService(error, info.componentStack);
  }

  render() {
    if (this.state.hasError) {
      // Možete renderirati bilo koje prilagođeno zamjensko korisničko sučelje
      return 

Nešto je pošlo po zlu.

; } return this.props.children; } }

Objašnjenje:

Korištenje Error Boundaries

Da biste koristili Error Boundary, jednostavno omotajte komponentu ili komponente koje želite zaštititi s ErrorBoundary komponentom:



  


Ako ComponentThatMightThrow baci grešku, ErrorBoundary će uhvatiti grešku, ažurirati svoje stanje i renderirati svoje zamjensko korisničko sučelje. Ostatak aplikacije će nastaviti normalno funkcionirati.

Postavljanje Error Boundaries

Postavljanje Error Boundaries je ključno za učinkovito rukovanje greškama. Razmotrite ove strategije:

Primjer:


function App() {
  return (
    
); }

U ovom primjeru, svaki veći dio aplikacije (Header, Sidebar, ContentArea, Footer) omotan je s Error Boundary komponentom. To omogućuje svakom dijelu da neovisno rukuje greškama, sprječavajući da jedna greška utječe na cijelu aplikaciju.

Prilagodba zamjenskog korisničkog sučelja (Fallback UI)

Zamjensko korisničko sučelje koje prikazuje Error Boundary trebalo bi biti informativno i prilagođeno korisniku. Razmotrite ove smjernice:

Primjer:


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

  static getDerivedStateFromError(error) {
    // Ažurirajte stanje kako bi sljedeći render prikazao zamjensko korisničko sučelje.
    return { hasError: true };
  }

  componentDidCatch(error, info) {
    // Grešku možete zabilježiti i u servisu za izvještavanje o greškama
    console.error("Uhvaćena je greška: ", error, info.componentStack);
  }

  render() {
    if (this.state.hasError) {
      // Možete renderirati bilo koje prilagođeno zamjensko korisničko sučelje
      return (
        

Ups! Nešto je pošlo po zlu.

Žao nam je, ali dogodila se greška prilikom pokušaja prikaza ovog sadržaja.

Molimo vas da pokušate osvježiti stranicu ili kontaktirate podršku ako se problem nastavi.

Kontaktiraj podršku
); } return this.props.children; } }

Ovaj primjer prikazuje informativnije zamjensko korisničko sučelje koje uključuje jasnu poruku o grešci, predložena rješenja i poveznice za osvježavanje stranice i kontaktiranje podrške.

Upravljanje različitim vrstama grešaka

Error Boundaries hvataju greške koje se javljaju tijekom renderiranja, u metodama životnog ciklusa i u konstruktorima cijelog stabla ispod njih. One *ne* hvataju greške za:

Za rukovanje ovim vrstama grešaka, morate koristiti različite tehnike.

Rukovatelji događajima (Event Handlers)

Za greške koje se javljaju u rukovateljima događajima, koristite standardni try...catch blok:


function MyComponent() {
  const handleClick = () => {
    try {
      // Kod koji bi mogao baciti grešku
      throw new Error("Nešto je pošlo po zlu u rukovatelju događaja");
    } catch (error) {
      console.error("Greška u rukovatelju događaja: ", error);
      // Rukujte greškom (npr., prikažite poruku o grešci)
      alert("Dogodila se greška. Molimo pokušajte ponovno.");
    }
  };

  return ;
}

Asinkroni kod

Za greške koje se javljaju u asinkronom kodu, koristite try...catch blokove unutar asinkrone funkcije:


function MyComponent() {
  useEffect(() => {
    async function fetchData() {
      try {
        const response = await fetch("https://api.example.com/data");
        const data = await response.json();
        // Obradite podatke
        console.log(data);
      } catch (error) {
        console.error("Greška pri dohvaćanju podataka: ", error);
        // Rukujte greškom (npr., prikažite poruku o grešci)
        alert("Dohvaćanje podataka nije uspjelo. Molimo pokušajte ponovno kasnije.");
      }
    }

    fetchData();
  }, []);

  return 
Učitavanje podataka...
; }

Alternativno, možete koristiti globalni mehanizam za rukovanje greškama za neobrađena odbijanja obećanja (unhandled promise rejections):


window.addEventListener('unhandledrejection', function(event) {
  console.error('Neobrađeno odbijanje (obećanje: ', event.promise, ', razlog: ', event.reason, ');');
  // Opcionalno prikažite globalnu poruku o grešci ili zabilježite grešku u servisu
  alert("Dogodila se neočekivana greška. Molimo pokušajte ponovno kasnije.");
});

Napredne tehnike s Error Boundaries

Resetiranje Error Boundary komponente

U nekim slučajevima, možda ćete htjeti pružiti korisnicima način da resetiraju Error Boundary i ponovno pokušaju operaciju koja je uzrokovala grešku. To može biti korisno ako je greška uzrokovana privremenim problemom, poput mrežnog problema.

Da biste resetirali Error Boundary, možete koristiti biblioteku za upravljanje stanjem poput Reduxa ili Contexta za upravljanje stanjem greške i pružanje funkcije za resetiranje. Alternativno, možete koristiti jednostavniji pristup prisiljavanjem Error Boundary komponente da se ponovno montira.

Primjer (Prisilno ponovno montiranje):


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

  static getDerivedStateFromError(error) {
    // Ažurirajte stanje kako bi sljedeći render prikazao zamjensko korisničko sučelje.
    return { hasError: true };
  }

  componentDidCatch(error, info) {
    // Grešku možete zabilježiti i u servisu za izvještavanje o greškama
    console.error("Uhvaćena je greška: ", 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) {
      // Možete renderirati bilo koje prilagođeno zamjensko korisničko sučelje
      return (
        

Ups! Nešto je pošlo po zlu.

Žao nam je, ali dogodila se greška prilikom pokušaja prikaza ovog sadržaja.

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

U ovom primjeru, 'key' je dodan omotačkom divu. Promjena ključa prisiljava komponentu da se ponovno montira, čime se učinkovito briše stanje greške. Metoda `resetError` ažurira stanje `key` komponente, uzrokujući ponovno montiranje komponente i ponovno renderiranje njezine podređene djece.

Korištenje Error Boundaries sa Suspenseom

React Suspense vam omogućuje da "suspendirate" renderiranje komponente dok se ne ispuni neki uvjet (npr. dohvate se podaci). Možete kombinirati Error Boundaries sa Suspenseom kako biste pružili robusnije iskustvo rukovanja greškama za asinkrone operacije.


import React, { Suspense } from 'react';

function MyComponent() {
  return (
    
      Učitavanje...
}> ); } function DataFetchingComponent() { const data = useData(); // Prilagođeni hook koji asinkrono dohvaća podatke return
{data.value}
; }

U ovom primjeru, DataFetchingComponent dohvaća podatke asinkrono koristeći prilagođeni hook. Komponenta Suspense prikazuje indikator učitavanja dok se podaci dohvaćaju. Ako se tijekom procesa dohvaćanja podataka dogodi greška, ErrorBoundary će uhvatiti grešku i prikazati zamjensko korisničko sučelje.

Najbolje prakse za React Error Boundaries

Primjeri iz stvarnog svijeta

Evo nekoliko primjera iz stvarnog svijeta kako se Error Boundaries mogu koristiti:

Alternative za Error Boundaries

Iako su Error Boundaries preporučeni način za rukovanje greškama u Reactu, postoje neki alternativni pristupi koje možete razmotriti. Međutim, imajte na umu da ove alternative možda neće biti toliko učinkovite kao Error Boundaries u sprječavanju rušenja aplikacije i pružanju besprijekornog korisničkog iskustva.

U konačnici, Error Boundaries pružaju robustan i standardiziran pristup rukovanju greškama u Reactu, što ih čini preferiranim izborom za većinu slučajeva upotrebe.

Zaključak

React Error Boundaries su neophodan alat za izgradnju robusnih i korisnički prilagođenih React aplikacija. Hvatanjem grešaka i prikazivanjem zamjenskih korisničkih sučelja, oni sprječavaju rušenje aplikacije, poboljšavaju korisničko iskustvo i pojednostavljuju otklanjanje grešaka. Slijedeći najbolje prakse navedene u ovom vodiču, možete učinkovito implementirati Error Boundaries u svoje aplikacije i stvoriti otpornije i pouzdanije korisničko iskustvo za korisnike diljem svijeta.