Menu

React Class Bileşenleri: State, Yaşam Döngüsü, Dönüştürme

Bir class bileşeni, React.Component'ten türeyen ve bir render metodundan JSX döndüren bir JavaScript class'ıdır. this.props, this.state ve setState'i, olay işleyicilerini bağlamayı, yaşam döngüsü metotlarını, PureComponent'i ve bir class'ı fonksiyon bileşenine nasıl dönüştüreceğini öğren.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Bir class bileşeni, React.Component'ten türeyen ve bir render() metodundan JSX döndüren bir JavaScript class'ıdır. Props'u this.props'tan okur, state'i this.state içinde tutar ve onu this.setState() ile günceller. Hook'lu fonksiyon bileşenleri yeni kod için onların yerini aldı, ama class'lar hâlâ tamamen desteklenir, birçok eski kod tabanında görünür ve bir error boundary yazmanın tek yoludur.

Her sayaç kendi state'ini tutar. Üçüncü bir <Counter label="Plums" /> ekle; o da 0'dan başlar.

Bir class bileşeninin anatomisi

import { Component } from 'react';

class Welcome extends Component {
    static defaultProps = { name: 'stranger' };

    constructor(props) {
        super(props); // required before using this
        this.state = { visits: 1 };
    }

    render() {
        return <h1>Hello, {this.props.name}. Visit #{this.state.visits}</h1>;
    }
}
  • Class Component'ten (ya da import React from 'react' ile React.Component'ten) türer.
  • render() zorunludur. Bir fonksiyon bileşeninin gövdesi gibi saf olmalıdır: this.props ve this.state'i oku, JSX döndür.
  • this.props props'u tutar. Salt okunurdur.
  • State bir constructor'da (önce super(props) çağır) ya da bugün daha yaygın olarak bir class alanı olarak ayarlanabilir: state = { visits: 1 };.
  • static defaultProps React 19'da class'lar için hâlâ çalışır (yalnızca fonksiyon bileşenleri için kaldırıldı).

this.setState birleştirir ve bir updater alabilir

setState, useState setter'ından farklı iki şey yapar. Aktardığın nesneyi mevcut state ile birleştirir (merge), böylece yalnızca adını verdiğin anahtarları güncellersin. Ve her React state güncellemesi gibi hemen uygulanmaz, bu yüzden sonraki değer öncekine bağlı olduğunda updater biçimini kullan.

"+3 with objects" bir ekler, çünkü üç çağrı da aynı this.state.likes'ı okur. "+3 with updaters" üç ekler. "Move to Paris" name ve likes'ı korur (birleştirme) ama zip'i kaybeder, çünkü birleştirme bir seviye derindir. Onu korumak için address: { ...this.state.address, city: 'Paris' } yaz. setState'in isteğe bağlı ikinci argümanı güncellemeden sonra çalışır ve konsol yeni adresi orada gösterir.

Olay işleyicilerini bağlamak

onClick={this.handleClick} olarak aktarılan bir metot sonra nesnesi olmadan düz bir fonksiyon olarak çağrılır, bu yüzden içindeki this undefined'dır.

İlk düğme undefined'ın setState'ini okumakla ilgili bir TypeError kaydeder. İkincisi çalışır, çünkü bir class alanındaki ok fonksiyonu örnek oluşturulduğunda this'i yakalar. Eski kodda hâlâ yaygın olan eski çözüm constructor'da bağlar:

constructor(props) {
    super(props);
    this.state = { on: false };
    this.handleClick = this.handleClick.bind(this);
}

Satır içi bir ok fonksiyonu, onClick={() => this.handleClick()}, da çalışır.

Yaşam döngüsü metotları

Class'lar mount, update ve unmount'a sabit adlı metotlarla tepki verir. En çok göreceklerin:

  • componentDidMount(): ilk render DOM'a girdikten sonra. Zamanlayıcıları, abonelikleri, istekleri başlat.
  • componentDidUpdate(prevProps, prevState): her güncellemeden sonra. İş yapmadan önce önceki değerlerle karşılaştır, yoksa döngüye girersin.
  • componentWillUnmount(): kaldırılmadan önce. componentDidMount'un başlattığını geri al.
  • shouldComponentUpdate(nextProps, nextState): bir render'ı atlamak için false döndür.

Bileşen yaşam döngüsü sayfasında tam liste, çalışma sıraları ve her birini kaydeden bir bileşen var.

Bir class'ı fonksiyon bileşenine dönüştürmek

İşte üç yaygın yaşam döngüsü metodunun hepsini kullanan bir class. Her saniye tik atar, label prop'u değiştiğinde kayıt yazar ve kaldırıldığında zamanlayıcısını durdurur.

Ve aynı bileşen bir fonksiyon olarak. Her yaşam döngüsü metodu bir efektin parçası olur ve ilişkili kurulum ile temizleme iki metotta değil yan yana durur.

İki zamanlayıcı da aynı şekilde sayar ve her etiket değişikliğinde kayıt yazar. Fonksiyon sürümü mount'ta da bir kez kayıt yazar, çünkü bir efekt ilk render'dan sonra da çalışır. Herhangi bir dönüştürme için adımlar:

  1. this.props.x, destructure edilmiş bir prop olur: { x }.
  2. this.state'in her anahtarı kendi useState'i olur. Setter'ın birleştirmek yerine değiştirdiğini unutma.
  3. Metotlar bileşenin içinde düz fonksiyonlar olur. Bağlamaya gerek yok.
  4. componentDidMount, componentDidUpdate ve componentWillUnmount, ne zaman çalıştıklarına göre değil ne yaptıklarına göre gruplanmış useEffect çağrıları olur.
  5. createRef, useRef olur; this.context ile static contextType de useContext ya da use olur.

Error boundary'leri class olarak bırak; fonksiyon karşılıkları yoktur.

PureComponent

Normal bir class bileşeni ebeveyni her render olduğunda render olur. PureComponent önce yeni props ve state'i öncekilerle bir seviye derinlikte karşılaştırır ve hiçbir şey değişmediğinde render'ı atlar. React.memo'nun class karşılığıdır.

Düğmeye tıkla: yalnızca PlainLabel rendered kaydedilir, çünkü PureLabel aynı text'i görür. İkisine de text={'hello ' + clicks} aktar; ikisi de her tıklamada render olur.

Karşılaştırma sığdır, bu yüzden ebeveynin her render'ında yeni bir nesne ya da fonksiyon olan bir prop (style={{ color: 'red' }}, onClick={() => ...}) onu boşa çıkarır. Bu, React.memo'daki tuzağın aynısıdır.

React 19'un class'lardan kaldırdıkları

Eski class kodunun bakımını yapıyorsan birkaç kalıp React 19'da artık çalışmaz:

  • String ref'ler (this.refs.input ile ref="input"). createRef() ya da bir ref callback'i kullan.
  • Eski context (contextTypes, childContextTypes, getChildContext). static contextType ile createContext kullan.
  • propTypes yok sayılır. TypeScript ya da kendi kontrollerini kullan.
  • findDOMNode kaldırıldı. Bunun yerine DOM öğesine bir ref koy.

Eski componentWillMount, componentWillReceiveProps ve componentWillUpdate metotları da eskidir. Hem eski adlarıyla hem de UNSAFE_ adlarıyla (UNSAFE_componentWillMount vb.) hâlâ çalışırlar, ama kullanımdan kaldırılmışlardır ve StrictMode onlar hakkında uyarır; kodlarını componentDidMount'a, componentDidUpdate'e ya da getDerivedStateFromProps'a taşı.

Sıkça Sorulan Sorular

React'te class bileşenleri kullanımdan kalktı mı?

Hayır. React 19'da hâlâ destekleniyor ve çalışmaya devam edecekler, ama React belgeleri yeni kod için hook'larla fonksiyon bileşenlerini öneriyor. Error boundary'ler için hâlâ bir class'a ihtiyacın var.

Class ve fonksiyon bileşenleri arasındaki fark nedir?

Bir class bileşeni state'i this.state içinde tutar, this.setState ile günceller ve yaşam döngüsüne adlandırılmış metotlarla tepki verir. Bir fonksiyon bileşeni aynı işler için hook'ları (useState, useEffect) kullanır, this'e ihtiyaç duymaz ve daha kısadır.

setState state'i hemen günceller mi?

Hayır. this.setState bir güncelleme planlar ve React sonra render eder, bu yüzden çağrıdan hemen sonra this.state hâlâ eski değeri tutar. Yeni değer eskisine bağlı olduğunda bir fonksiyon aktar, this.setState((state) => ...), ya da sonucu ikinci argüman callback'inde veya componentDidUpdate içinde oku.

Olay işleyicimde this neden undefined?

onClick={this.handleClick} olarak aktarılan bir class metodu nesnesi olmadan çağrılır, bu yüzden this undefined'dır. İşleyiciyi bir class alanı ok fonksiyonu olarak tanımla (handleClick = () => { ... }) ya da constructor'da bağla.

PureComponent nedir?

Props'u ve state'i öncekilerle sığ olarak eşit olduğunda render'ı atlayan bir Component'tir. React.memo'nun class sürümüdür.

Coddy programlama dilleri çizimi

Coddy ile kodlamayı öğren

BAŞLA