React.Component — třídní komponenty a jak fungují

Autor: IT Sectr Publikováno: 2026-07-04 Doba čtení: 9 min

React.Component — základní třída pro vytváření komponent pomocí dědičnosti v Reactu. Před příchodem hooks ve verzi 16.8 byly třídní komponenty jediným způsobem, jak spravovat stav a životní cyklus. Podle React, 2024 jsou třídní komponenty stále podporovány, i když funkcionální komponenty s hooks jsou doporučeny pro nové projekty.

Hlavní body

  • React.Component — základní třída, od které třídní komponenty dědí pomocí extends Component.
  • Stav je spravován přes this.state a aktualizován pouze přes this.setState — přímá mutace je zakázána.
  • Životní cyklus zahrnuje metody componentDidMount, componentDidUpdate a componentWillUnmount.
  • this v metodách třídy vyžaduje vázání kontextu — přes bind, šipkové funkce nebo class fields.
  • Migrace na funkcionální komponenty je možná postupně: hooks a třídy mohou koexistovat v jednom projektu.

Co je React.Component?

React.Component — abstraktní třída, která poskytuje vestavěné metody pro práci se stavem, props a životním cyklem komponentu. K vytvoření třídního komponentu je třeba definovat třídu, která dědí z React.Component, a implementovat metodu render.

React.Component se objevil v úplně první verzi Reactu (2013) a zůstal hlavním způsobem vytváření komponent po dobu pěti let. Ekosystém Reactu byl postaven kolem tříd: komponenty vyššího řádu (HOC), render props, kontext — všechny tyto vzory byly implementovány pomocí třídní syntaxe.

S vydáním React 16.8 v roce 2019 představil tým Reactu hooks jako alternativu k třídám. Hooks řešily stejné úkoly — stav, efekty, kontext — ale bez dědičnosti a složitého vázání kontextu. React.Component zůstává plně podporován, ale pro nové projekty se doporučuje funkcionální přístup.

Vytvoření třídního komponentu

Minimální třídní komponent — třída s jedinou metodou render, která vrací React element. render — jediná povinná metoda. Měla by být čistou funkcí this.props a this.state: stejná sada props a stavu dává stejný výsledek.

js
import React, { Component } from 'react';

class Welcome extends Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

Konstruktor a inicializace stavu

Konstruktor se provádí před mountováním. V něm se volá super(props) pro předání props rodičovské třídě a inicializuje se this.state. Použití konstruktoru pro jiné účely — odběry, API volání — se nedoporučuje: k tomu slouží componentDidMount.

js
class Counter extends Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }

  render() {
    return <p>Count: {this.state.count}</p>;
  }
}

Správa stavu přes this.state a this.setState

this.state — objekt obsahující data komponentu. Přímá změna (this.state.count = 1) je zakázána — nezpůsobuje překreslení a narušuje předvídatelnost. Stav je třeba aktualizovat přes this.setState, který vytvoří nový objekt stavu a spustí překreslení.

setState může přijmout objekt nebo funkci. Funkcionální forma je preferována, když nový stav závisí na předchozím: this.setState(prev => ({ count: prev.count + 1 })). React může seskupit několik setState volání do jednoho batch pro optimalizaci výkonu.

js
class Toggle extends Component {
  constructor(props) {
    super(props);
    this.state = { isOn: false };
  }

  handleClick() {
    this.setState(prev => ({ isOn: !prev.isOn }));
  }

  render() {
    return (
      <button onClick={() => this.handleClick()}>
        {this.state.isOn ? 'ON' : 'OFF'}
      </button>
    );
  }
}

Důležitá vlastnost setState — je asynchronní. Po zavolání setState se stav neaktualizuje okamžitě. Pokud potřebujete provést akci po aktualizaci, předejte callback jako druhý argument: this.setState(newState, () => console.log(this.state)).

Metody životního cyklu

Třídní komponenty mají předdefinované metody, které React volá v určitých okamžicích. Mountování — constructor → render → componentDidMount. Aktualizace — render → componentDidUpdate. Odmountování — componentWillUnmount.

MetodaFázeÚčel
constructorMountováníInicializace state a vázání metod
renderPokaždéVracení React elementů (povinné)
componentDidMountPo mountováníAPI požadavky, odběry, časovače
componentDidUpdatePo aktualizaciReakce na změnu props/stavu
componentWillUnmountPřed odstraněnímČištění odběrů, časovačů, odhlášení z událostí

ComponentDidMount — načtení dat

componentDidMount — hlavní místo pro vedlejší účinky po prvním vykreslení. Zde se provádějí HTTP požadavky, navazují WebSocket spojení a spouštějí časovače. Pokud nevyčistíte odběr v componentWillUnmount, dojde k úniku paměti.

js
class UserProfile extends Component {
  componentDidMount() {
    fetch(`/api/users/${this.props.userId}`)
      .then(res => res.json())
      .then(data => this.setState({ user: data }));
  }

  componentWillUnmount() {
    // Zrušit požadavek při odmountování
  }

  render() {
    return <div>{this.state.user?.name}</div>;
  }
}

Vázání kontextu this v metodách

V JavaScriptu nejsou metody třídy standardně navázány na instanci. Pokud předáte metodu jako callback — handleru události, časovači — this bude undefined (v přísném režimu) nebo window (bez přísného režimu). Bez vázání vyhodí this.setState chybu.

Existují tři způsoby vázání: bind v konstruktoru, šipková funkce v callbacku a class field se šipkovou funkcí. První způsob — oficiální doporučení Reactu: bind jednou v konstruktoru, bez opětovného vytváření funkce při každém vykreslení.

js
// Metoda 1: bind v konstruktoru (doporučeno)
class MyComponent extends Component {
  constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState({ clicked: true });
  }

  render() {
    return <button onClick={this.handleClick}>Click</button>;
  }
}

Class field — moderní syntaxe s automatickým vázáním. Šipková funkce ve vlastnosti třídy zachycuje this z rozsahu viditelnosti konstruktoru. Nevýhoda — metoda se vytváří na každé instanci, nikoli na prototypu, což zvyšuje paměť pro stovky komponent stejného typu.

Srovnání třídních a funkcionálních komponent

Volba mezi třídou a funkcí — není jen otázka syntaxe. Funkcionální komponenty s hooks řeší problémy vlastní třídám: duplikace logiky v různých metodách životního cyklu (componentDidMount + componentDidUpdate), složitost s this a nemožnost extrahovat související logiku do znovupoužitelného bloku.

Funkcionální komponenty se snáze testují — nemají vnitřní stav (který byl před hooks jen v třídách) a nevyžadují mountování v DOM pro kontrolu callbacků. React doporučuje funkcionální komponenty pro všechny nové projekty, dokumentace a příklady se píší na nich.

Třídní komponenty zůstávají nejlepší volbou při práci se starším kódem. Pokud byl projekt zahájen před rokem 2019, pravděpodobně obsahuje tisíce třídních komponent. Přepisování všech na hooks v jednom sprintu je riskantní. React zaručuje zpětnou kompatibilitu: třídní komponenty nebudou odstraněny.

Strategie migrace z tříd na hooks

Postupná migrace začíná analýzou komponentu. Jednoduché komponenty bez stavu (stateless) se překládají první — snadno se nahrazují funkcemi. Poté — komponenty s jedním až dvěma stavovými poli, kde useState přímo nahrazuje this.state a this.setState.

Složité komponenty s mnoha metodami životního cyklu se překládají přes useEffect. Logika z componentDidMount + componentDidUpdate se rozděluje do samostatných useEffect s různými závislostmi. componentWillUnmount se nahrazuje návratovou funkcí uvnitř useEffect. Pro složitou stavovou logiku použijte useReducer.

Nástroje automatické migrace — @phenomnomnominal/ts-react-class-to-hook nebo codemod skripty — mohou automaticky konvertovat jednoduché třídy. Pro složité případy zůstává migrace ruční prací, která vyžaduje pochopení logiky původního komponentu.

Často kladené otázky

Je volání super(props) v konstruktoru povinné?

Ano. super(props) předává props do nadřazeného React.Component. Bez tohoto volání bude this.props undefined uvnitř konstruktoru. V render a metodách životního cyklu jsou props dostupné i bez super, ale to je vedlejší efekt implementace.

Proč je setState asynchronní?

React seskupuje několik volání setState do jednoho batch pro snížení počtu zbytečných překreslení. Kdyby byl setState synchronní, každé volání by způsobilo okamžité vykreslení, snižující výkon při hromadných aktualizacích.

Lze použít hooks uvnitř třídního komponentu?

Ne. Hooks fungují pouze ve funkcionálních komponentech. Pro projekty s třídními komponenty jsou k dispozici všechny staré vzory: render props, HOC a Consumer pro kontext. Migrace na hooks vyžaduje transformaci třídy na funkci.

Co je PureComponent a čím se liší od Component?

React.PureComponent implementuje shouldComponentUpdate s mělkým (shallow) porovnáním props a stavu. Na rozdíl od Component, který vždy překresluje při setState, PureComponent přeskočí překreslení, pokud se data nezměnila. To je optimalizace pro komponenty bez složitého vnoření.

Jak zpracovat chybu v třídním komponentu?

Použijte componentDidCatch a getDerivedStateFromError. componentDidCatch(error, info) loguje chybu. getDerivedStateFromError aktualizuje state pro zobrazení fallback-UI. Tyto metody fungují pouze v třídních komponentech — funkce potřebují obalovací komponent ErrorBoundary.

Shrnutí

  • React.Component — základní třída pro komponenty s dědičností, stavem a metodami životního cyklu.
  • this.state se inicializuje v konstruktoru, aktualizuje se pouze přes this.setState — přímá mutace je zakázána.
  • componentDidMount — hlavní místo pro API požadavky, odběry a časovače po prvním vykreslení.
  • componentWillUnmount — povinné čištění odběrů a časovačů pro zabránění úniku paměti.
  • Vázání this je povinné: bind v konstruktoru — doporučený způsob pro callback metody.
  • Hooks nahradily třídní komponenty pro nové projekty, ale třídy zůstávají plně podporovány.
  • Migrace na hooks se provádí postupně: stateless komponenty jako první, složité — přes useReducer a useEffect.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také