Menjalankan Event di Class Component dengan Mudah

Menjalankan Event di Class Component dengan Mudah
Photo by Marvin Meyer / Unsplash

Dalam React, event handling adalah salah satu konsep penting untuk menangani interaksi pengguna, seperti klik tombol, input teks, atau pengiriman form. Meskipun React lebih sering menggunakan Function Component dengan Hooks saat ini, Class Component masih banyak digunakan dalam proyek besar.

Artikel ini akan membahas cara menangani event di Class Component dengan mudah, termasuk penggunaan this, binding, dan event handler yang optimal.

1. Bagaimana Event Bekerja di Class Component?

Event dalam React menggunakan Synthetic Events, yaitu abstraksi dari event bawaan browser yang kompatibel lintas browser.

Perbedaan event di Class Component dibandingkan dengan JavaScript biasa:
Menggunakan camelCase, bukan lowercase (contoh: onClick bukan onclick).
Harus menggunakan method dalam class, bukan fungsi di luar class.
Membutuhkan binding jika menggunakan this dalam method event handler.

Berikut contoh dasar menangani event onClick dalam Class Component:

import React, { Component } from 'react';

class ButtonClick extends Component {
  handleClick() {
    alert('Tombol diklik!');
  }

  render() {
    return <button onClick={this.handleClick}>Klik Saya</button>;
  }
}

export default ButtonClick;

📌 Penjelasan:

  • onClick={this.handleClick} → React menangani event dengan fungsi dalam class.
  • Saat tombol diklik, fungsi handleClick() akan dipanggil.
  • Masalah: Jika kita mencoba mengakses this di dalam handleClick(), bisa terjadi undefined error karena binding tidak dilakukan.

Solusi: Gunakan binding agar this tetap mengarah ke instance class.

2. Menggunakan Binding dalam Event Handler

Ada beberapa cara untuk membinding event handler dalam Class Component agar this tetap mengacu ke instance class.

📌 1. Binding dalam Constructor (Cara Paling Direkomendasikan)

class ButtonClick extends Component {
  constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    alert('Tombol diklik!');
  }

  render() {
    return <button onClick={this.handleClick}>Klik Saya</button>;
  }
}

📌 2. Binding dengan Arrow Function di Event Handler

class ButtonClick extends Component {
  handleClick = () => {
    alert('Tombol diklik!');
  };

  render() {
    return <button onClick={this.handleClick}>Klik Saya</button>;
  }
}

📌 3. Binding Langsung dalam Render (Kurang Direkomendasikan)

class ButtonClick extends Component {
  handleClick() {
    alert('Tombol diklik!');
  }

  render() {
    return <button onClick={() => this.handleClick()}>Klik Saya</button>;
  }
}

Kekurangan cara ini:

  • Setiap kali komponen re-render, fungsi baru dibuat, yang bisa menyebabkan masalah performa.

3. Menggunakan State dalam Event Handler

Event sering digunakan untuk mengubah state dalam Class Component.

import React, { Component } from 'react';

class Counter extends Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
    this.increment = this.increment.bind(this);
  }

  increment() {
    this.setState({ count: this.state.count + 1 });
  }

  render() {
    return (
      <div>
        <h2>Counter: {this.state.count}</h2>
        <button onClick={this.increment}>Tambah</button>
      </div>
    );
  }
}

export default Counter;

📌 Penjelasan:

  • this.state = { count: 0 } → Menyimpan nilai state.
  • this.setState({ count: this.state.count + 1 }) → Memperbarui state saat tombol diklik.
  • Komponen akan otomatis re-render saat state berubah.

Output:

Counter: 0  
[Klik tombol ➜ Counter: 1]

4. Menggunakan Parameter dalam Event Handler

Jika kita ingin meneruskan parameter ke event handler, gunakan arrow function atau bind().

class Greeting extends Component {
  handleGreet(name) {
    alert(`Halo, ${name}!`);
  }

  render() {
    return <button onClick={() => this.handleGreet('John')}>Sapa Saya</button>;
  }
}

Alternatif dengan bind():

<button onClick={this.handleGreet.bind(this, 'John')}>Sapa Saya</button>

5. Mencegah Perilaku Default dengan preventDefault

class Form extends Component {
  handleSubmit(event) {
    event.preventDefault();
    alert('Form berhasil dikirim!');
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit.bind(this)}>
        <button type="submit">Kirim</button>
      </form>
    );
  }
}

event.preventDefault() digunakan untuk mencegah reload halaman saat form dikirim.

6. Best Practices dalam Event Handling di Class Component

Gunakan binding dalam constructor untuk performa optimal.
Gunakan arrow function jika tidak ingin repot dengan binding.
Gunakan setState() untuk memperbarui data yang bisa berubah.
Gunakan preventDefault() untuk mencegah reload halaman pada event form.
Gunakan parameter dengan arrow function atau bind() jika dibutuhkan.

7. Kesimpulan

  • Event di Class Component membutuhkan binding untuk menghindari undefined this.
  • Gunakan this.setState() untuk mengelola perubahan data dalam komponen.
  • Gunakan arrow function dalam method event handler untuk menghindari binding manual.
  • Hindari anonymous function dalam render() untuk mengoptimalkan performa.

Dengan memahami cara menangani event di Class Component dengan baik, kita bisa membuat aplikasi React yang lebih interaktif dan efisien!