Funkční komponenty v React — moderní standard vývoje

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

Functional Component — je způsob vytváření React komponent pomocí běžných JavaScriptových funkcí, který se stal standardem po vydání React 16.8 a příchodu hooků. Funkční komponenty přijímají props a vracejí React elementy, aniž by vyžadovaly dědění od React.Component. Podle údajů React, 2024 je 97 % nových komponent v ekosystému React napsáno jako funkce.

Hlavní body

  • Functional Component — běžná JavaScriptová funkce přijímající props a vracející JSX, bez extends Component.
  • Hooky (useState, useEffect, useContext) dávají funkčním komponentám plný přístup ke stavu a životnímu cyklu.
  • Čitelnost — funkční komponenty jsou kratší než třídní, bez konstruktoru, bind a zbytečných metod životního cyklu.
  • Výkon — React optimalizuje funkční komponenty pomocí memoizace a líné inicializace.
  • Doporučení React — všechny nové projekty by měly používat pouze funkční komponenty s hooky.

Co je Functional Component?

Functional Component (funkční komponenta) — je React komponenta definovaná jako funkce, která přijímá objekt props a vrací React element. Před React 16.8 se takové komponenty nazývaly stateless (bez stavu), protože nemohly spravovat vnitřní stav.

S příchodem hooků v React 16.8 (únor 2019) získaly funkční komponenty přístup ke stavu (useState), vedlejším efektům (useEffect), kontextu (useContext) a referencím (useRef). Termín „stateless" je zastaralý — moderní funkční komponenty plně spravují stav.

React oficiálně doporučuje funkční komponenty jako hlavní způsob vytváření komponent. Veškerá dokumentace na react.dev, příklady, tutoriály a nová API (Server Components, Actions) jsou postaveny na funkčním přístupu. Třídní komponenty nebyly odstraněny, ale nové možnosti React jsou dostupné pouze přes hooky.

Vytvoření funkční komponenty

Nejjednodušší funkční komponenta — funkce vracející JSX. Přijímá props jako argument, nevyžaduje konstruktor, volání super ani vázání this. Props jsou dostupné přímo přes argument funkce — bez this.props.

js
// Functional component without state
function Greeting({ name }) {
  return <h1>Hello, {name}!</h1>;
}

// Arrow function (common variant)
const Greeting = ({ name }) => (
  <h1>Hello, {name}!</h1>
);

Komponenta se stavem

Pro přidání stavu použijte useState. Hook vrací dvojici hodnot: aktuální stav a setter funkci. Na rozdíl od třídního this.setState, useState nahrazuje hodnotu zcela, neslučuje ji s předchozí.

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

function Counter() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Increment
      </button>
    </div>
  );
}

Hooky ve funkčních komponentách

Hooky jsou základem moderního React. Každý hook řeší konkrétní úkol: useState — stav, useEffect — vedlejší efekty, useContext — přístup ke kontextu, useRef — reference na DOM elementy, useCallback a useMemo — memoizace.

useEffect pro vedlejší efekty

useEffect současně nahrazuje componentDidMount, componentDidUpdate a componentWillUnmount. První argument — callback s efektem, druhý — pole závislostí. Pokud je pole prázdné, efekt se provede jednou po připojení. Pokud jsou závislosti uvedeny — při každé změně kterékoli z nich.

js
import React, { useState, useEffect } from 'react';

function UserData({ userId }) {
  const [user, setUser] = useState(null);

  useEffect(() => {
    let cancelled = false;

    fetch(`/api/users/${userId}`)
      .then(res => res.json())
      .then(data => {
        if (!cancelled) setUser(data);
      });

    // Cleanup - analog of componentWillUnmount
    return () => { cancelled = true; };
  }, [userId]); // Dependency

  return <div>{user?.name}</div>;
}

Vlastní hooky

Hlavní výhoda funkčních komponent — znovupoužití logiky prostřednictvím vlastních hooků. Pokud se v třídní komponentě logika duplikovala mezi componentDidMount a componentDidUpdate, ve funkční se extrahuje do samostatné funkce s prefixem use. Vlastní hooky jsou hlavní alternativou k HOC a render props.

Kompozice místo dědičnosti

React doporučuje kompozici, nikoli dědičnost, pro znovupoužití kódu mezi komponentami. Funkční komponenty jsou ideální pro kompozici: jedna komponenta může obsahovat několik dalších a předávat jim props a children.

Vzor children — když komponenta přijímá potomky přes prop children — je implementován přirozeně: function Layout({ children }). Analogie slots z Vue je implementována pomocí pojmenovaných props-komponent: function Page({ header, sidebar, content }).

Dědičnost se v React prakticky nepoužívá. Dokonce i třídní komponenty, které technicky podporují extends, zřídka tvoří hierarchie hlubší než jednu úroveň. Funkční komponenty s kompozicí plně pokrývají potřeby znovupoužití kódu bez dědičnosti.

Optimalizace výkonu

Funkční komponenty mají vestavěné mechanismy optimalizace. React.memo — analog PureComponent pro funkce: zabraňuje opětovnému vykreslení, pokud se props nezměnily (mělké porovnání). useMemo ukládá do mezipaměti výsledek výpočtů mezi vykresleními.

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

// React.memo - memoize component
const ExpensiveList = React.memo(({ items }) => {
  return <ul>
    {items.map(item =>
      <li key={item.id}>{item.name}</li>
    )}
  </ul>;
});

// useMemo - caching result
function Dashboard({ transactions }) {
  const summary = useMemo(() => {
    return transactions.reduce((acc, t) => acc + t.amount, 0);
  }, [transactions]);

  return <p>Total: {summary}</p>;
}

useCallback memoizuje callback funkce, aby nebyly znovu vytvářeny při každém vykreslení. To je kritické při předávání funkcí potomkům zabaleným v React.memo: bez useCallback se potomek bude vykreslovat pokaždé, protože reference na funkci se mění.

Srovnání funkčních a třídních komponent

Rozdíl mezi přístupy přesahuje syntaxi. Funkční komponenty — jsou uzávěrem: stav a efekty jsou vázány na konkrétní vykreslení. Třídní komponenty — jsou this: stav je vždy získáván z this.state, který může být v okamžiku provedení asynchronního callbacku zastaralý.

AspektFunkčníTřídní
StavuseState (izolovaný)this.state + this.setState
EfektyuseEffect se závislostmicomponentDidMount + componentDidUpdate
KontextuseContextContext.Consumer nebo static contextType
OptimalizaceReact.memo + useMemoPureComponent + shouldComponentUpdate
Znovupoužití logikyVlastní hookyHOC / Render props
thisNebind v konstruktoru

Funkční komponenty poskytují lineární tok provádění. V třídní komponentě je související logika často rozptýlena po několika metodách životního cyklu. Například předplatné WebSocket se nastavuje v componentDidMount a odstraňuje v componentWillUnmount. Ve funkční komponentě jsou obě operace — v jednom useEffect s funkcí čištění.

TypeScript a funkční komponenty

TypeScript s funkčními komponentami pracuje přirozeněji než s třídami. Typování props — rozhraní pro argument funkce. Typ návratové hodnoty — JSX.Element nebo ReactNode. useState automaticky odvodí typ z počáteční hodnoty.

ts
import React, { useState } from 'react';

interface ButtonProps {
  label: string;
  variant?: 'primary' | 'secondary';
  onClick: () => void;
}

const Button: React.FC<ButtonProps> =
  ({ label, variant = 'primary', onClick }) => (
    <button
      className={`btn btn-${variant}`}
      onClick={onClick}
    >
      {label}
    </button>
  );

Moderní TypeScript umožňuje typování useReducer s diskriminovanými union typy, Generics ve vlastních hookách a přísnou kontrolu children pomocí React.PropsWithChildren. Funkční komponenty s TypeScript poskytují úplnou typovou bezpečnost bez dalších abstrakcí.

Často kladené otázky

Proč React doporučuje funkční komponenty?

Funkční komponenty jsou jednodušší: není konstruktor, bind, this a rozptýlené metody životního cyklu. Hooky umožňují seskupovat související logiku. React investuje prostředky do vývoje hooků, nikoli tříd. Server Components a nové funkce jsou dostupné pouze ve funkcích.

Lze použít setInterval ve funkční komponentě?

Ano, přes useEffect s časovačem uvnitř a funkcí čištění pro clearInterval. Dávejte pozor na uzávěr: pokud tikáte počítadlo, použijte funkční formu setState: setCount(c => c + 1), abyste nezáviseli na staré hodnotě v uzávěru.

Jak získat předchozí props ve funkční komponentě?

Použijte useRef k uložení předchozí hodnoty. Aktualizujte ref v useEffect po každém vykreslení. Pro vizuální srovnání pomáhá vlastní hook usePrevious: const prev = usePrevious(value);

Čím se liší React.memo od useMemo?

React.memo — HOC pro memoizaci celé komponenty: zabraňuje opětovnému vykreslení, pokud se props nezměnily. useMemo — hook pro memoizaci konkrétní hodnoty uvnitř komponenty: ukládá do mezipaměti výsledek funkce mezi vykresleními na základě pole závislostí.

Jak simulovat getDerivedStateFromProps ve funkční komponentě?

Nejjednodušší způsob — useState s inicializací z props + useEffect se závislostí na props pro synchronizaci. Pro vzácné případy React doporučuje: použijte klíč (key) pro vynucené znovuvytvoření komponenty při změně vstupních dat.

Shrnutí

  • Functional Component — moderní standard React: funkce přijímající props a vracející JSX.
  • Hooky (useState, useEffect) dávají funkčním komponentám stav, efekty a kontext bez tříd.
  • Kompozice přes children a vlastní hooky nahrazuje dědičnost a HOC vzory.
  • React.memo a useMemo zajišťují optimalizaci výkonu funkčních komponent.
  • TypeScript s funkčními komponentami poskytuje přísné typování props a automatické odvozování typů.
  • useEffect nahrazuje všechny metody životního cyklu třídních komponent na jednom místě.
  • Vlastní hooky umožňují extrahovat a znovu používat logiku mezi komponentami bez HOC.

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é