Функционалне компоненте у React-у — савремени стандард развоја

Аутор: IT Sectr Објављено: 2026-07-04 Време читања: 9 мин

Functional Component — начин креирања React компоненти помоћу обичних JavaScript функција, који је постао стандард након изласка React 16.8 и појаве хоокова. Функционалне компоненте примају прос и враћају React елементе, не захтевајући наслеђивање од React.Component. Према подацима React, 2024, 97% нових компоненти у React екосистему се пише као функције.

Главно

  • Functional Component — обична JavaScript функција која прима прос и враћа ЈСX, без еxтендс Цомпонент.
  • Хоокови (усеСтате, усеЕффецт, усеЦонтеxт) дају функционалним компонентама пун приступ стању и животном циклусу.
  • Читљивост — функционалне компоненте су краће од класних, без конструктора, бинд-а и сувишних метода животног циклуса.
  • Перформансе — React оптимизује функционалне компоненте кроз мемоизацију и лењу иницијализацију.
  • Препорука React-а — сви нови пројекти треба да користе само функционалне компоненте са хооковима.

Шта је Functional Component?

Functional Component (функционална компонента) — React компонента дефинисана као функција, која прима прос објекат и враћа React елемент. Пре React 16.8 такве компоненте су се називале стателесс (без стања), јер нису могле да управљају унутрашњим стањем.

Са појавом хоокова у React 16.8 (фебруар 2019) функционалне компоненте су добиле приступ стању (усеСтате), бочним ефектима (усеЕффецт), контексту (усеЦонтеxт) и референцама (усеРеф). Термин „стателесс" је застарео — модерне функционалне компоненте у потпуности управљају стањем.

React званично препоручује функционалне компоненте као основни начин креирања компоненти. Цела документација на реацт.дев, примери, туторијали и нови АПИ-ји (Сервер Цомпонентс, Ацтионс) су засновани на функционалном приступу. Класне компоненте нису уклоњене, али нове могућности React-а су доступне само кроз хоокове.

Креирање функционалне компоненте

Најједноставнија функционална компонента — функција која враћа ЈСX. Она прима прос као аргумент, не захтева конструктор, позив супер или везивање тхис. Прос су доступни директно кроз аргумент функције — без тхис.прос.

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

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

Компонента са стањем

За додавање стања користите усеСтате. Хоок враћа пар вредности: тренутно стање и сеттер функцију. За разлику од класног тхис.сетСтате, усеСтате замењује вредност у целини, а не спаја са претходном.

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>
  );
}

Хоокови у функционалним компонентама

Хоокови су основа модерног React-а. Сваки хоок решава одређени задатак: усеСтате — стање, усеЕффецт — бочни ефекти, усеЦонтеxт — приступ контексту, усеРеф — референце на ДОМ елементе, усеЦаллбацк и усеМемо — мемоизација.

усеЕффецт за бочне ефекте

усеЕффецт истовремено замењује цомпонентДидМоунт, цомпонентДидУпдате и цомпонентWиллУнмоунт. Први аргумент — цоллбацк са ефектом, други — низ зависности. Ако је низ празан, ефекат се извршава једном након монтирања. Ако су зависности наведене — при свакој промени било које од њих.

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>;
}

Прилагођени хоокови

Главна предност функционалних компоненти — поновно коришћење логике кроз прилагођене хоокове. Ако се у класној компоненти логика дуплирала између цомпонентДидМоунт и цомпонентДидУпдате, у функционалној се извлачи у засебну функцију са префиксом усе. Прилагођени хоокови — главна алтернатива ХОЦ и рендер прос.

Композиција уместо наслеђивања

React препоручује композицију, а не наслеђивање за поновно коришћење кода између компоненти. Функционалне компоненте су идеалне за композицију: једна компонента може да садржи више других, преносећи им прос и цхилдрен.

Образац цхилдрен — када компонента прима елементе потомке кроз прос цхилдрен — имплементира се природно: function Layout({ children }). Аналогон слотс из Вуе-а имплементира се кроз именоване прос-компоненте: function Page({ header, sidebar, content }).

Наслеђивање у React-у практично се не користи. Чак и класне компоненте, које технички подржавају еxтендс, ретко формирају хијерархије дубље од једног нивоа. Функционалне компоненте са композицијом у потпуности покривају потребе за поновним коришћењем кода без наслеђивања.

Оптимизација перформанси

Функционалне компоненте имају уграђене механизме оптимизације. Реацт.мемо — аналогон ПуреЦомпонент за функције: спречава поновно рендеровање ако се прос нису променили (плитко поређење). усеМемо кешира резултат прорачуна између рендеровања.

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>;
}

усеЦаллбацк мемоизира функције повратног позива како се не би поново креирале при сваком рендеровању. Ово је критично при преношењу функција у компоненте потомке умотане у Реацт.мемо: без усеЦаллбацк, компонента потомак ће се поново рендеровати сваки пут, јер се референца на функцију мења.

Поређење функционалних и класних компоненти

Разлика између приступа превазилази синтаксу. Функционалне компоненте — су затворење: стање и ефекти су везани за конкретно рендеровање. Класне компоненте — су тхис: стање се увек узима из тхис.стате, који може бити застарео у тренутку извршења асинхроног повратног позива.

АспектФункционалнаКласна
СтањеусеСтате (изоловано)тхис.стате + тхис.сетСтате
ЕфектиусеЕффецт са зависностимацомпонентДидМоунт + цомпонентДидУпдате
КонтекстусеЦонтеxтЦонтеxт.Цонсумер или статиц цонтеxтТипе
ОптимизацијаРеацт.мемо + усеМемоПуреЦомпонент + схоулдЦомпонентУпдате
Поновно коришћење логикеПрилагођени хооковиХОЦ / Рендер прос
тхисНемабинд у конструктору

Функционалне компоненте пружају линеарни ток извршења. У класној компоненти повезана логика је често распршена по неколико метода животног циклуса. На пример, претплата на WебСоцкет се поставља у цомпонентДидМоунт и уклања у цомпонентWиллУнмоунт. У функционалној компоненти обе операције — у једном усеЕффецт са функцијом чишћења.

TypeScript и функционалне компоненте

TypeScript са функционалним компонентама ради природније него са класама. Типизација просова — интерфејс за аргумент функције. Тип повратне вредности — JSX.Element или ReactNode. усеСтате аутоматски изводи тип из почетне вредности.

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>
  );

Модерни TypeScript омогућава типизацију усеРедуцер са дискриминисаним унион типовима, Генерицс у прилагођеним хооковима и строгу проверу цхилдрен кроз React.PropsWithChildren. Функционалне компоненте са TypeScript-ом дају пуну безбедност типова без додатних апстракција.

Често постављана питања

Зашто React препоручује функционалне компоненте?

Функционалне компоненте су једноставније: нема конструктора, бинд, тхис и разбацаних метода животног циклуса. Хоокови омогућавају груписање повезане логике. React улаже ресурсе у развој хоокова, а не класа. Сервер Цомпонентс и нове функције доступне су само у функцијама.

Може ли се користити сетИнтервал у функционалној компоненти?

Да, кроз усеЕффецт са тајмером унутра и функцијом чишћења за цлеарИнтервал. Обратите пажњу на затворење: ако тикате бројач, користите функционалну форму сетСтате: setCount(c => c + 1), како не бисте зависили од старе вредности у затворењу.

Како добити претходне прос у функционалној компоненти?

Користите усеРеф за чување претходне вредности. Ажурирајте реф у усеЕффецт након сваког рендеровања. За визуелно поређење помаже прилагођени хоок усеПревиоус: const prev = usePrevious(value);

По чему се Реацт.мемо разликује од усеМемо?

Реацт.мемо — ХОЦ за мемоизацију целе компоненте: спречава поновно рендеровање ако се прос нису променили. усеМемо — хоок за мемоизацију одређене вредности унутар компоненте: кешира резултат функције између рендеровања на основу низа зависности.

Како имитирати гетДериведСтатеФромПрос у функционалној компоненти?

Најједноставнији начин — усеСтате са иницијализацијом из прос + усеЕффецт са зависношћу од прос за синхронизацију. За ретке случајеве React препоручује: користите кључ (кеy) за присилно поновно креирање компоненте при промени улазних података.

Закључак

  • Functional Component — савремени стандард React-а: функција која прима прос и враћа ЈСX.
  • Хоокови (усеСтате, усеЕффецт) дају функционалним компонентама стање, ефекте и контекст без класа.
  • Композиција кроз цхилдрен и прилагођене хоокове замењује наслеђивање и ХОЦ обрасце.
  • Реацт.мемо и усеМемо обезбеђују оптимизацију перформанси функционалних компоненти.
  • TypeScript са функционалним компонентама даје строгу типизацију просова и аутоматско извођење типова.
  • усеЕффецт замењује све методе животног циклуса класних компоненти на једном месту.
  • Прилагођени хоокови омогућавају извлачење и поновно коришћење логике између компоненти без ХОЦ.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође