Sekilas tentang React Hook
Hooks merupakan fitur baru di React 16.8. Dengan Hooks, kita dapat menggunakan state dan fitur React yang lain tanpa perlu menulis sebuah kelas baru.
import React, { useState } from 'react';
function Example() {
// Mendeklarasikan variabel state baru, yaitu "count"
const [count, setCount] = useState(0);
return (
<div>
<p>Kamu mengklik {count} kali</p>
<button onClick={() => setCount(count + 1)}>
Klik aku
</button>
</div>
);
}
Untuk mempelajari dasar-dasar react-hook, kamu dapat pelajari di halaman ini
Ketika mendevelop sebuah aplikasi React, seringkali kita menemui penggunaan state yang sama pada beberapa komponen yang berbeda. Contoh:
FormBiodata.js
import React, { useState } from 'react';
const FormBiodata = () => {
const [state, setState] = {
name: '',
age: 0,
province: '',
city: '',
district: '',
subdistrict: ''
}
// ... another method
return (
<div>
// ... your component
</div>
)
}
FormEvent.js
import React, { useState } from 'react';
const FormEvent = () => {
const [state, setState] = {
event_name: '',
address: '',
province: '',
city: '',
district: '',
subdistrict: ''
}
// ... another method
return (
<div>
// ... your component
</div>
)
}
Pada contoh component diatas, component FormBiodata
dan FormEvent
menggunakan sebagian state yang sama yaitu province
, city
, district
dan subdistrict
. Untuk menghindari pembuatan state yang sama secara berulang-ulang, maka perlu kita buat state-nya menjadi reusable. Bagaimana caranya? Simak artikel ini sampai selesai!!!
Tahap pertama kita buat file UseLocation.js
, component ini yang nanti nya akan di panggil oleh FormBiodata dan FormEvent
import React, { useState } from 'react';
const useLocation = () => {
// definisikan default state nya
const defaultLocation = {
province: '',
city: '',
district: '',
subdistrict: ''
};
// assign defaultLocation ke state location
const [location, setLocation] = defaultLocation;
// untuk clear state location
const resetLocation = () => {
setLocation(defaultLocation)
}
return {
defaultLocation,
location,
setLocation,
resetLocation
}
}
export default useLocation;
Khusus untuk penggunaan state yang berhubungan dengan location, cukup gunakan useLocation. Berikut beberapa modifikasi pada file FormBiodata
dan FormEvent
.
FormBiodata.js
import React, { useState } from 'react';
import useLocation from './useLocation';
const FormBiodata = () => {
const [biodata, setBiodata] = {
name: '',
age: 0,
}
const {
location, // state location
setLocation // method untuk manipulasi state location
} = useLocation();
// handle submit
const onSumbit = (e) => {
e.preventDefault();
// gabungkan state biodata & location
const newState = {...biodata, ...location};
console.log(newState);
// lakukan step lainnya ...
}
// ... another method
return (
<div>
<form onSumbit={onSubmit}>
<input type="text" name="name" value={biodata.name} onChange={e => setBiodata({...biodata, name: e.target.value})>
<input type="number" name="age" value={biodata.age} onChange={e => setBiodata({...biodata, age: e.target.value})>
// -- location section
<input type="text" name="province" value={location.province} onChange={e => setLocation({...location, province: e.target.value})>
<input type="text" name="city" value={location.city} onChange={e => setLocation({...location, city: e.target.value})>
<input type="text" name="district" value={location.district} onChange={e => setLocation({...location, district: e.target.value})>
<input type="text" name="subdistrict" value={location.subdistrict} onChange={e => setLocation({...location, subdistrict: e.target.value})>
// -- end location section
<button type="submit">Submit</button>
</form>
</div>
)
}
FormEvent.js
import React, { useState } from 'react';
import useLocation from './useLocation';
const FormEvent = () => {
const [event, setEvent] = {
event_name: '',
address: '',
}
const {
location, // state location
setLocation // method untuk manipulasi state location
} = useLocation();
// handle submit
const onSumbit = (e) => {
e.preventDefault();
// gabungkan state event & location
const newState = {...event, ...location};
console.log(newState);
// lakukan step lainnya ...
}
// ... another method
return (
<div>
<form onSumbit={onSubmit}>
<input type="text" name="event_name" value={event.event_name} onChange={e => setEvent({...event, name: e.target.value})>
<input type="text" name="address" value={event.address} onChange={e => setEvent({...event, address: e.target.value})>
// -- location section
<input type="text" name="province" value={location.province} onChange={e => setLocation({...location, province: e.target.value})>
<input type="text" name="city" value={location.city} onChange={e => setLocation({...location, city: e.target.value})>
<input type="text" name="district" value={location.district} onChange={e => setLocation({...location, district: e.target.value})>
<input type="text" name="subdistrict" value={location.subdistrict} onChange={e => setLocation({...location, subdistrict: e.target.value})>
// -- end location section
<button type="submit">Submit</button>
</form>
</div>
)
}
Nah, dengan dibuatnya useLocation dapat dipanggil oleh component yang berbeda-beda & mempermudah pengelompokan state. Contoh diatas masih versi sederhana, dalam penggunaannya masih bisa kamu kembangkan lagi.
Selamat mencoba!