Functional Component — React 16.8'in yayınlanması ve hook'ların ortaya çıkmasından sonra standart haline gelen, sıradan JavaScript işlevlerini kullanarak React bileşenleri oluşturmanın bir yoludur. Fonksiyonel bileşenler props alır ve React.Component'ten miras almadan React öğeleri döndürür. React, 2024'e göre, React ekosistemindeki yeni bileşenlerin %97'si işlev olarak yazılır.
Ana Noktalar
Functional Component, bir props nesnesini alan ve bir React öğesi döndüren bir işlev olarak tanımlanan React bileşenidir. React 16.8'den önce, bu bileşenler durumsuz olarak adlandırılırdı çünkü iç durumu yönetemiyorlardı.
React 16.8'de (Şubat 2019) hook'ların tanıtılmasıyla, fonksiyonel bileşenler duruma (useState), yan etkilere (useEffect), bağlama (useContext) ve referanslara (useRef) erişim kazandı. ‘Durumsuz’ terimi güncelliğini yitirdi — modern fonksiyonel bileşenler durumu tamamen yönetir.
React resmi olarak fonksiyonel bileşenleri bileşen oluşturmanın birincil yolu olarak önerir. react.dev'deki tüm dokümantasyon, örnekler, eğitimler ve yeni API'ler (Server Components, Actions) işlevsel yaklaşım üzerine inşa edilmiştir. Sınıf bileşenleri kaldırılmamıştır, ancak React'in yeni özellikleri yalnızca hook'lar aracılığıyla kullanılabilir.
En basit fonksiyonel bileşen, JSX döndüren bir işlevdir. Props'u argüman olarak alır, kurucu, super çağrısı veya this bağlaması gerektirmez. Props, işlev argümanı aracılığıyla doğrudan erişilebilirdir — this.props gerekmez.
// Functional component without state
function Greeting({ name }) {
return <h1>Hello, {name}!</h1>;
}
// Arrow function (common variant)
const Greeting = ({ name }) => (
<h1>Hello, {name}!</h1>
);
Durum eklemek için useState'i kullanın. Hook, iki değerden oluşan bir demet döndürür: geçerli durum ve bir ayarlayıcı işlev. Sınıf tabanlı this.setState'ten farklı olarak useState, değeri öncekiyle birleştirmek yerine tamamen değiştirir.
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>
);
}
Hook'lar modern React'in temelidir. Her hook belirli bir görevi çözer: useState — durum, useEffect — yan etkiler, useContext — bağlam erişimi, useRef — DOM öğesi referansları, useCallback ve useMemo — bellekte tutma.
useEffect, componentDidMount, componentDidUpdate ve componentWillUnmount'ı aynı anda değiştirir. İlk argüman, etkiye sahip geri çağırmadır, ikincisi bağımlılık dizisidir. Dizi boşsa, etki bağlamadan sonra bir kez çalışırır. Bağımlılıklar belirtilmişse, bunlardan herhangi biri değiştiğinde çalışırır.
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>;
}
Fonksiyonel bileşenlerin ana avantajı, özel hook'lar aracılığıyla mantık yeniden kullanımıdır. Sınıf bileşeninde mantık, componentDidMount ve componentDidUpdate arasında çoğaltılırken, fonksiyonel bileşende use ön eki olan ayrı bir işleve çıkarılır. Özel hook'lar, HOC ve render props'a birincil alternatiftir.
React, bileşenler arasında kod yeniden kullanımı için kalıtım yerine bileşimi önerir. Fonksiyonel bileşenler bileşim için idealdir: bir bileşen, onlara props ve children geçerek birden çok başka bileşen içerebilir.
Children deseni — bir bileşenin children prop'u aracılığıyla alt öğeler alması — doğal olarak uygulanır: function Layout({ children }). Vue slotlarının benzeri, adlandırılmış bileşen props'ları aracılığıyla uygulanır: function Page({ header, sidebar, content }).
Kalıtım React'te neredeyse hiç kullanılmaz. Teknik olarak extends'i destekleyen sınıf bileşenleri bile nadiren bir seviyeden daha derin hiyerarşiler oluşturur. Bileşim ile fonksiyonel bileşenler, kalıtım olmadan kod yeniden kullanım ihtiyaçlarını tamamen karşılar.
Fonksiyonel bileşenler, yerleşik optimizasyon mekanizmalarıyla gelir. React.memo — işlevler için PureComponent karşılığı: props değişmediyse yeniden oluşturmayı önler (yüzeysel karşılaştırma). useMemo, oluşturmalar arasında hesaplama sonuçlarını önbelleğe alır.
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, geri çağırma işlevlerini bellekte tutar, böylece her oluşturmada yeniden oluşturulmazlar. Bu, React.memo ile sarılmış alt bileşenlere işlev geçirirken kritiktir: useCallback olmadan, alt bileşen her seferinde yeniden oluşturulur çünkü işlev başvurusu değişir.
Yaklaşımlar arasındaki fark sözdiziminin ötesine geçer. Fonksiyonel bileşenler kapanışlardır: durum ve etkiler belirli bir oluşturmaya bağlıdır. Sınıf bileşenleri this'i kullanır: durum her zaman this.state'den alınır ve bu, zaman uyumsuz bir geri çağırma yürütüldüğünde güncelliğini yitirmiş olabilir.
| Yön | Fonksiyonel | Sınıf |
|---|---|---|
| Durum | useState (izole) | this.state + this.setState |
| Etkiler | Bağımlılıklarla useEffect | componentDidMount + componentDidUpdate |
| Bağlam | useContext | Context.Consumer veya static contextType |
| Optimizasyon | React.memo + useMemo | PureComponent + shouldComponentUpdate |
| Mantık Yeniden Kullanımı | Özel hook'lar | HOC / Render props |
| this | Yok | Kurucuda bind |
Fonksiyonel bileşenler doğrusal bir yürütme akışı sağlar. Bir sınıf bileşeninde, ilgili mantık genellikle birden çok yaşam döngüsü yöntemine dağılmıştır. Örneğin, bir WebSocket aboneliği componentDidMount'da kurulur ve componentWillUnmount'da kaldırılır. Fonksiyonel bir bileşende, her iki işlem de bir dönüş temizleme işleviyle tek bir useEffect içindedir.
TypeScript, sınıflardan daha doğal bir şekilde fonksiyonel bileşenlerle çalışırır. Props yazımı — işlev argümanı için bir arayüz. Dönüş türü JSX.Element veya ReactNode'dur. useState, başlangıç değerinden türü otomatik olarak çıkarır.
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, ayrılmış birleşim türleriyle useReducer yazmaya, özel hook'larda jeneriklere ve React.PropsWithChildren aracılığıyla sıkı alt öğe doğrulamasına izin verir. TypeScript ile fonksiyonel bileşenler, ek soyutlamalar olmadan tam tür güvenliği sağlar.
Sıkça Sorulan Sorular
Fonksiyonel bileşenler daha basittir: kurucu, bind, this veya dağınık yaşam döngüsü yöntemleri yoktur. Hook'lar, ilgili mantığı gruplandırmaya izin verir. React, kaynakları sınıfların değil, hook'ların geliştirilmesine yatırır. Server Components ve yeni özellikler yalnızca işlevlerde kullanılabilir.
Evet, içinde zamanlayıcı ve clearInterval için temizleme işlevi bulunan useEffect aracılığıyla. Kapanışa dikkat edin: bir sayacı artırıyorsanız, setState'in işlevsel formunu kullanın: setCount(c => c + 1) böylece kapanıştaki eski değere bağımlı olmazsınız.
Önceki değeri depolamak için useRef kullanın. Her oluşturmadan sonra useEffect'te ref'i güncelleyin. Özel hook usePrevious temiz karşılaştırma için yardımcı olur: const prev = usePrevious(value);
React.memo, tüm bir bileşeni bellekte tutmak için bir HOC'dir: props değişmediyse yeniden oluşturmayı önler. useMemo, bir bileşen içinde belirli bir değeri bellekte tutmak için bir hook'tur: bağımlılık dizisine göre oluşturmalar arasında bir işlev sonucunu önbelleğe alır.
En basit yol, props'tan başlatma ile useState + senkronizasyon için props'a bağımlılığı olan useEffect kullanmaktır. Nadir durumlarda React, giriş verileri değiştiğinde bileşeni yeniden oluşturmaya zorlamak için bir anahtar (key) kullanılmasını önerir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun