Terakhir diperbaharui: Mar 2, 2021
Form
React Form sedikit berbeda dengan HTML Form, React memperkenalkan konsep controlled component dan uncontrolled component.
Controlled Components
Pada HTML, data dari sebuah form dihandle oleh DOM.
Tetapi pada React, data atau value dari setiap element di dalam form di simpan dalam component state.
Sebuah element HTML yang valuenya dikontrol oleh React disebut controlled component, selain itu disebut uncontrolled component.
Contoh membuat form di React:
1import React, { useState } from 'react';23export default function App() {4 const [state, setState] = useState('');56 const handleSubmit = () => {7 alert(`Hi ${state}`);8 };910 const handleChange = (e) => {11 setState(e.target.value);12 };1314 return (15 <div>16 <h1>Masukan Nama</h1>17 <form onSubmit={handleSubmit}>18 <label>19 Nama:20 <input type="text" value={state} onChange={handleChange} />21 </label>22 <input type="submit" value="Submit" />23 </form>24 </div>25 );26}
Pada code di atas value dari element <input>
disimpan dalam state dan diupdate menggunakan setState()
, handler handleSubmit()
dieksekusi ketika form disubmit.
e
adalah event object, salah satu propertiesnya adalahe.target
yang mewakili sebuah element DOMSedangkan
e.target.value
mewakili value dari sebuah element DOM
Uncontrolled Components
<input type="file" />
adalah contoh dari uncontrolled component, karena value tersebut tidak dikontrol oleh React maka untuk mengakses file kita harus menggunakan File API dan Refs.
Refs
Refs dapat digunakan untuk mengakses react element di dalam method render.
Untuk membuat Refs kita menggunakan React.createRef() yang dipasang ke sebuah elemen lewat atribut ref.
1import React from "react";23export default function App() {4 const fileInput = React.createRef();56 const handleSubmit = (e) => {7 e.preventDefault();8 alert(`Nama file: ${e.fileInput.current.files[0].name}`);9 };1011 return (12 <div>13 <h1>Upload File</h1>14 <form onSubmit={handleSubmit}>15 <label>16 Pilih File17 <input type="file" ref={fileInput} style={{marginLeft: "5px"}} />18 </label>19 </form>20 </div>21 );22}