Banyak pengguna hari ini berharap. Bagaimana Anda mencapai tingkat interaktivitas ini ketika Anda membangun situs statis kecil atau aplikasi Rails atau Laravel yang dirender server? . js dan Yodium. js adalah dua perpustakaan JavaScript minimal yang dapat kita gunakan untuk membuat formulir yang sangat interaktif dengan sedikit hutang teknis dan sedikit waktu pemuatan halaman kita. Pustaka seperti ini mencegah Anda dari keharusan menggunakan alat JavaScript berat langkah-bangun yang dapat memperumit arsitektur Anda Show Saya akan mengulangi beberapa versi validasi formulir untuk menjelaskan API dari kedua pustaka ini. Jika Anda ingin menyalin dan menempelkan produk jadi, inilah yang akan kami buat. Cobalah bermain-main dengan input yang hilang atau tidak valid dan lihat bagaimana form bereaksi CodePen Embed Fallback Sekilas tentang perpustakaanSebelum kita benar-benar mendalaminya, ada baiknya kita berkenalan dengan perkakas yang kita gunakan Alpine dirancang untuk ditarik ke proyek Anda dari CDN. Tidak ada langkah build, tidak ada konfigurasi bundler, dan tidak ada dependensi. Itu hanya membutuhkan GitHub pendek 2 untuk dokumentasinya. Hanya jam 8. 36 kilobyte diperkecil dan di-gzip, kira-kira seperlima dari ukuran hello world aplikasi-buat-reaksi. Hugo Di Francesco menawarkan ikhtisar lengkap dan menyeluruh tentang apa itu dan bagaimana cara kerjanya. Deskripsi awalnya tentang itu cukup bagus
Yodium, di sisi lain, adalah pustaka validasi bentuk mikro, dibuat oleh Matt Kingshott yang bekerja di dunia Laravel/Vue/Tailwind. Yodium dapat digunakan dengan kerangka kerja front-end apa pun sebagai pembantu validasi formulir. Ini memungkinkan kami untuk memvalidasi satu bagian data dengan beberapa aturan. Yodium juga mengembalikan pesan kesalahan yang masuk akal saat validasi gagal. Anda dapat membaca lebih lanjut di postingan blog Matt yang menjelaskan alasan di balik Yodium Sekilas tentang bagaimana Yodium bekerjaInilah validasi formulir sisi klien yang sangat mendasar menggunakan Iodine. Kami akan menulis beberapa vanilla JavaScript untuk didengarkan saat formulir dikirimkan, lalu gunakan metode DOM untuk memetakan input untuk memeriksa setiap nilai input. Jika salah, kami akan menambahkan kelas "tidak valid" ke input yang tidak valid dan mencegah pengiriman formulir Kami akan menarik Yodium dari tautan CDN ini untuk contoh ini _Atau kita bisa mengimpornya ke proyek dengan Skypack
Kita perlu mengimpor _3 saat mengimpor Yodium dari Skypack. Ini masih menambahkan 4 ke cakupan global/jendela kita. Dalam kode pengguna Anda, Anda dapat terus merujuk ke perpustakaan sebagai 4, tetapi pastikan untuk mengimpor 3 jika Anda mengambilnya dari SkypackUntuk memeriksa setiap masukan, kami memanggil metode 7 pada Iodine. Kami meneruskan nilai input sebagai parameter pertama, dan array string sebagai parameter kedua. String ini adalah aturan yang harus diikuti input agar valid. Daftar aturan bawaan dapat ditemukan di dokumentasi YodiumMetode 7 Iodine mengembalikan 9 jika nilainya valid, atau string yang menunjukkan aturan gagal jika pemeriksaan gagal. Ini berarti kita harus menggunakan perbandingan ketat saat bereaksi terhadap keluaran fungsi; . Apa yang bisa kita lakukan adalah menyimpan array string untuk aturan untuk setiap input sebagai JSON dalam atribut data HTML. Ini tidak dibangun di Alpine atau Iodine, tapi menurut saya ini cara yang bagus untuk menempatkan input bersama dengan batasannya. Perhatikan bahwa jika Anda melakukan ini, Anda harus mengapit JSON dengan tanda kutip tunggal dan menggunakan tanda kutip ganda di dalam atribut untuk mengikuti spesifikasi JSONBegini tampilannya di HTML kita
Saat kami memetakan melalui DOM untuk memeriksa validitas setiap input, kami memanggil fungsi 4 dengan nilai input elemen, lalu 2 hasil dari 3 input. Seperti inilah tampilannya menggunakan metode vanilla JavaScript DOM
Inilah implementasi yang sangat mendasar ini CodePen Embed Fallback Seperti yang Anda tahu, ini bukan pengalaman pengguna yang hebat. Yang terpenting, kami tidak memberi tahu pengguna apa yang salah dengan pengiriman tersebut. Pengguna juga harus menunggu hingga formulir dikirimkan sebelum menemukan ada yang salah. Dan yang membuat frustrasi, semua input mempertahankan kelas "tidak valid" bahkan setelah pengguna memperbaikinya untuk mengikuti aturan validasi kami Di sinilah Alpine berperanMari tarik dan gunakan untuk memberikan umpan balik pengguna yang bagus saat berinteraksi dengan formulir Opsi yang baik untuk validasi formulir adalah memvalidasi input saat diburamkan atau pada perubahan apa pun setelah diburamkan. Hal ini memastikan bahwa kita tidak meneriaki pengguna sebelum mereka selesai menulis, tetapi tetap memberi mereka umpan balik instan jika mereka meninggalkan input yang tidak valid atau kembali dan mengoreksi nilai input Kami akan menarik Alpine dari CDN
Atau kita bisa mengimpornya ke proyek dengan Skypack
Sekarang hanya ada dua keadaan yang perlu kita tahan untuk setiap masukan
Validasi yang kami tunjukkan dalam formulir akan menjadi fungsi dari dua bagian negara ini Alpine memungkinkan kita mempertahankan status ini dalam komponen dengan mendeklarasikan objek JavaScript biasa dalam atribut 4 pada elemen induk. Status ini dapat diakses dan dimutasi oleh elemen turunannya untuk menciptakan interaktivitas. Untuk menjaga kebersihan HTML, kita dapat mendeklarasikan fungsi JavaScript yang mengembalikan semua data dan/atau fungsi yang dibutuhkan formulir. Kemudian kita hanya perlu mendaftarkan fungsi kita dengan Alpine menggunakan atribut 5, dan memanggil 6 setelah mendaftarkannya. Menggunakan Alpine dengan cara ini juga menyediakan cara yang dapat digunakan kembali untuk berbagi logika karena kita dapat menggunakan fungsi yang sama di beberapa komponen atau bahkan beberapa proyekMari menginisialisasi formulir data untuk menampung objek untuk setiap kolom input dengan dua properti. string kosong untuk _7 dan boolean disebut kabur. Kami akan menggunakan atribut nama dari setiap elemen sebagai kuncinya
Dan inilah fungsi kita untuk mengatur data. Perhatikan bahwa kuncinya cocok dengan atribut _8 dari input kita
Sekarang kita dapat menggunakan atribut 9 Alpine pada input kita untuk menambahkan kelas "invalid" jika input kabur dan ada pesan untuk elemen dalam data komponen kita. Begini tampilannya di input nama pengguna kami
Menanggapi perubahan masukanSekarang kita membutuhkan formulir kita untuk merespons perubahan input dan status input yang kabur. Kita dapat melakukan ini dengan menambahkan event listener. Alpine memberikan API ringkas untuk melakukan ini baik menggunakan 0 atau, mirip dengan Vue, kita dapat menggunakan simbol 1. Kedua cara mendeklarasikan tindakan ini dengan cara yang samaPada event input kita perlu mengubah 7 dalam data komponen menjadi pesan error jika nilainya tidak valid; Pada acara _3 kita perlu menyetel properti 4 sebagai 9 pada objek dengan kunci yang cocok dengan nama elemen buram. Kami juga perlu menghitung ulang pesan kesalahan untuk memastikan tidak menggunakan string kosong yang kami inisialisasi sebagai pesan kesalahanJadi kita akan menambahkan dua fungsi lagi ke formulir kita untuk bereaksi terhadap pemburaman dan memasukkan perubahan, dan menggunakan nilai 8 dari target acara untuk menemukan bagian mana dari data komponen kita yang akan diubah. Kita dapat mendeklarasikan fungsi ini sebagai properti dalam objek yang dikembalikan oleh fungsi 7Inilah HTML kami untuk input nama pengguna dengan event listener terlampir
Dan JavaScript kami dengan fungsi yang merespons pendengar acara 0Mendapatkan dan menampilkan kesalahanSelanjutnya, kita perlu menulis fungsi ________16______8 kita Jika cek Yodium mengembalikan _9, kami akan menyetel properti 7 ke string kosong. Jika tidak, kami akan meneruskan aturan yang telah dilanggar ke metode Iodine lain. _8. Ini akan mengembalikan pesan yang dapat dibaca manusia. Begini tampilannya 1Sekarang kita juga perlu menunjukkan pesan kesalahan kita kepada pengguna Mari tambahkan tag _2 dengan kelas 3 di bawah setiap masukan. Kita dapat menggunakan atribut Alpine lain yang disebut 4 pada elemen ini untuk hanya menampilkannya ketika pesan kesalahannya ada. Atribut _4 menyebabkan Alpine untuk beralih 6 pada elemen berdasarkan apakah ekspresi JavaScript memutuskan untuk 9. Kita dapat menggunakan ekspresi yang sama dengan yang kita gunakan di kelas 8 pada inputUntuk menampilkan teks, kita dapat menghubungkan pesan kesalahan kita dengan 9. Ini akan secara otomatis mengikat _0 ke ekspresi JavaScript tempat kita dapat menggunakan status komponen kita. Begini tampilannya 2Satu hal terakhir yang dapat kita lakukan adalah menggunakan kembali kode 1 sebelum kita menarik Alpine, tetapi kali ini kita dapat menambahkan event listener ke elemen form dengan 2 dan menggunakan fungsi 3 di data komponen kita. Alpine memungkinkan kita menggunakan _4 untuk merujuk ke elemen induk yang menyimpan status komponen kita. Ini berarti kita tidak perlu menulis lagi metode DOM 3 4CodePen Embed Fallback Ini menuju ke sana
Memvalidasi di sisi klien dari aplikasi yang dirender di sisi serverMasih ada beberapa masalah dengan versi ini, meskipun beberapa tidak akan langsung terlihat jelas di Pena karena terkait dengan server. Misalnya, sulit memvalidasi semua error di sisi klien dalam aplikasi yang dirender di sisi server. Bagaimana jika alamat email sudah digunakan? . Ada beberapa cara untuk melakukannya dengan AJAX, tetapi kami akan melihat solusi yang lebih ringan Kami dapat menyimpan kesalahan sisi server di atribut data array JSON lain pada setiap input. Sebagian besar kerangka kerja back-end akan menyediakan cara yang cukup mudah untuk melakukan ini. Kita dapat menggunakan atribut Alpine lain yang disebut 5 untuk menjalankan fungsi saat komponen diinisialisasi. Dalam fungsi ini kita dapat menarik kesalahan sisi server dari DOM ke dalam setiap data komponen masukan. Kemudian kita dapat memperbarui fungsi _8 untuk memeriksa apakah ada kesalahan server dan mengembalikannya terlebih dahulu. Jika tidak ada, maka kami dapat memeriksa kesalahan sisi klien 5Dan untuk memastikan kesalahan sisi server tidak muncul sepanjang waktu, bahkan setelah pengguna mulai memperbaikinya, kami akan menggantinya dengan larik kosong setiap kali masukannya diubah Inilah fungsi init kita sekarang 6Menangani input yang saling bergantungBeberapa input formulir mungkin bergantung pada yang lain untuk validitasnya. Misalnya, input konfirmasi kata sandi akan bergantung pada kata sandi yang dikonfirmasi. Atau tanggal Anda memulai bidang pekerjaan harus memiliki nilai lebih lama dari bidang tanggal lahir Anda. Artinya, sebaiknya periksa semua input formulir setiap kali input diubah Kita dapat memetakan semua elemen input dan mengatur statusnya pada setiap input dan peristiwa blur. Dengan cara ini, kita tahu bahwa input yang saling bergantung tidak akan menggunakan data lama Untuk mengujinya, mari tambahkan aturan 7 untuk konfirmasi kata sandi kita. Yodium memungkinkan kita menambahkan aturan khusus baru dengan metode 8 7Sekarang kita dapat mengatur pesan kesalahan khusus dengan menambahkan kunci ke properti 9 di Iodine _8Kami dapat menambahkan kedua panggilan ini di fungsi 0 kami untuk menyiapkan aturan iniDalam implementasi kami sebelumnya, kami dapat mengubah bidang "kata sandi" dan itu tidak akan membuat bidang "konfirmasi kata sandi" menjadi tidak valid. Tapi sekarang kami memetakan melalui semua masukan pada setiap perubahan, formulir kami akan selalu memastikan kata sandi dan konfirmasi kata sandi cocok Beberapa sentuhan akhirSatu refactor kecil yang bisa kita lakukan adalah membuat fungsi 8 hanya mengembalikan pesan jika inputnya kabur — ini bisa membuat HTML kita sedikit lebih pendek dengan hanya perlu memeriksa satu nilai sebelum memutuskan apakah akan membatalkan input. Artinya, atribut _2 kita bisa sesingkat ini _9Inilah tampilan fungsi kita untuk memetakan melalui input dan menyetel data 7 sekarang 0Kami juga dapat menghapus peristiwa _4 dan 5 dari semua input kami dengan mendengarkan peristiwa ini di elemen formulir induk. Namun, ada masalah dengan ini. acara _3 tidak menggelembung (elemen induk yang mendengarkan acara ini tidak akan meneruskannya saat diaktifkan pada anak-anak mereka). Untungnya, kita bisa mengganti blur dengan event _7, yang pada dasarnya adalah event yang sama, tapi yang ini gelembung, jadi kita bisa mendengarkannya di elemen induk form kitaAkhirnya, kode kami mengembangkan banyak boilerplate. Jika kami mengubah nama input apa pun, kami harus menulis ulang data dalam fungsi kami setiap saat dan menambahkan pendengar acara baru. Untuk mencegah penulisan ulang data komponen setiap saat, kita dapat memetakan melalui input formulir yang memiliki atribut 8 untuk menghasilkan data komponen awal kita dalam fungsi 0. Ini membuat kode lebih dapat digunakan kembali untuk formulir tambahan. Yang perlu kita lakukan hanyalah menyertakan JavaScript dan menambahkan aturan sebagai atribut data dan kita siap melakukannyaOh, dan hei, hanya karena sangat mudah dilakukan dengan Alpine, mari tambahkan transisi fade-in yang memberi perhatian pada pesan kesalahan _1Dan inilah hasil akhirnya. Validasi formulir yang reaktif dan dapat digunakan kembali dengan biaya pemuatan halaman minimal CodePen Embed Fallback Jika Anda ingin menggunakan ini di aplikasi Anda sendiri, Anda dapat menyalin fungsi 0 untuk menggunakan kembali semua logika yang telah kami tulis. Yang perlu Anda lakukan hanyalah mengonfigurasi atribut HTML Anda dan Anda siap untuk pergi |