September 11, 2026

Membangun Form Berbasis Skema (Data-Driven Forms).

Cara membangun form dinamis di React memakai skema JSON sebagai sumber kebenaran, sehingga struktur form bisa berubah tanpa mengubah kode komponen.

Form berbasis skema (data-driven form) adalah pendekatan di mana struktur form — field apa saja, tipe input, dan aturan validasinya — didefinisikan dalam data (biasanya JSON), bukan ditulis manual sebagai JSX untuk setiap field.

Masalah yang Diselesaikan

Form dengan banyak field yang sering berubah, atau form yang strukturnya berbeda-beda tergantung konteks (misalnya form pendaftaran berbeda per jenis akun), akan sangat merepotkan jika setiap variasi ditulis sebagai komponen JSX terpisah. Pendekatan berbasis skema memungkinkan struktur form disimpan sebagai data, bahkan bisa diatur dari luar kode aplikasi seperti dari database atau CMS.

Mendefinisikan Skema

const skemaForm = [
  { nama: "namaLengkap", label: "Nama Lengkap", tipe: "text", wajib: true },
  { nama: "email", label: "Email", tipe: "email", wajib: true },
  {
    nama: "peran",
    label: "Peran",
    tipe: "select",
    opsi: ["Admin", "Editor", "Pembaca"],
  },
];

Merender Field Secara Dinamis

function FieldForm({ field, nilai, onChange }) {
  if (field.tipe === "select") {
    return (
      <select value={nilai} onChange={(e) => onChange(field.nama, e.target.value)}>
        {field.opsi.map((opsi) => (
          <option key={opsi} value={opsi}>{opsi}</option>
        ))}
      </select>
    );
  }

  return (
    <input
      type={field.tipe}
      value={nilai}
      required={field.wajib}
      onChange={(e) => onChange(field.nama, e.target.value)}
    />
  );
}
function FormDinamis({ skema, onSubmit }) {
  const [data, setData] = useState({});

  const ubahField = (nama, nilai) => {
    setData((prev) => ({ ...prev, [nama]: nilai }));
  };

  return (
    <form onSubmit={(e) => { e.preventDefault(); onSubmit(data); }}>
      {skema.map((field) => (
        <div key={field.nama}>
          <label>{field.label}</label>
          <FieldForm
            field={field}
            nilai={data[field.nama] || ""}
            onChange={ubahField}
          />
        </div>
      ))}
      <button type="submit">Simpan</button>
    </form>
  );
}

Validasi Berbasis Skema

function validasi(skema, data) {
  const errors = {};

  for (const field of skema) {
    if (field.wajib && !data[field.nama]) {
      errors[field.nama] = `${field.label} wajib diisi`;
    }
  }

  return errors;
}

Menambah Field Baru Tanpa Mengubah Komponen

Keunggulan utama pendekatan ini terlihat saat ada kebutuhan field baru — cukup menambahkan satu objek ke array skema, tanpa menyentuh komponen FormDinamis atau FieldForm sama sekali.

skemaForm.push({
  nama: "nomorTelepon",
  label: "Nomor Telepon",
  tipe: "tel",
  wajib: false,
});

Kapan Pendekatan Ini Cocok Dipakai

Form berbasis skema sangat berguna untuk aplikasi admin dengan banyak form serupa, form yang perlu dikonfigurasi non-developer, atau sistem yang formnya berubah-ubah tergantung data dari server. Untuk form sederhana dengan sedikit field yang jarang berubah, menulis JSX secara langsung biasanya tetap lebih mudah dibaca dan dipelihara.

Kesimpulan

Dengan memisahkan struktur form dari implementasi komponennya, form berbasis skema memungkinkan perubahan field dilakukan lewat data, bukan lewat kode. Pendekatan ini sangat berharga untuk aplikasi berskala besar dengan banyak form yang serupa polanya namun berbeda kebutuhannya di tiap konteks.

Hey! I’m Fanny, the software engineer tending to this digital garden. You can read more about me, or subscribe by email.

Comments