Controlled VS Uncontrolled Form di React.Js
Form merupakan fitur HTML yang digunakan untuk menerima input dari user. Form di React.js dapat di-handle dengan dua cara yaitu controlled dan uncontrolled. Apa sih perbedaannya? simak contoh kode dibawah ini.
Uncontrolled Form
Kapan pakai nya? kalau kita hanya perlu tau value sebuah form ketika ingin submit. Jadinya ngga perlu pasang atttribute onChange. Contoh kode :
<form
onSubmit={(e) => {
e.preventDefault()
const formData = new FormData(e.target)
const obj = {
location: formData.get('location') ?? '',
animal: formData.get('animal') ?? '',
breed: formData.get('breed') ?? '',
}
setReqParams(obj)
}}
>
<label htmlFor="location">
Location
<input name="location" id="location" placeholder="Location" />
</label>
<label htmlFor="animal">
Animal
<select
onChange={(e) => {
setAnimal(e.target.value)
}}
onBlur={(e) => {
setAnimal(e.target.value)
}}
id="animal"
value={animal}
placeholder="Animal"
>
{ANIMALS.map((animal) => (
<option value={animal} key={animal}>
{animal}
</option>
))}
</select>
</label>
<label htmlFor="breed">
Breed
<select
id="breed"
name="breed"
disabled={breeds.length === 0}
placeholder="Breed"
>
{breeds.map((breed) => (
<option value={breed} key={breed}>
{breed}
</option>
))}
</select>
</label>
<button>Submit</button>
</form>
note: Animal masih pake onChange karena untuk breedList kita perlu tau ras / jenis / breed dari hewan apa yang ingin dimunculkan. Misal animalnya anjing, maka breedList akan render jenis breed yang ada di anjing. Misalnya, Husky dan Bulldog. Ngga mungkin dong breed anjing ada British Short hair / Maine Coon. Nah, kasus tersebut namanya controlled form.
Controlled Form
Secara umum, kita listen input dari user dengan onChange lalu simpan valuenya di state.
import React, { useState } from 'react';
const ControlledForm = () => {
// State to hold the form data
const [formData, setFormData] = useState({
username: '',
email: '',
});
// Event handler for form input changes
const handleChange = (event) => {
const { name, value } = event.target;
setFormData({
...formData,
[name]: value,
});
};
// Event handler for form submission
const handleSubmit = (event) => {
event.preventDefault();
// Do something with the form data, e.g., send it to a server
console.log('Form submitted with data:', formData);
};
return (
<form onSubmit={handleSubmit}>
<div>
<label htmlFor="username">Username:</label>
<input
type="text"
id="username"
name="username"
value={formData.username}
onChange={handleChange}
/>
</div>
<div>
<label htmlFor="email">Email:</label>
<input
type="email"
id="email"
name="email"
value={formData.email}
onChange={handleChange}
/>
</div>
<button type="submit">Submit</button>
</form>
);
};
export default ControlledForm;
formDataState untuk menyimpan value formhandleChangeHandler yang akan update valu state setiap user mengisi form- The
valueAttribute yang dimiliki setiap input. Sumber datanya dari stateformData. handleSubmitHandler yang berfungsi untuk melakukan sesuatu dengan data form. Misal post ke API.