Eesti

Võtke omaks React'i vigade piirid, et luua vastupidavaid ja kasutajasõbralikke rakendusi. Õppige parimaid tavasid, rakendusmeetodeid ja arenenud vigade käsitlemise strateegiaid.

React'i vigade piirid: graatsilised vigade käsitlemise tehnikad tugevate rakenduste jaoks

Veebi arenduse dünaamilises maailmas on oluline luua vastupidavaid ja kasutajasõbralikke rakendusi. React, populaarne JavaScripti teek kasutajaliideste loomiseks, pakub võimsat mehhanismi vigade graatsiliseks käsitlemiseks: vigade piirid. See põhjalik juhend sukeldub vigade piiride kontseptsiooni, uurides nende eesmärki, rakendamist ja parimaid tavasid vastupidavate React'i rakenduste loomiseks.

Vigade piiride vajaduse mõistmine

React'i komponendid on nagu iga kood, vastuvõtlikud vigadele. Need vead võivad tuleneda erinevatest allikatest, sealhulgas:

Ilma õige vigade käsitlemiseta võib React'i komponendi viga põhjustada kogu rakenduse kokkuvarisemise, mille tulemuseks on halb kasutajakogemus. Vigade piirid pakuvad võimalust neid vigu kinni püüda ja takistada nende levikut komponentide puus, tagades, et rakendus jääb funktsionaalseks isegi siis, kui üksikud komponendid ebaõnnestuvad.

Mis on React'i vigade piirid?

Vigade piirid on React'i komponendid, mis püüavad JavaScripti vigu kinni kõikjal oma lapse komponentide puus, logivad need vead ja kuvavad kokkuvarisenud komponentide puu asemel tagasivõtte UI. Need toimivad turvavõrguna, takistades vigadel kogu rakendust kokku kukkumast.

Vigade piiride peamised omadused:

Vigade piiride rakendamine

Kõndigem läbi põhilise vigade piiri komponendi loomise protsess:

1. Vigade piiri komponendi loomine

Esiteks looge uus klassikomponent, näiteks nimega ErrorBoundary:


import React from 'react';

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

  static getDerivedStateFromError(error) {
    // Uuenda olekut, et järgmine renderdus kuvaks tagasivõtte UI.
    return {
      hasError: true
    };
  }

  componentDidCatch(error, errorInfo) {
    // Samuti saate vea logida veaaruandlusteenusesse
    console.error("Püütud viga: ", error, errorInfo);
    // Näide: logErrorToMyService(error, errorInfo);
  }

  render() {
    if (this.state.hasError) {
      // Saate renderdada suvalist kohandatud tagasivõtte UI-d
      return (
        <div>
          <h2>Midagi läks valesti.</h2>
          <details style={{ whiteSpace: 'pre-wrap' }}>
            {this.state.error && this.state.error.toString()}
            <br />
            {this.state.errorInfo.componentStack}
          </details>
        </div>
      );
    }

    return this.props.children; 
  }
}

export default ErrorBoundary;

Selgitus:

2. Vigade piiri kasutamine

Vigade piiri kasutamiseks mähkige lihtsalt kõik komponendid, mis võivad vea visata, ErrorBoundary komponendiga:


import ErrorBoundary from './ErrorBoundary';

function MyComponent() {
  // See komponent võib vea visata
  return (
    <ErrorBoundary>
      <PotentiallyBreakingComponent />
    </ErrorBoundary>
  );
}

export default MyComponent;

Kui PotentiallyBreakingComponent viskab vea, püüab ErrorBoundary selle kinni, logib vea ja renderdab tagasivõtte UI.

3. Illustreerivad näited globaalse kontekstiga

Võtke arvesse e-kaubanduse rakendust, mis kuvab tooteinfot, mis on hangitud kaugserverist. Komponent ProductDisplay vastutab toote üksikasjade renderdamise eest. Kuid server võib aeg-ajalt tagastada ootamatuid andmeid, mis põhjustavad renderdamisvigu.


// ProductDisplay.js
import React from 'react';

function ProductDisplay({ product }) {
  // Simuleerige potentsiaalset viga, kui product.price ei ole number
  if (typeof product.price !== 'number') {
    throw new Error('Vigane toote hind');
  }

  return (
    <div>
      <h2>{product.name}</h2>
      <p>Hind: {product.price}</p>
      <img src={product.imageUrl} alt={product.name} />
    </div>
  );
}

export default ProductDisplay;

Selliste vigade eest kaitsmiseks mähkige ProductDisplay komponent ErrorBoundary komponendiga:


// App.js
import React from 'react';
import ErrorBoundary from './ErrorBoundary';
import ProductDisplay from './ProductDisplay';

function App() {
  const product = {
    name: 'Näidistoode',
    price: 'Mitte number', // Tahtlikult vale andmed
    imageUrl: 'https://example.com/image.jpg'
  };

  return (
    <div>
      <ErrorBoundary>
        <ProductDisplay product={product} />
      </ErrorBoundary>
    </div>
  );
}

export default App;

Selle stsenaariumi puhul, kuna product.price on tahtlikult seatud stringiks numbri asemel, viskab ProductDisplay komponent vea. ErrorBoundary püüab selle vea kinni, takistades kogu rakenduse kokkuvarisemist ja kuvab tagasivõtte UI rikutud ProductDisplay komponendi asemel.

4. Vigade piirid rahvusvahelistatud rakendustes

Globaalse publiku jaoks rakenduste loomisel tuleks veateated lokaliseerida, et pakkuda paremat kasutajakogemust. Vigade piire saab kasutada koos rahvusvahelistamise (i18n) teekidega tõlgitud veateadete kuvamiseks.


// ErrorBoundary.js (koos i18n toega)
import React from 'react';
import { useTranslation } from 'react-i18next'; // Eeldades, et kasutate react-i18next

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

  static getDerivedStateFromError(error) {
    return {
      hasError: true,
      error: error,
    };
  }

  componentDidCatch(error, errorInfo) {
    console.error("Püütud viga: ", error, errorInfo);
    this.setState({errorInfo: errorInfo});
  }

  render() {
    if (this.state.hasError) {
      return (
        <FallbackUI error={this.state.error} errorInfo={this.state.errorInfo}/>
      );
    }

    return this.props.children;
  }
}

const FallbackUI = ({error, errorInfo}) => {
  const { t } = useTranslation();

  return (
    <div>
      <h2>{t('error.title')}</h2>
      <p>{t('error.message')}</p>
      <details style={{ whiteSpace: 'pre-wrap' }}>
        {error && error.toString()}<br />
        {errorInfo?.componentStack}
      </details>
    </div>
  );
}


export default ErrorBoundary;

Selles näites kasutame react-i18next, et tõlkida veapealkirja ja -sõnumi tagasivõtte UI-s. t('error.title') ja t('error.message') funktsioonid toovad õiged tõlked tagasi, lähtudes kasutaja valitud keelest.

5. Kaalutlused serveripoolse renderdamise (SSR) jaoks

Vigade piiride kasutamisel serveripoolselt renderdatud rakendustes on väga oluline vigu õigesti käsitleda, et vältida serveri kokkuvarisemist. React'i dokumentatsioon soovitab teil vältida vigade piiride kasutamist renderdamisvigadest taastumiseks serveris. Selle asemel käsitlege vigu enne komponendi renderdamist või renderdage serveris staatiline vealeht.

Parimad tavad vigade piiride kasutamisel

Täpsemad vigade käsitlemise strateegiad

1. Kordusmehhanismid

Mõnel juhul on võimalik vea korral taastuda, korrates seda põhjustanud toimingut. Näiteks kui võrgu päring nurjub, võiksite seda pärast lühikest viivitust uuesti proovida. Vigade piire saab kombineerida kordusmehhanismidega, et pakkuda vastupidavamat kasutajakogemust.


// ErrorBoundaryWithRetry.js
import React from 'react';

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

  static getDerivedStateFromError(error) {
    return {
      hasError: true,
    };
  }

  componentDidCatch(error, errorInfo) {
    console.error("Püütud viga: ", error, errorInfo);
  }

  handleRetry = () => {
    this.setState(prevState => ({
      hasError: false,
      retryCount: prevState.retryCount + 1,
    }), () => {
      // See sunnib komponenti uuesti renderdama. Mõelge parematele mustritele kontrollitud rekvisiitidega.
      this.forceUpdate(); // HOIATUS: kasutage ettevaatusega
      if (this.props.onRetry) {
          this.props.onRetry();
      }
    });
  };

  render() {
    if (this.state.hasError) {
      return (
        <div>
          <h2>Midagi läks valesti.</h2>
          <button onClick={this.handleRetry}>Proovi uuesti</button>
        </div>
      );
    }

    return this.props.children;
  }
}

export default ErrorBoundaryWithRetry;

Komponent ErrorBoundaryWithRetry sisaldab nuppu Uuesti proovimine, mis vajutamisel lähtestab oleku hasError ja renderdab lastetekomponendid uuesti. Samuti saate lisada retryCount korduskatsete arvu piiramiseks. See lähenemisviis võib olla eriti kasulik mööduvate vigade, näiteks ajutiste võrguühenduse katkestuste korral. Veenduge, et rekvisiit `onRetry` on vastavalt käsitletud ja hangib/teostab uuesti loogika, mis oleks võinud viga põhjustada.

2. Funktsiooni lipud

Funktsioonilipud võimaldavad teil rakenduses funktsioone dünaamiliselt lubada või keelata, ilma uut koodi juurutamata. Vigade piire saab kasutada koos funktsiooni lippudega funktsionaalsuse graatsiliseks degradeerimiseks vea korral. Näiteks kui konkreetne funktsioon põhjustab vigu, saate selle funktsiooni lipu abil keelata ja kuvada kasutajale teate, mis näitab, et funktsioon on ajutiselt kättesaamatu.

3. Voolukatkesti muster

Voolukatkesti muster on tarkvaradisaini muster, mida kasutatakse selleks, et takistada rakendusel korduvalt proovida sooritada toimingut, mis tõenäoliselt ebaõnnestub. See toimib, jälgides toimingu edu ja ebaõnnestumise määra ja "voolu katkestamist" ületades teatava piirmäära, takistades edasisi katseid toimingut teostada teatud aja jooksul. See võib aidata vältida kaskaadseid ebaõnnestumisi ja parandada rakenduse üldist stabiilsust.

Vigade piire saab kasutada voolukatkesti mustri rakendamiseks React'i rakendustes. Kui vigade piir püüab vea kinni, saab see suurendada ebaõnnestumiste loendurit. Kui ebaõnnestumiste loendur ületab piirväärtuse, saab vigade piir kuvada kasutajale teate, mis näitab, et funktsioon on ajutiselt kättesaamatu, ja takistada edasisi katseid toimingut teostada. Pärast teatud aja möödumist saab vigade piir "voolu katkestada" ja lubada katseid toimingut uuesti teostada.

Järeldus

React'i vigade piirid on oluline tööriist vastupidavate ja kasutajasõbralike rakenduste loomiseks. Vigade piiride rakendamisega saate takistada vigadel kogu rakenduse kokkuvarisemist, pakkuda oma kasutajatele graatsilist tagasivõtte UI-d ja logida vigu jälgimisteenustesse silumiseks ja analüüsiks. Järgides selles juhendis kirjeldatud parimaid tavasid ja arenenud strateegiaid, saate luua React'i rakendusi, mis on vastupidavad, usaldusväärsed ja pakuvad positiivset kasutajakogemust isegi ootamatute vigade korral. Pidage meeles, et keskenduge kasulike veateadete esitamisele, mis on lokaliseeritud ülemaailmsele vaatajaskonnale.