Input Data Profesional: Cara Membuat dan Mengelola Form di React JS (Part 9)

Rifqi An Rifqi An
Maret 03, 2026


Input Data Profesional: Cara Membuat dan Mengelola Form di React JS (Part 9)

Pernah merasa pusing saat harus bikin form di website atau aplikasi? Tenang, kamu nggak sendiri! Banyak programmer, termasuk yang senior, kadang masih garuk-garuk kepala mikirin gimana caranya ngelola inputan user biar data nggak ngaco dan tampilan tetap responsif. Tapi di React JS, urusan form ini jadi lebih santuy, serius! Di Part 9 dari seri tutorial Belajar React kita ini, kita bakal kupas tuntas rahasia di balik form profesional yang anti-bug dan siap tempur. Siap ngopi dan ngoding bareng? Yuk, kita mulai! Jangan sampai data user kabur entah ke mana, ya!

Daftar Isi

Mengapa Form di React Itu Penting Banget?

Coba deh bayangin aplikasi tanpa form. Nggak bisa login, nggak bisa daftar, nggak bisa update profil, nggak bisa nulis komentar. Rasanya hampa, kan? Form itu jembatan utama antara user dan aplikasi kita. Lewat form, user bisa input data, ngasih instruksi, dan berinteraksi secara aktif. Makanya, bikin form yang bagus, responsif, dan mudah digunakan itu krusial banget. Apalagi di React yang fokusnya ke UI interaktif, nguasain form adalah skill wajib!

Di React, kita punya kendali penuh atas form. Ini beda sama form HTML biasa yang kadang bikin kita merasa kayak pasrah aja sama tingkah laku browser. Dengan React, setiap karakter yang diketik user bisa langsung kita olah. Keren, kan?

Tipe-Tipe Form (Controlled vs Uncontrolled)

Di React, ada dua pendekatan utama dalam mengelola form:

  1. Controlled Components: Ini adalah primadona-nya React. State komponen React yang akan "mengontrol" nilai input dari form. Artinya, setiap kali ada perubahan di input, state React akan di-update, dan input akan menampilkan nilai dari state tersebut. Kontrol penuh di tangan kita!
  2. Uncontrolled Components: Mirip form HTML biasa. Data diambil langsung dari DOM saat dibutuhkan (misalnya saat submit) menggunakan ref. Ini lebih simpel kalau form-nya super duper sederhana, tapi kurang fleksibel untuk validasi real-time atau manipulasi data yang kompleks.

Untuk kasus profesional dan fleksibilitas, kita akan fokus ke Controlled Components. Kenapa? Karena ini ngasih kita kekuatan super buat validasi, disable tombol, atau bahkan ngasih feedback langsung ke user saat mereka ngetik. Pokoknya, lebih powerful!

Ngoding Form Sederhana (Controlled Component)

Oke, mari kita mulai ngoding form sederhana. Anggaplah kita mau bikin form login yang cuma ada inputan username. Kita butuh useState untuk menyimpan nilai inputnya.

Pertama, bikin komponen baru, misalnya LoginForm.js:


import React, { useState } from 'react';

function LoginForm() {
  const [username, setUsername] = useState('');

  const handleUsernameChange = (event) => {
    setUsername(event.target.value);
    console.log("Username: ", event.target.value); // Buat debug aja
  };

  const handleSubmit = (event) => {
    event.preventDefault(); // Mencegah browser refresh
    console.log("Data yang disubmit:", { username });
    alert(`Selamat datang, ${username}! (Ini cuma simulasi)`);
    setUsername(''); // Kosongkan form setelah submit
  };

  return (
    <form onSubmit={handleSubmit}>
      <div>
        <label htmlFor="username">Username:</label>
        <input
          type="text"
          id="username"
          name="username"
          value={username}
          onChange={handleUsernameChange}
          placeholder="Masukkan username Anda"
        />
      </div>
      <button type="submit">Login</button>
    </form>
  );
}

export default LoginForm;

Jeng jeng! Kode di atas mungkin terlihat banyak, tapi inti utamanya cuma tiga:

  1. Kita punya state username yang diinisialisasi string kosong.
  2. Input text kita punya atribut value={username}. Ini yang bikin dia controlled. Nilai input selalu "terikat" sama state username.
  3. Setiap ada perubahan di input (pas user ngetik), fungsi handleUsernameChange dipanggil. Dia akan meng-update state username dengan nilai terbaru dari input (event.target.value).
  4. Fungsi handleSubmit akan berjalan saat tombol submit diklik, dan dia akan mencegah refresh browser default lalu menampilkan data.

Jadi, setiap kali user ngetik, state di React langsung berubah. Ini pondasi utama form di React, lho!

Handle Multiple Inputs dengan Lebih Elegan

Gimana kalau form kita punya banyak input, misalnya username, email, dan password? Masa bikin useState satu per satu? Bisa sih, tapi nanti kodenya jadi panjang dan repetitif. Ada cara yang lebih nge-chill:

Kita bisa pakai satu useState untuk menyimpan semua data form sebagai sebuah objek. Kuncinya? Atribut name pada elemen input!


import React, { useState } from 'react';

function MultiInputForm() {
  const [formData, setFormData] = useState({
    username: '',
    email: '',
    password: ''
  });

  const handleChange = (event) => {
    const { name, value } = event.target;
    setFormData(prevData => ({
      ...prevData,
      [name]: value
    }));
  };

  const handleSubmit = (event) => {
    event.preventDefault();
    console.log("Data yang disubmit:", formData);
    alert(`Data user: ${JSON.stringify(formData)}`);
    setFormData({ // Reset form
      username: '',
      email: '',
      password: ''
    });
  };

  return (
    <form onSubmit={handleSubmit}>
      <div>
        <label htmlFor="username">Username:</label>
        <input
          type="text"
          id="username"
          name="username" {/* Penting! */}
          value={formData.username}
          onChange={handleChange}
          placeholder="Username"
        />
      </div>
      <div>
        <label htmlFor="email">Email:</label>
        <input
          type="email"
          id="email"
          name="email" {/* Penting! */}
          value={formData.email}
          onChange={handleChange}
          placeholder="Email"
        />
      </div>
      <div>
        <label htmlFor="password">Password:</label>
        <input
          type="password"
          id="password"
          name="password" {/* Penting! */}
          value={formData.password}
          onChange={handleChange}
          placeholder="Password"
        />
      </div>
      <button type="submit">Daftar</button>
    </form>
  );
}

export default MultiInputForm;

Perhatikan fungsi handleChange. Dengan const { name, value } = event.target; kita bisa secara dinamis mengambil nama input dan nilainya. Lalu, [name]: value di dalam setFormData akan update properti yang sesuai di objek formData kita. Ini namanya computed property names di JavaScript. Keren, kan? Kode jadi lebih DRY (Don't Repeat Yourself)!

Validasi Form (Biar Data Nggak Ngaco)

Pasti sebel kan kalau user ngisi form seenaknya terus data yang masuk ke database jadi ngaco? Nah, di sinilah peran validasi. Validasi itu penting banget untuk memastikan data yang diinput user sesuai harapan kita. Kita bisa validasi di frontend (di React ini) dan juga di backend (saat data sampai server).

Validasi di frontend gunanya untuk memberikan feedback instan ke user, mencegah mereka ngirim data yang jelas-jelas salah. Misalnya, username harus minimal 3 karakter.


import React, { useState } from 'react';

function ValidatedForm() {
  const [formData, setFormData] = useState({
    username: '',
    email: '',
  });
  const [errors, setErrors] = useState({}); // State untuk menyimpan pesan error

  const validateForm = () => {
    let newErrors = {};
    if (!formData.username) {
      newErrors.username = 'Username tidak boleh kosong!';
    } else if (formData.username.length < 3) {
      newErrors.username = 'Username minimal 3 karakter.';
    }
    if (!formData.email) {
      newErrors.email = 'Email tidak boleh kosong!';
    } else if (!/\S+@\S+\.\S+/.test(formData.email)) {
      newErrors.email = 'Format email tidak valid!';
    }
    setErrors(newErrors);
    return Object.keys(newErrors).length === 0; // Mengembalikan true jika tidak ada error
  };

  const handleChange = (event) => {
    const { name, value } = event.target;
    setFormData(prevData => ({
      ...prevData,
      [name]: value
    }));
    // Clear error for this field as user types
    setErrors(prevErrors => ({
      ...prevErrors,
      [name]: undefined
    }));
  };

  const handleSubmit = (event) => {
    event.preventDefault();
    const isValid = validateForm(); // Panggil fungsi validasi
    if (isValid) {
      console.log("Form valid, data siap dikirim:", formData);
      alert('Form berhasil divalidasi dan siap dikirim!');
      setFormData({ username: '', email: '' }); // Reset form
    } else {
      console.log("Ada error di form:", errors);
      alert('Terdapat kesalahan pada input form. Mohon periksa kembali.');
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <div>
        <label htmlFor="username">Username:</label>
        <input
          type="text"
          id="username"
          name="username"
          value={formData.username}
          onChange={handleChange}
          className={errors.username ? 'input-error' : ''} {/* Tambahkan kelas CSS untuk error */}
        />
        {errors.username &amp;&amp; <p style={{ color: 'red' }}>{errors.username}</p>}
      </div>
      <div>
        <label htmlFor="email">Email:</label>
        <input
          type="text"
          id="email"
          name="email"
          value={formData.email}
          onChange={handleChange}
          className={errors.email ? 'input-error' : ''}
        />
        {errors.email &amp;&amp; <p style={{ color: 'red' }}>{errors.email}</p>}
      </div>
      <button type="submit">Submit</button>
    </form>
  );
}

export default ValidatedForm;

Nah, di kode ini kita tambahin errors state untuk nyimpen pesan error. Fungsi validateForm bertugas mengecek semua input dan mengisi objek errors. Kalau ada error, kita tampilkan pesan errornya di bawah input terkait. Ini bikin user tahu apa yang salah secara real-time atau saat mereka mencoba submit. Jangan lupa tambahin sedikit CSS untuk class input-error biar input yang bermasalah kelihatan lebih jelas!

Tips ngopi: Saat ngoding validasi, kadang kita jadi lupa ngopi saking fokusnya. Ingat, validasi itu detail! Jangan sampai bug validasi bikin user frustrasi. Karena itu, siapkan ngopi-mu dan semangat!

Submit Form (Waktunya Kirim Data ke Server... atau Konsol Dulu!)

Setelah data diinput dan divalidasi, saatnya kirim ke server! Di React, ini biasanya dilakukan di dalam fungsi handleSubmit. Kita sudah menggunakan event.preventDefault() di contoh sebelumnya untuk mencegah perilaku default browser yang suka refresh halaman saat form disubmit.

Di dalam handleSubmit yang valid, kita bisa melakukan hal-hal berikut:

  • Memanggil fungsi dari API untuk mengirim data ke backend (pakai fetch atau axios).
  • Menampilkan pesan sukses atau error ke user.
  • Mengarahkan user ke halaman lain (pakai react-router-dom).
  • Mengosongkan form.

Contohnya, setelah validasi berhasil, kita bisa kirim data formData ke API:


// ... (bagian atas komponen ValidatedForm) ...

  const handleSubmit = async (event) => { // Tambahkan 'async' jika akan ada operasi await
    event.preventDefault();
    const isValid = validateForm();
    if (isValid) {
      console.log("Data siap dikirim:", formData);
      // Contoh: Kirim data ke API
      try {
        const response = await fetch('/api/submit-form', { // Ganti dengan endpoint API Anda
          method: 'POST',
          headers: {
            'Content-Type': 'application/json',
          },
          body: JSON.stringify(formData),
        });
        if (response.ok) {
          alert('Data berhasil dikirim ke server!');
          setFormData({ username: '', email: '' }); // Reset form
        } else {
          const errorData = await response.json();
          alert(`Gagal mengirim data: ${errorData.message || 'Terjadi kesalahan.'}`);
        }
      } catch (error) {
        console.error('Error saat mengirim form:', error);
        alert('Terjadi kesalahan jaringan atau server.');
      }
    } else {
      alert('Terdapat kesalahan pada input form. Mohon periksa kembali.');
    }
  };

// ... (bagian return JSX) ...

Di contoh ini, kita pakai fetch untuk simulasi pengiriman data ke /api/submit-form. Ingat, ini cuma contoh sederhana. Di aplikasi nyata, biasanya kamu akan menggunakan library seperti Axios yang lebih canggih, atau library manajemen state seperti Redux/Zustand untuk data yang lebih kompleks.

Penderitaan programmer: Jangan kaget kalau pas pertama kali kirim data ke API, langsung dapat error 500 atau CORS. Itu bukan kamu yang salah, kok, mungkin backend-nya lagi ngambek atau butuh konfigurasi ekstra. Tetap semangat debug sambil ngopi!

Kesimpulan: Form di React Itu Asyik, Kan?

Gimana? Ternyata bikin form di React itu nggak seserem yang dibayangkan, kan? Dengan konsep controlled components, kita punya kendali penuh atas input user, bisa validasi secara real-time, dan mengelola data dengan sangat fleksibel. Ini jauh lebih powerful dan menyenangkan daripada ngoding form HTML biasa yang sering bikin kita cuma bisa pasrah.

Menguasai form adalah langkah penting untuk membuat aplikasi React yang interaktif dan profesional. Jadi, teruslah bereksperimen, jangan takut error, dan teruskan ngoding!

Sampai jumpa di Part selanjutnya, ya! Jangan lupa senyum biar ngodingnya makin lancar!

Latihan Ngoding Santuy

Oke, biar makin jago, yuk kita coba studi kasus lucu:

Skenario: Form Pendaftaran Penjaga Kucing Luar Angkasa

Kamu diminta membuat form pendaftaran untuk program "Penjaga Kucing Luar Angkasa". Form ini harus punya:

  • Nama Lengkap: (wajib diisi, minimal 5 karakter)
  • Planet Asal: (Dropdown/Select: Bumi, Mars, Jupiter, Krypton)
  • Jumlah Kucing Peliharaan: (Input angka, minimal 1, maksimal 100)
  • Pengalaman Merawat Kucing Alien: (Textarea, opsional, minimal 20 karakter jika diisi)
  • Centang ini jika bersedia dipromosikan ke galaksi lain: (Checkbox)

Tugas kamu:

  1. Buat komponen React untuk form di atas menggunakan Controlled Components.
  2. Terapkan validasi untuk setiap field sesuai aturan di atas. Tampilkan pesan error jika validasi gagal.
  3. Saat form di-submit, tampilkan semua data form yang berhasil divalidasi ke konsol atau dengan alert, lalu reset form.
  4. (Challenge!) Buat agar tombol submit hanya aktif jika semua field yang wajib sudah terisi dan valid.

Semangat ngoding! Siapa tahu kucing-kucing alien butuh penjaga dari kamu!

Bagikan Artikel Ini