Jak na chyby v Reactu – Error boundaries

React level upPokud Vás horké léto nedonutilo přesunout se k vodě, rád bych Vám v následujícím článku předvedl zajímavé kouzlo s Reactem, díky kterému lze snadno posunout Vaši aplikaci o úroveň výše a dopřát uživatelům lepší user-experience. Nejedná se přitom o žádné šílené úpravy, které Vás donutí zrefactorovat celou aplikaci. Zadarmo ale ani pes nehrabe, znáte to. Také jste se setkali s tím, že chyba v komponentě způsobí pád celé aplikace a uživatelé vidí jen bílou obrazovku? V takovém případě Vám pomůžou error boundaries.

Error boundaries

Velmi šikovná nenápadná věcička, která se ukázala s příchodem Reactu 16. Pokud provozujete nějakou react appku, určitě jste se již setkali s tím, že chyba v nějaké komponentě způsobila pád celé aplikace. Došlo k zastavení běhu javascriptu a appka se vůbec nevyrenderovala. Uživatel v takovém případě vidí téměř to nejhorší co může být – bílou stránku. Horší je už jen reklama na Alzu.

Uvažujme následující komponentu

import React, { Component } from 'react'

class Error extends Component {
  render () {
    throw new Error('React whitepage generator...')
  }
}

export default Error

Abych citoval mého kamaráda:

„Chceš, nechceš, máš ji.“ (kamarád s vyholenou hlavou)

Whitepage samozřejmě…

Whitepage – Error in React component

Jako bonus vlastně vůbec nezáleží, jestli je tato komponenta první, druhá nebo poslední. Pád komponenty rozhodí Váš javascript stejně jako Vaše plány na dovolenou, když Vám uletí letadlo do Bologny a vy musíte jet 14 hodin flixbusem a přitom psát články na blog. True story.

Řešení je přitom velmi jednoduché

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

  componentDidCatch(error, info) {
    this.setState({ hasError: true });
  }

  render() {
    if (this.state.hasError) {
      return <h1>Something went wrong.</h1>;
    }
    return this.props.children;
  }
}

Všechny Vaše komponenty potom obalíte touto zachytávací komponentou

<ErrorBoundary>
  <Error />
</ErrorBoundary>

Jako zázrakem potom v případě chyby dojde k zobrazení záložního obsahu a chyba nemá žádný vliv na zobrazení zbytku stránky. Vaši návštěvníci mohou čerpat ostatní obsah, jedna chybějící komponenta je určitě lepší než bílá stránka. Nebo ne?

Reactu a Raynaru zdar.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *