Menu

Class Component React: State, Lifecycle, dan Konversi

Class component adalah class JavaScript yang mewarisi React.Component dan mengembalikan JSX dari method render. Pelajari this.props, this.state dan setState, binding event handler, lifecycle method, PureComponent, dan cara mengubah class menjadi function component.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Class component adalah class JavaScript yang mewarisi React.Component dan mengembalikan JSX dari method render(). Class component membaca props dari this.props, menyimpan state di this.state, dan memperbaruinya dengan this.setState(). Function component dengan hook sudah menggantikannya untuk kode baru, tetapi class masih didukung penuh, muncul di banyak codebase lama, dan menjadi satu-satunya cara menulis error boundary.

Setiap counter menyimpan state-nya sendiri. Tambahkan <Counter label="Plums" /> ketiga, dan counter itu juga mulai dari 0.

Anatomi class component

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 ini mewarisi Component (atau React.Component dengan import React from 'react').
  • render() wajib ada. Method ini harus murni, seperti isi function component: baca this.props dan this.state, lalu kembalikan JSX.
  • this.props menampung props. Props bersifat read only.
  • State bisa diatur di constructor (panggil super(props) dulu) atau, yang lebih umum sekarang, sebagai class field: state = { visits: 1 };.
  • static defaultProps masih berjalan untuk class di React 19 (fitur ini hanya dihapus untuk function component).

this.setState menggabungkan, dan bisa menerima updater

setState melakukan dua hal yang berbeda dari setter useState. Pertama, ia menggabungkan objek yang kamu kirim ke state saat ini, jadi kamu hanya memperbarui key yang kamu sebutkan. Kedua, seperti setiap pembaruan state di React, perubahannya tidak langsung diterapkan, jadi pakai bentuk updater saat nilai berikutnya bergantung pada nilai sebelumnya.

"+3 with objects" hanya menambah satu, karena ketiga pemanggilan membaca this.state.likes yang sama. "+3 with updaters" menambah tiga. "Move to Paris" mempertahankan name dan likes (berkat penggabungan) tetapi kehilangan zip, karena penggabungan hanya sedalam satu level. Tulis address: { ...this.state.address, city: 'Paris' } untuk mempertahankannya. Argumen kedua setState yang opsional berjalan setelah pembaruan, dan konsol menampilkan alamat baru di sana.

Binding event handler

Method yang dikirim sebagai onClick={this.handleClick} nantinya dipanggil sebagai fungsi biasa, tanpa objeknya, jadi this di dalamnya bernilai undefined.

Tombol pertama mencatat TypeError tentang membaca setState dari undefined. Tombol kedua berjalan, karena arrow function di class field menangkap this saat instance dibuat. Cara perbaikan yang lebih lama, yang masih umum di kode lawas, melakukan bind di constructor:

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

Arrow function inline, onClick={() => this.handleClick()}, juga berjalan.

Lifecycle method

Class merespons mount, update, dan unmount lewat method dengan nama yang sudah ditentukan. Yang paling sering kamu temui:

  • componentDidMount(): setelah render pertama masuk ke DOM. Mulai timer, subscription, dan request di sini.
  • componentDidUpdate(prevProps, prevState): setelah setiap update. Bandingkan dengan nilai sebelumnya sebelum melakukan sesuatu, atau kamu akan terjebak dalam loop.
  • componentWillUnmount(): sebelum komponen dihapus. Batalkan apa yang dimulai componentDidMount.
  • shouldComponentUpdate(nextProps, nextState): kembalikan false untuk melewatkan render.

Halaman component lifecycle berisi daftar lengkapnya, urutan jalannya, dan komponen yang mencatat setiap method.

Mengubah class menjadi function component

Berikut class yang memakai ketiga lifecycle method yang umum. Class ini berdetak setiap detik, mencatat saat prop label-nya berubah, dan menghentikan timer-nya saat dihapus.

Dan berikut komponen yang sama sebagai fungsi. Setiap lifecycle method menjadi bagian dari sebuah effect, dan setup serta cleanup yang berkaitan berdampingan, bukan terpisah di dua method.

Kedua timer menghitung dengan cara yang sama dan mencatat setiap kali label berubah. Versi fungsi juga mencatat sekali saat mount, karena effect juga berjalan setelah render pertama. Langkah untuk setiap konversi:

  1. this.props.x menjadi prop hasil destructuring, { x }.
  2. Setiap key dari this.state menjadi useState tersendiri. Ingat, setter-nya mengganti, bukan menggabungkan.
  3. Method menjadi fungsi biasa di dalam komponen. Tidak perlu binding.
  4. componentDidMount, componentDidUpdate, dan componentWillUnmount menjadi pemanggilan useEffect, dikelompokkan berdasarkan apa yang dilakukannya, bukan kapan dijalankannya.
  5. createRef menjadi useRef, dan static contextType dengan this.context menjadi useContext atau use.

Biarkan error boundary tetap berupa class; belum ada padanannya dalam bentuk fungsi.

PureComponent

Class component biasa merender setiap kali komponen induknya merender. PureComponent lebih dulu membandingkan props dan state baru dengan yang sebelumnya, sedalam satu level, dan melewatkan render jika tidak ada yang berubah. Ini pasangan versi class dari React.memo.

Klik tombolnya: hanya PlainLabel rendered yang tercatat, karena PureLabel melihat text yang sama. Kirim text={'hello ' + clicks} ke keduanya, dan keduanya merender di setiap klik.

Perbandingannya dangkal, jadi prop berupa objek atau fungsi baru di setiap render induk (style={{ color: 'red' }}, onClick={() => ...}) membuatnya tidak berguna. Ini jebakan yang sama seperti pada React.memo.

Yang dihapus React 19 dari class

Jika kamu merawat kode class lama, beberapa pola tidak lagi berjalan di React 19:

  • String ref (ref="input" dengan this.refs.input). Pakai createRef() atau ref callback.
  • Context lawas (contextTypes, childContextTypes, getChildContext). Pakai createContext dengan static contextType.
  • propTypes diabaikan. Pakai TypeScript atau pemeriksaanmu sendiri.
  • findDOMNode sudah tidak ada. Pasang ref pada elemen DOM sebagai gantinya.

Method lama componentWillMount, componentWillReceiveProps, dan componentWillUpdate juga lawas. Method ini masih berjalan, baik dengan nama lama maupun nama UNSAFE_ (UNSAFE_componentWillMount dan seterusnya), tetapi sudah deprecated dan StrictMode memberi peringatan tentangnya; pindahkan kodenya ke componentDidMount, componentDidUpdate, atau getDerivedStateFromProps.

Pertanyaan yang sering diajukan

Apakah class component sudah usang di React?

Tidak. Class component masih didukung di React 19 dan akan tetap berjalan, tetapi dokumentasi React menyarankan function component dengan hook untuk kode baru. Kamu tetap butuh class untuk error boundary.

Apa perbedaan class component dan function component?

Class component menyimpan state di this.state, memperbaruinya dengan this.setState, dan merespons lifecycle lewat method bernama. Function component memakai hook (useState, useEffect) untuk tugas yang sama, tidak butuh this, dan lebih ringkas.

Apakah setState langsung memperbarui state?

Tidak. this.setState menjadwalkan pembaruan dan React merender belakangan, jadi this.state masih berisi nilai lama tepat setelah pemanggilan. Kirim fungsi, this.setState((state) => ...), saat nilai baru bergantung pada nilai lama, atau baca hasilnya di callback argumen kedua atau di componentDidUpdate.

Kenapa this bernilai undefined di event handler saya?

Method class yang dikirim sebagai onClick={this.handleClick} dipanggil tanpa objeknya, jadi this bernilai undefined. Definisikan handler sebagai arrow function di class field (handleClick = () => { ... }) atau bind di constructor.

Apa itu PureComponent?

PureComponent adalah Component yang melewatkan render saat props dan state-nya sama secara dangkal dengan yang sebelumnya. Ini versi class dari React.memo.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai