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(atauReact.Componentdenganimport React from 'react'). render()wajib ada. Method ini harus murni, seperti isi function component: bacathis.propsdanthis.state, lalu kembalikan JSX.this.propsmenampung props. Props bersifat read only.- State bisa diatur di
constructor(panggilsuper(props)dulu) atau, yang lebih umum sekarang, sebagai class field:state = { visits: 1 };. static defaultPropsmasih 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 dimulaicomponentDidMount.shouldComponentUpdate(nextProps, nextState): kembalikanfalseuntuk 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:
this.props.xmenjadi prop hasil destructuring,{ x }.- Setiap key dari
this.statemenjadiuseStatetersendiri. Ingat, setter-nya mengganti, bukan menggabungkan. - Method menjadi fungsi biasa di dalam komponen. Tidak perlu binding.
componentDidMount,componentDidUpdate, dancomponentWillUnmountmenjadi pemanggilanuseEffect, dikelompokkan berdasarkan apa yang dilakukannya, bukan kapan dijalankannya.createRefmenjadiuseRef, danstatic contextTypedenganthis.contextmenjadiuseContextatauuse.
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"denganthis.refs.input). PakaicreateRef()atau ref callback. - Context lawas (
contextTypes,childContextTypes,getChildContext). PakaicreateContextdenganstatic contextType. propTypesdiabaikan. Pakai TypeScript atau pemeriksaanmu sendiri.findDOMNodesudah 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.