Hari ini kami melanjutkan diskusi tentang penggunaan formulir dalam Bereaksi. Terakhir kali, kami memeriksa fitur interaksi komponen dan bidang teks. Di sini kita membahas bekerja dengan elemen bentuk lain.

β 
Bagian 1: ikhtisar kursus, alasan popularitas React, ReactDOM dan JSXβ 
Bagian 2: komponen fungsionalβ 
Bagian 3: file komponen, struktur proyekβ 
Bagian 4: komponen induk dan anakβ 
Bagian 5: mulai bekerja pada aplikasi TODO, dasar-dasar gayaβ 
Bagian 6: tentang beberapa fitur kursus, JSX dan JavaScriptβ 
Bagian 7: gaya inlineβ 
Bagian 8: terus bekerja pada aplikasi TODO, terbiasa dengan sifat-sifat komponenβ 
Bagian 9: properti komponenβ 
Bagian 10: Workshop bekerja dengan properti komponen dan gayaβ 
Bagian 11: pembuatan markup dinamis dan metode susunan petaβ 
Bagian 12: lokakarya, pekerjaan tahap ketiga pada aplikasi TODOβ 
Bagian 13: komponen berbasis kelasβ 
Bagian 14: lokakarya tentang komponen berbasis kelas, status komponenβ 
Bagian 15: bengkel kesehatan komponenβ 
Bagian 16: tahap keempat dari pengerjaan aplikasi TODO, penanganan acaraβ 
Bagian 17: tahap kelima bekerja pada aplikasi TODO, memodifikasi status komponenβ 
Bagian 18: tahap keenam dari pengerjaan aplikasi TODOβ 
Bagian 19: metode siklus hidup komponenBagian 20: pelajaran pertama dalam rendering bersyaratβ 
Bagian 21: pelajaran kedua dan lokakarya tentang rendering bersyaratβ 
Bagian 22: tahap ketujuh bekerja pada aplikasi TODO, mengunduh data dari sumber eksternalβ 
Bagian 23: pelajaran pertama tentang bekerja dengan formulirβ 
Bagian 24: Pelajaran Bentuk Keduaβ 
Bagian 25: Workshop bekerja dengan formulirβ 
Bagian 26: arsitektur aplikasi, pola Container / Komponenβ 
Bagian 27: proyek kursusPelajaran 42. Bekerja dengan formulir, bagian 2
β 
AsliDalam pelajaran ini kita akan berbicara tentang bidang untuk memasukkan teks multi-line, tentang bendera, tentang tombol radio (mereka juga disebut "tombol radio"), dan tentang bidang dengan daftar. Sampai saat ini, kami hanya mempertimbangkan bekerja dengan bidang input teks biasa.
Berikut adalah kode untuk komponen 
App yang akan kami mulai dengan eksperimen hari ini:
 import React, {Component} from "react" class App extends Component {   constructor() {       super()       this.state = {           firstName: "",           lastName: ""       }       this.handleChange = this.handleChange.bind(this)   }     handleChange(event) {       const {name, value} = event.target       this.setState({           [name]: value       })   }     render() {       return (           <form>               <input                   type="text"                   value={this.state.firstName}                   name="firstName"                   placeholder="First Name"                   onChange={this.handleChange}               />               <br />               <input                   type="text"                   value={this.state.lastName}                   name="lastName"                   placeholder="Last Name"                   onChange={this.handleChange}               />                             {                   /**                    *    :                    *                    * <textarea />                    * <input type="checkbox" />                    * <input type="radio" />                    * <select>  <option>                    */               }                             <h1>{this.state.firstName} {this.state.lastName}</h1>           </form>       )   } } export default App 
Seperti inilah tampilan halaman aplikasi di browser pada tahap kerja ini.
Halaman aplikasi di browserFormulir biasanya berisi tidak hanya bidang yang dimasukkan garis pendek. Ketika melengkapi formulir dengan elemen lain, bekerja dengannya dalam React sedikit rumit, meskipun tidak ada yang istimewa tentang ini.
Dalam kode di atas ada fragmen komentar yang berisi daftar elemen yang akan kita bicarakan. Mari kita mulai dengan bidang untuk memasukkan teks multi-baris - elemen 
textarea . Mungkin paling mudah untuk memahami cara bekerja dengannya. Jika Anda menggunakan elemen ini saat membuat form HTML biasa, Anda tahu bahwa ini bukan tag self-closing, seperti halnya dengan elemen 
input . Ini memiliki bagian pembukaan dan penutupan.
Tambahkan elemen ini ke formulir dengan menyisipkan, segera setelah komentar, kode berikut:
 <br /> <textarea></textarea> 
Jika sekarang Anda melihat halaman aplikasi, Anda dapat melihat bagaimana bidang untuk memasukkan teks multi-baris muncul di dalamnya.
Bidang untuk memasukkan teks pada halamanSeperti yang Anda lihat, bidang ini sedikit lebih tinggi dari bidang biasa, pengguna dapat mengubah ukurannya menggunakan penanda di kanan bawahnya. Berkat 
cols rows dan 
cols Anda dapat menentukan dimensinya saat menjelaskan elemen ini. Dalam HTML biasa, jika Anda ingin memiliki beberapa teks di dalamnya setelah ditampilkan, ini dilakukan dengan memasukkan teks yang diinginkan antara tag pembuka dan penutup elemen. Dalam Bereaksi, bekerja dengan elemen-elemen seperti itu dibuat semirip mungkin dengan bekerja dengan elemen 
input , yang kita bicarakan terakhir kali. Yaitu, dalam Bereaksi, tag 
textarea menutup sendiri. Artinya, kode untuk menampilkan bidang pada halaman dapat diubah sebagai berikut:
 <textarea /> 
Anda dapat menggunakan atribut 
value dalam tag ini, apalagi, bekerja dengannya dilakukan dengan cara yang persis sama dengan atribut yang sama dari bidang teks biasa. Karena itu, keseragaman dicapai dalam bekerja dengan elemen yang berbeda, dan, di samping itu, lebih mudah untuk memperbarui konten bidang dengan memperbarui properti negara yang terkait dengan bidang tersebut. Mari membawa status kode bidang ke formulir ini:
 <textarea value={"Some default value"}/> 
Ini akan menyebabkan teks yang ditentukan muncul di bidang ketika itu ditampilkan pada halaman.
Teks yang muncul di bidangKami akan kembali bekerja dengan bidang untuk memasukkan teks multi-baris, tetapi untuk saat ini kita akan berbicara tentang bendera. Kotak centang adalah kontrol 
input yang tipenya adalah 
checkbox . Berikut ini uraiannya:
 <input type="checkbox" /> 
Di sini terlihat seperti apa bendera yang digambarkan oleh markup ini di halaman.
Kotak centangFitur utama dari kontrol ini adalah fakta bahwa atribut 
value tidak digunakan saat bekerja dengannya. Ini digunakan untuk memberi pengguna pilihan dua opsi, satu di antaranya sesuai dengan kotak centang, dan yang lainnya untuk yang tidak dicentang. Untuk melacak apakah kotak centang dicentang atau tidak dicentang, atribut yang 
checked digunakan, yang dijelaskan oleh nilai logis. Akibatnya, bendera biasanya sesuai dengan properti logis yang disimpan di negara bagian.
Mari kita bawa status komponen ke formulir ini:
 this.state = {   firstName: "",   lastName: "",   isFriendly: true } 
Kode deskripsi bendera diubah sebagai berikut:
 <input   type="checkbox"   checked={this.state.isFriendly} /> 
Setelah itu, kotak centang yang dipilih akan ditampilkan pada halaman.
Kotak centangBenar, sekarang dia tidak akan menanggapi klik padanya. Faktanya adalah bahwa bendera terkait dengan variabel terkait yang disimpan di negara bagian, sebagai akibatnya, ketika kami mencoba, dalam kasus kami, untuk menghapusnya, Bereaksi, memeriksa keadaan, dan menemukan bahwa properti 
isFriendly disetel ke 
true , tidak mengizinkan ini. Pada saat yang sama, peringatan akan ditampilkan di konsol yang menyatakan bahwa kami tidak menyediakan mekanisme untuk mengubah bidang ( 
onChange event 
onChange ) dan bahwa itu ditampilkan dalam status hanya baca.
Peringatan KonsolKami mungkin menulis metode khusus untuk bekerja dengan flag, tetapi kode komponen kami sudah memiliki metode 
handleChange() . Sekarang digunakan untuk bekerja dengan bidang teks. Kami akan memikirkan cara menggunakannya untuk bekerja dengan bendera. Untuk melakukan ini, pertama tetapkan metode di atas sebagai 
onChange event 
onChange flag dan tetapkan flag nama yang sesuai dengan nama properti negara yang terkait dengan flag. Selain itu, kami akan menandatangani bendera menggunakan tag 
label :
 <label>    <input       type="checkbox"       name="isFriendly"       checked={this.state.isFriendly}       onChange={this.handleChange}   /> Is friendly? </label> 
Dalam metode 
handleChange() , kode yang ditunjukkan di bawah ini, ketika bekerja dengan bidang teks, kami menemukan nama elemen ( 
name ) dan isinya ( 
value ), setelah itu kami memperbarui keadaan dengan menulis padanya bidang apa dengan nama tertentu di dalamnya atribut 
value :
 handleChange(event) {   const {name, value} = event.target   this.setState({       [name]: value   }) } 
Sekarang kita perlu mencari tahu bagaimana menangani flag yang tidak memiliki atribut 
value . Ini hanya memiliki atribut yang 
checked , yang hanya dapat menerima nilai 
true atau 
false . Sebagai hasilnya, untuk menggunakan metode 
handleChange() untuk bekerja dengan sebuah flag, kita perlu memeriksa apakah elemen yang dipanggil oleh handler ini adalah sebuah flag. Untuk melakukan pemeriksaan ini, kami ingat bahwa tipe ( 
type ) dari elemen 
input yang mewakili flag diatur ke 
checkbox . Untuk memeriksa nilai ini, Anda bisa merujuk ke 
type properti elemen 
event.target . Kami akan mengekstrak properti ini dari 
event.target , serta properti yang 
checked , menggunakan konstruksi berikut:
 const {name, value, type, checked} = event.target 
Sekarang kita dapat memeriksa nilai konstanta 
type dan mencari tahu apakah elemen yang dipanggil oleh event handler adalah sebuah flag. Jika ini masalahnya, kami akan menulis ke negara bagian apa yang ternyata berada dalam konstanta yang 
checked . Jangan lupa untuk menyimpan kode yang bertanggung jawab untuk bekerja dengan bidang teks. Hasilnya, kode 
handleChange() mengambil bentuk berikut:
 handleChange(event) {   const {name, value, type, checked} = event.target   type === "checkbox" ? this.setState({ [name]: checked }) : this.setState({ [name]: value }) } 
Setelah itu, periksa pengoperasian bendera.
Memeriksa pengoperasian benderaSeperti yang Anda lihat, sekarang dapat dihapus dan diinstal. Pada saat yang sama, karya bidang teks tidak rusak. Pemberitahuan tentang kotak centang telah menghilang dari konsol, tetapi pemberitahuan ditampilkan di sana mengenai bidang untuk memasukkan teks multi-baris. Ubah kode yang menjelaskan bidang ini sebagai berikut:
 <textarea   value={"Some default value"}   onChange={this.handleChange} /> 
Ini akan menyebabkan hilangnya pemberitahuan, meskipun kami tidak menerapkan mekanisme lain untuk bekerja dengan bidang ini menggunakan alat komponen (tidak menentukan nama untuk bidang, tidak menambahkan properti yang sesuai ke negara). Anda dapat mengimplementasikan fitur-fitur ini sendiri. Sekarang mari kita bicara tentang sakelar.
Mereka dapat direpresentasikan sebagai kombinasi elemen 
input dari 
text dan tipe 
checkbox . Yang dimaksud di sini adalah sakelar memiliki atribut 
value dan atribut yang 
checked . Tambahkan beberapa sakelar ke formulir kami, buat kodenya berdasarkan kode deskripsi bendera. Begini tampilannya:
 <label>   <input       type="radio"       name="gender"       value="male"       checked={this.state.isFriendly}       onChange={this.handleChange}   /> Male </label> <br /> <label>   <input       type="radio"       name="gender"       value="female"       checked={this.state.isFriendly}       onChange={this.handleChange}   /> Female </label> 
Kami membuat kode ini berdasarkan kode deskripsi bendera dan masih belum mengedit sesuatu. Oleh karena itu, sakelar berperilaku aneh. Secara khusus, jika kotak centang tidak dicentang, maka kedua sakelar berada dalam status "mati", dan jika Anda memilih kotak centang, salah satunya ternyata "aktif". Kesalahan tersebut dapat dicegah dengan memperlakukan kode elemen dengan hati-hati jika kode tersebut dibuat berdasarkan kode elemen yang ada. Sekarang kita akan memperbaikinya.
Harap perhatikan bahwa kedua elemen ini memiliki nama yang sama - 
gender . Berganti dengan nama yang sama dari grup. Hanya satu sakelar yang termasuk dalam grup tersebut yang dapat dipilih.
Saat mengonfigurasi sakelar, Anda tidak bisa hanya menunjukkan bahwa nilai yang 
checked ditetapkan, katakanlah, menjadi 
true jika beberapa properti negara 
true . Switch harus mendukung sinkronisasi, di dalam grup, berubah di negara mereka sendiri. Sebagai gantinya, nilai yang 
checked dari sakelar ditentukan oleh kondisi. Dalam kasus kami, kondisi ini akan diwakili dengan membandingkan properti negara 
this.state.gender dengan string 
male atau 
female . Dalam kode deskripsi sakelar, tampilannya seperti ini:
 <label>   <input       type="radio"       name="gender"       value="male"       checked={this.state.gender === "male"}       onChange={this.handleChange}   /> Male </label> <br /> <label>   <input       type="radio"       name="gender"       value="female"       checked={this.state.gender === "female"}       onChange={this.handleChange}   /> Female </label> 
Sekarang tambahkan properti baru, 
gender , ke negara, inisialisasi dengan string kosong:
 this.state = {   firstName: "",   lastName: "",   isFriendly: false,   gender: "" } 
Setelah itu, sakelar akan bekerja terlepas dari kotak centang. Tambahkan ke output kode oleh komponen header tingkat kedua yang menampilkan informasi tentang saklar mana yang dipilih:
 <h2><font color="#3AC1EF">You are a {this.state.gender}</font></h2> 
Di sini, mungkin, ada baiknya memperkenalkan beberapa mekanisme rendering bersyarat. Ini akan memungkinkan, ketika membuka halaman, ketika tidak ada tombol radio yang dipilih, untuk memastikan bahwa teks 
You are a tidak akan ditampilkan di dalamnya, tetapi kami tidak akan melakukan ini, meskipun Anda dapat menerapkannya sendiri. Sekarang mari kita lihat apa yang kita dapat.
Mengaktifkan halaman aplikasiSegala sesuatu yang kita bicarakan di sini mungkin tampak cukup rumit. Secara khusus, ini menyangkut menghafal fitur kontrol yang berbeda. Untuk menyederhanakan pekerjaan dengan formulir, Anda bisa menggunakan perpustakaan khusus. Misalnya, perpustakaan 
formik . Pustaka ini sangat menyederhanakan proses pengembangan formulir dalam aplikasi Bereaksi.
Sekarang mari kita bicara tentang bidang daftar.
Dalam HTML normal, konstruk berikut digunakan untuk menjelaskan kotak kombo:
 <select>   <option></option>   <option></option>   <option></option> <select/> 
Bereaksi mengambil pendekatan yang serupa, meskipun, seperti halnya dengan elemen lain, atribut 
value digunakan. Ini memudahkan untuk mengetahui item daftar mana yang dipilih, dan sebagai tambahan, membuatnya lebih mudah untuk bekerja dengan keadaan komponen.
Misalkan kita ingin membuat kotak kombo yang memungkinkan pengguna untuk memilih warna favoritnya. Untuk melakukan ini, Anda bisa meletakkan konstruksi berikut dalam atribut 
value dari elemen 
select : 
value={this.state.favColor} . Ini akan mendapatkan nilai yang dipilih pengguna. Sekarang tambahkan 
favColor ke negara:
 this.state = {   firstName: "",   lastName: "",   isFriendly: false,   gender: "",   favColor: "blue" } 
Selanjutnya, kami melengkapi kotak kombo dengan 
onChange event 
onChange dan memberinya nama. Kami juga menetapkan nilai nilai untuk elemen 
options kotak kombo dan memasukkan teks yang akan ditampilkan dalam kotak.
Inilah yang terlihat seperti elemen 
select tanda tangan 
select dengan tanda tangan:
 <label>Favorite Color:</label> <select   value={this.state.favColor}   onChange={this.handleChange}   name="favColor" >   <option value="blue">Blue</option>   <option value="green">Green</option>   <option value="red">Red</option>   <option value="orange">Orange</option>   <option value="yellow">Yellow</option> </select> 
Sekarang tambahkan tulisan lain ke formulir yang menampilkan warna favorit pengguna:
 <h2><font color="#3AC1EF">Your favorite color is {this.state.favColor}</font></h2> 
Sudah waktunya untuk mencoba kotak kombo.
Kotak komboSeperti yang Anda lihat, meskipun bentuk kami tidak bersinar dengan kecanggihan desain, kontrol yang ditempatkan di atasnya berfungsi seperti yang diharapkan.
Berkat cara kontrol Bereaksi diatur dalam Bereaksi, mudah untuk menggunakan penangan yang sama untuk menangani acara mereka. Ini persis skema kerja yang digunakan dalam kasus kami. Satu-satunya fitur penangan 
handleChange() adalah kami harus menangani acara bendera dengan cara khusus.
Sekarang mari kita bicara tentang mengirimkan formulir atau memproses nilai-nilai yang dimasukkan setelah selesai. Ada dua pendekatan untuk melakukan tindakan tersebut. Saat menggunakan salah satunya, formulir harus dilengkapi dengan tombol:
 <button>Submit</button> 
Di HTML5, jika elemen 
button ditemukan dalam formulir, itu akan bertindak seperti elemen 
input lama dari tipe 
submit . Jika Anda mengklik tombol ini, suatu peristiwa dari formulir 
onSubmit itu sendiri akan dipicu. Jika Anda perlu melakukan sesuatu setelah mengisi formulir, Anda bisa menambahkan event 
onClick ke tombol, tetapi sebagai contoh, saya pribadi lebih suka menangani event semacam itu di level form, menugaskan 
onSubmit handler 
onSubmit untuk 
onSubmit :
 <form onSubmit={this.handleSubmit}> 
Metode yang digunakan sebagai penangan untuk acara ini belum ditulis. Ini adalah pengendali kejadian reguler, yang, misalnya, merujuk ke API tertentu, meneruskan data formulir ke dalamnya.
Ringkasan
Dalam pelajaran ini, kami menyimpulkan pembicaraan kami tentang bekerja dengan formulir di Bereaksi. Lain kali Anda akan menemukan pekerjaan praktis tentang topik ini.
Pembaca yang budiman! Jika Anda mencoba menggunakan pustaka formik untuk membuat formulir di Bereaksi, beri tahu kami tentang hal itu.
