React.Component, React'te kalıtım kullanarak bileşen oluşturmak için temel sınıftır. 16.8 sürümünde hook'ların tanıtılmasından önce, sınıf bileşenleri durum ve yaşam döngüsünü yönetmenin tek yoluydu. React, 2024'e göre, sınıf bileşenleri hala desteklenmektedir, ancak yeni projeler için hook'lu fonksiyonel bileşenler önerilmektedir.
Önemli Noktalar
React.Component, durum, prop'lar ve bileşen yaşam döngüsü ile çalışmak için yerleşik metotlar sağlayan soyut bir sınıftır. Bir sınıf bileşeni oluşturmak için, React.Component'i genişleten bir sınıf tanımlamanız ve render metotunu uygulamanız gerekir.
React.Component, React'in ilk sürümünde (2013) ortaya çıktı ve beş yıl boyunca bileşen oluşturmanın birincil yolu olarak kaldı. React ekosistemi sınıflar etrafında inşa edildi: yüksek dereceli bileşenler (HOC), render props, bağlam — tüm bu desenler sınıf sözdizimi kullanılarak uygulandı.
2019'da React 16.8'in piyasaya sürülmesiyle, React ekibi sınıflara alternatif olarak hook'ları tanıttı. Hook'lar aynı sorunları — durum, efektler, bağlam — çözdü, ancak kalıtım ve karmaşık bağlam bağlaması olmadan. React.Component tamamen desteklenmeye devam ediyor, ancak yeni projeler için fonksiyonel yaklaşım önerilmektedir.
En küçük sınıf bileşeni, bir React öğesi döndüren tek bir render metotuna sahip bir sınıftır. render tek zorunlu metottur. this.props ve this.state'in saf bir fonksiyonu olmalıdır: aynı prop ve durum kümesi aynı sonucu üretir.
import React, { Component } from 'react';
class Welcome extends Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
Kurucu, montajdan önce çalıştırılır. Prop'ları üst sınıfa iletmek için super(props) çağrısını yapar ve this.state'i başlatır. Kurucuyu başka amaçlar için — abonelikler, API çağrıları — kullanmak önerilmez; bunun için componentDidMount vardır.
class Counter extends Component {
constructor(props) {
super(props);
this.state = { count: 0 };
}
render() {
return <p>Count: {this.state.count}</p>;
}
}
this.state, bileşenin verilerini içeren bir nesnedir. Doğrudan değiştirmek (this.state.count = 1) yasaktır — yeniden render tetiklemez ve öngörülebilirliği bozar. Durum, yeni bir durum nesnesi oluşturan ve yeniden render tetikleyen this.setState aracılığıyla güncellenmelidir.
setState bir nesne veya fonksiyon kabul edebilir. Yeni durum öncekine bağlı olduğunda fonksiyonel form tercih edilir: this.setState(prev => ({ count: prev.count + 1 })). React, performans optimizasyonu için birden çok setState çağrısını tek bir toplu işlemde gruplayabilir.
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>
);
}
}
setState'in önemli bir özelliği, asenkron olmasıdır. setState'i çağırdıktan sonra durum hemen güncellenmez. Güncellemeden sonra bir eylem gerçekleştirmeniz gerekiyorsa, ikinci argüman olarak bir geri çağrı iletin: this.setState(newState, () => console.log(this.state)).
Sınıf bileşenleri, React'in belirli anlarda çağırdığı önceden tanımlanmış metotlara sahiptir. Montaj — constructor → render → componentDidMount. Güncelleme — render → componentDidUpdate. Montajdan Çıkarma — componentWillUnmount.
| Metot | Aşama | Amaç |
|---|---|---|
| constructor | Montaj | Durumu başlatma ve metotları bağlama |
| render | Her seferinde | React öğeleri döndürme (zorunlu) |
| componentDidMount | Montajdan sonra | API istekleri, abonelikler, zamanlayıcılar |
| componentDidUpdate | Güncellemeden sonra | Prop/durum değişikliklerine tepki |
| componentWillUnmount | Kaldırmadan önce | Abonelikleri, zamanlayıcıları, olay dinleyicilerini temizleme |
componentDidMount, ilk renderdan sonraki yan etkiler için ana yerdir. Burada HTTP istekleri yapılır, WebSocket bağlantıları kurulur ve zamanlayıcılar başlatılır. componentWillUnmount'ta aboneliği temizlemezseniz, bellek sızıntısı oluşur.
class UserProfile extends Component {
componentDidMount() {
fetch(`/api/users/${this.props.userId}`)
.then(res => res.json())
.then(data => this.setState({ user: data }));
}
componentWillUnmount() {
// Cancel request on unmount
}
render() {
return <div>{this.state.user?.name}</div>;
}
}
JavaScript'te, sınıf metotları varsayılan olarak örneğe bağlı değildir. Bir metodu geri çağrı olarak iletirseniz — bir olay işleyiciye, bir zamanlayıcıya — this undefined (katı modda) veya window (katı mod olmadan) olur. Bağlama olmadan, this.setState hata fırlatır.
Bağlamanın üç yolu vardır: kurucuda bind, geri çağrıda ok fonksiyonu ve ok fonksiyonu ile class field. İlk yöntem React'in resmi önerisidir: kurucuda bir kez bağlayın, her renderda fonksiyonu yeniden oluşturmadan.
// Method 1: bind in constructor (recommended)
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 fields — otomatik bağlama ile modern sözdizimi. Bir sınıf özelliğindeki ok fonksiyonu, kurucunun kapsamından this'i yakalar. Dezavantajı, metotun prototip yerine her örnekte oluşturulmasıdır, bu da aynı türden yüzlerce bileşen için bellek kullanımını artırır.
Sınıf ve fonksiyon arasındaki seçim yalnızca sözdizimi meselesi değildir. Hook'lu fonksiyonel bileşenler, sınıflara özgü sorunları çözer: farklı yaşam döngüsü metotlarında (componentDidMount + componentDidUpdate) mantık tekrarı, this ile karmaşıklık ve ilgili mantığı yeniden kullanılabilir bir bloğa çıkaramama.
Fonksiyonel bileşenlerin test edilmesi daha kolaydır — iç durumları yoktur (hook'lardan önce yalnızca sınıflarda mevcuttu) ve geri çağrıları doğrulamak için DOM montajı gerektirmezler. React, tüm yeni projeler için fonksiyonel bileşenleri önerir; dokümantasyon ve örnekler onlarla yazılır.
Sınıf bileşenleri, eski kod ile çalışırken en iyi seçim olmaya devam eder. Bir proje 2019'dan önce başlatıldıysa, muhtemelen binlerce sınıf bileşeni içerir. Hepsini tek bir sprintte hook'lara yeniden yazmak risklidir. React geriye dönük uyumluluğu garanti eder: sınıf bileşenleri kaldırılmayacaktır.
Aşamalı göç, bileşenin analiziyle başlar. Durumsuz basit bileşenler önce dönüştürülür — bunlar kolayca fonksiyonlarla değiştirilir. Ardından — bir veya iki durum alanı olan bileşenler, burada useState doğrudan this.state ve this.setState'in yerini alır.
Birden çok yaşam döngüsü metotuna sahip karmaşık bileşenler useEffect kullanılarak dönüştürülür. componentDidMount + componentDidUpdate'teki mantık, farklı bağımlılıklarla ayrı useEffect çağrılarına bölünür. componentWillUnmount, useEffect içinde bir dönüş fonksiyonuyla değiştirilir. Karmaşık durum mantığı için useReducer kullanın.
Otomatik göç araçları — @phenomnomnominal/ts-react-class-to-hook veya codemod script'leri — basit sınıfları otomatik olarak dönüştürebilir. Karmaşık durumlarda, göç, kaynak bileşenin mantığını anlamayı gerektiren manuel bir iş olarak kalır.
Sıkça Sorulan Sorular
Evet. super(props), prop'ları üst React.Component'e iletir. Bu çağrı olmadan, this.props kurucu içinde undefined olur. Render ve yaşam döngüsü metotlarında, prop'lar super olmadan da erişilebilirdir, ancak bu uygulamanın tali davranışıdır.
React, gereksiz yeniden renderları azaltmak için birden çok setState çağrısını tek bir toplu işlemde gruplar. setState senkron olsaydı, her çağrı anında render tetikler ve toplu güncellemeler sırasında performansı düşürürdü.
Hayır. Hook'lar yalnızca fonksiyonel bileşenlerde çalışır. Sınıf bileşenleri olan projeler için, tüm eski desenler mevcuttur: render props, HOC ve bağlam için Consumer. Hook'lara göç etmek, sınıfın bir fonksiyona dönüştürülmesini gerektirir.
React.PureComponent, prop'ların ve durumun yüzeysel karşılaştırmasıyla shouldComponentUpdate'i uygular. setState ile her zaman yeniden render yapan Component'in aksine, PureComponent veri değişmediyse yeniden renderı atlar. Bu, karmaşık iç içe yapısı olmayan bileşenler için bir optimizasyondur.
componentDidCatch ve getDerivedStateFromError kullanın. componentDidCatch(error, info) hatayı günlüğe kaydeder. getDerivedStateFromError, yedek bir arayüz göstermek için durumu günceller. Bu metotlar yalnızca sınıf bileşenlerinde çalışır — fonksiyonların bir ErrorBoundary sarmalayıcı bileşene ihtiyacı vardır.
Ö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