


Membina Borang React dengan Mudah Menggunakan React Hook Form, Zod dan Shadcn
Dec 08, 2024 am 01:20 AMBorang ialah sesuatu yang dihadapi oleh setiap pembangun, sama ada sebagai pengguna atau di pihak pembangun. Ia penting pada kebanyakan tapak web, tetapi kerumitannya boleh berbeza-beza—daripada borang hubungan 3 medan mudah kepada giga-monster-t-rex, borang berbilang halaman dengan 150 medan, pengesahan dinamik dan semakan tak segerak.
Dalam siaran ini, kami akan meneroka cara React Hook Form, Zod dan Shadcn boleh digunakan untuk mencipta penyelesaian yang boleh disesuaikan dan mesra pembangun yang mengendalikan pelbagai keperluan borang dengan mudah.
Borang yang akan kami bina
Ini borang yang akan kami bangunkan dalam siaran ini. Saya bercadang untuk menulis siaran lain tentang penggunaan borang lanjutan yang akan mempunyai lebih kerumitan sebagai susulan, jadi nantikan ?
Temui alatan
Mari kita lihat susunan yang akan kami gunakan untuk membina dan mengurus borang kami.
Bertindak balas dan Wasp
- Kerangka: Tebuan (rangka kerja tindanan penuh untuk React, Node.js dan Prisma).
- Mendayakan pembangunan dan penggunaan web timbunan penuh yang pantas dan cekap dengan React.
Borang Cangkuk Reaksi
- Pustaka ringan untuk membuat borang dalam React, terutamanya melalui cangkuk useFormnya.
- Mengendalikan pengesahan borang, pengurusan ralat dan menawarkan kaedah pengesahan yang fleksibel serta penyepaduan dengan pelbagai perpustakaan komponen UI.
Zod
- Pustaka pengesahan pertama TypeScript untuk mencipta skema pengesahan yang terperinci dan boleh digunakan semula.
- Bersepadu dengan jenis TypeScript untuk memastikan pengesahan bersatu dan mengelakkan pertindihan.
Shadcn/UI
- Koleksi komponen UI boleh guna semula yang dibenamkan terus dalam projek, yang membolehkan pembangun mengambil hanya perkara yang mereka perlukan dan menyesuaikan komponen tersebut juga.
- Menawarkan sokongan terbina dalam untuk React Hook Form dan Zod.
Berikut ialah contoh coretan yang mempamerkan medan borang dalam pustaka Shadcn:
<FormField control={form.control} name="name" render={({ field }) => ( <FormItem> <FormLabel>Name</FormLabel> <FormControl> <Input {...field} /> </FormControl> <FormMessage /> </FormItem> )} />
Walaupun anda lebih suka menggunakan perisa tindanan yang berbeza, selagi anda kekal dengan React dan RHF, ini masih merupakan contoh yang sah yang akan membantu anda.
Mari bina papan pemuka pengguna yang ringkas
Aplikasi yang akan kami gunakan untuk menunjukkan borang asas ialah panel pentadbir dengan operasi CRUD yang penting. Ia akan termasuk pengesahan e-mel dan kata laluan dan terdiri daripada dua halaman: skrin utama yang memaparkan jadual semua pengguna dan halaman ciptaan pengguna, yang akan menjadi bintang artikel ini.
Borang kami akan menyertakan pengesahan untuk memastikan pengguna tidak boleh menyerahkannya (iaitu, mencipta pengguna baharu) tanpa memenuhi keperluan yang ditentukan. Objek Pengguna ialah calon yang sangat baik untuk contoh pengesahan, kerana ia mengandungi pelbagai jenis data yang sesuai untuk pengesahan yang berbeza: rentetan, tarikh (cth., tarikh lahir), rentetan e-mel dan boolean (cth., status pengguna premium). Fail skema Prisma yang lengkap ditunjukkan di bawah.
<FormField control={form.control} name="name" render={({ field }) => ( <FormItem> <FormLabel>Name</FormLabel> <FormControl> <Input {...field} /> </FormControl> <FormMessage /> </FormItem> )} />
Untuk memulakan projek kami, kami akan menggunakan templat Wasp yang dipratentukan dengan TypeScript, dipanggil todo-ts. Templat ini disertakan dengan komponen siap sedia dan penghalaan untuk pengesahan, termasuk skrin log masuk dan pendaftaran. Ia juga menawarkan contoh kukuh tentang cara operasi CRUD berfungsi dalam Wasp, sesuai jika anda baharu dalam rangka kerja tersebut. Selain itu, kami akan memanfaatkan Wasp TypeScript SDK baharu untuk mengurus konfigurasi kami, kerana ia memberikan fleksibiliti lanjutan untuk penyesuaian.
Mencari artikel ini berguna?
Pasukan Wasp sedang berusaha keras untuk mencipta kandungan seperti ini, apatah lagi membina rangka kerja React/NodeJS moden sumber terbuka.
Cara paling mudah untuk menunjukkan sokongan anda ialah dengan membintangi repo Wasp! ? Tetapi adalah amat dihargai jika anda boleh melihat pada repositori (untuk sumbangan, atau sekadar menguji produk). Klik pada butang di bawah untuk memberi Wasp bintang dan tunjukkan sokongan anda!
?? Terima Kasih Atas Sokongan Anda ?
Menyatukan semuanya - skema Zod React Hook Form reka letak contoh
Untuk bekerja dengan borang, kami akan mulakan dengan mentakrifkan skema pengesahan Zod. Borang kami mempunyai tiga jenis data: rentetan, tarikh dan boolean. Kami akan menggunakan pengesahan pada kebanyakan medan: nama dan nama keluarga diperlukan, manakala e-mel menggunakan pengesahan e-mel terbina dalam. Zod memudahkan pengesahan jenis rentetan biasa dengan pengesahan terbina dalam untuk jenis yang berbeza, seperti e-mel, URL dan UUID, yang berguna untuk medan e-mel kami.
Untuk pengesahan tambahan, tarikh tidak boleh ditetapkan pada tarikh akan datang dan medan Pengguna premium hanya perlu menjadi boolean. Zod juga menyediakan mesej ralat pengesahan lalai, tetapi ini boleh disesuaikan. Sebagai contoh, bukannya nama: z.string().min(1), kita boleh menentukan nama: z.string().min(1, 'Nama diperlukan').
<FormField control={form.control} name="name" render={({ field }) => ( <FormItem> <FormLabel>Name</FormLabel> <FormControl> <Input {...field} /> </FormControl> <FormMessage /> </FormItem> )} />
Borang kami diuruskan oleh useForm hook daripada React Hook Form, yang menyediakan pilihan yang luas untuk mengendalikan dan mengesahkan nilai borang, menyemak ralat dan mengurus keadaan borang. Untuk menyepadukan skema pengesahan Zod kami, kami akan menggunakan penyelesai Zod, membenarkan Borang React Hook menggunakan pengesahan yang kami takrifkan sebelum ini.
Nilai lalai borang diperoleh daripada objek pelanggan. Memandangkan komponen ini digunakan untuk menambah pelanggan baharu dan mengedit pelanggan sedia ada, kami akan menghantar data yang diperlukan sebagai input. Untuk pelanggan baharu, beberapa nilai lalai yang wajar digunakan; untuk pelanggan sedia ada, data diambil daripada pangkalan data. Selain daripada menetapkan nilai lalai dan menentukan sama ada untuk memanggil createCustomer atau updateCustomer, semua aspek pengendalian borang yang lain kekal sama.
model Customer { id Int @id @default(autoincrement()) name String surname String email String dateOfBirth DateTime premiumUser Boolean }
Langkah terakhir ialah mencipta borang itu sendiri dan memasangnya dalam fail TSX. Seperti yang ditunjukkan sebelum ini, proses ini adalah mudah. Sama ada kami menggunakan input teks, pemilih tarikh atau kotak pilihan dengan kawalan Shadcn, kami mengikuti struktur yang serupa:
- Mulakan dengan mencipta elemen FormField dan menetapkan sifat kawalan, nama dan pemaparannya.
- Sifat render adalah kunci, kerana ia mengandungi elemen bentuk itu sendiri.
- Biasanya, kami membungkus segala-galanya dalam FormItem, menambah FormLabel untuk label dan meletakkan elemen borang terkawal di dalam FormControl dengan kaedah nilai dan penetap yang sesuai.
- Akhir sekali, kami menyertakan FormMessage di bawah, yang memaparkan mesej pengesahan Zod jika pengesahan gagal.
const formSchema = z.object({ name: z.string().min(1, { message: 'Name is required' }), surname: z.string().min(1, { message: 'Surname is required' }), email: z.string().email({ message: 'Invalid email address' }), dateOfBirth: z .date() .max(new Date(), { message: 'Date cannot be in the future' }), premiumUser: z.boolean(), });
Jika anda ingin melihat aplikasi yang lengkap, lihat repositori GitHub di sini: GitHub Repo. Saya harap artikel ini telah memudahkan kerja dengan borang, dan jika anda berminat dengan lebih banyak kandungan berkaitan borang, nantikan bahagian kedua! Dalam bahagian seterusnya, kami akan menyelami corak lanjutan dan teknik pengesahan untuk meningkatkan aplikasi anda.
Sila pertimbangkan untuk membintangi Tebuan di GitHub jika anda menyukai siaran ini! Sokongan anda membantu kami terus menjadikan pembangunan web lebih mudah dan lancar untuk semua orang. ?
Atas ialah kandungan terperinci Membina Borang React dengan Mudah Menggunakan React Hook Form, Zod dan Shadcn. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Mekanisme pengumpulan sampah JavaScript secara automatik menguruskan memori melalui algoritma pembersihan tag untuk mengurangkan risiko kebocoran ingatan. Enjin melintasi dan menandakan objek aktif dari objek akar, dan tidak bertanda dianggap sebagai sampah dan dibersihkan. Sebagai contoh, apabila objek tidak lagi dirujuk (seperti menetapkan pembolehubah kepada null), ia akan dikeluarkan dalam pusingan seterusnya kitar semula. Punca kebocoran memori yang biasa termasuk: ① Pemasa atau pendengar peristiwa yang tidak jelas; ② Rujukan kepada pembolehubah luaran dalam penutupan; ③ Pembolehubah global terus memegang sejumlah besar data. Enjin V8 mengoptimumkan kecekapan kitar semula melalui strategi seperti kitar semula generasi, penandaan tambahan, kitar semula selari/serentak, dan mengurangkan masa menyekat benang utama. Semasa pembangunan, rujukan global yang tidak perlu harus dielakkan dan persatuan objek harus dihiasi dengan segera untuk meningkatkan prestasi dan kestabilan.

Terdapat tiga cara biasa untuk memulakan permintaan HTTP dalam node.js: Gunakan modul terbina dalam, axios, dan nod-fetch. 1. Gunakan modul HTTP/HTTPS terbina dalam tanpa kebergantungan, yang sesuai untuk senario asas, tetapi memerlukan pemprosesan manual jahitan data dan pemantauan ralat, seperti menggunakan https.get () untuk mendapatkan data atau menghantar permintaan pos melalui .write (); 2.AXIOS adalah perpustakaan pihak ketiga berdasarkan janji. Ia mempunyai sintaks ringkas dan fungsi yang kuat, menyokong async/menunggu, penukaran JSON automatik, pemintas, dan lain -lain. Adalah disyorkan untuk memudahkan operasi permintaan tak segerak; 3.Node-Fetch menyediakan gaya yang serupa dengan pengambilan penyemak imbas, berdasarkan janji dan sintaks mudah

Jenis data JavaScript dibahagikan kepada jenis primitif dan jenis rujukan. Jenis primitif termasuk rentetan, nombor, boolean, null, undefined, dan simbol. Nilai -nilai tidak berubah dan salinan disalin apabila memberikan nilai, jadi mereka tidak mempengaruhi satu sama lain; Jenis rujukan seperti objek, tatasusunan dan fungsi menyimpan alamat memori, dan pembolehubah menunjuk objek yang sama akan mempengaruhi satu sama lain. Typeof dan Instanceof boleh digunakan untuk menentukan jenis, tetapi memberi perhatian kepada isu -isu sejarah TypeOfNull. Memahami kedua -dua jenis perbezaan ini dapat membantu menulis kod yang lebih stabil dan boleh dipercayai.

Helo, pemaju JavaScript! Selamat datang ke berita JavaScript minggu ini! Minggu ini kami akan memberi tumpuan kepada: Pertikaian tanda dagangan Oracle dengan Deno, objek masa JavaScript baru disokong oleh pelayar, kemas kini Google Chrome, dan beberapa alat pemaju yang kuat. Mari mulakan! Pertikaian tanda dagangan Oracle dengan percubaan Deno Oracle untuk mendaftarkan tanda dagangan "JavaScript" telah menyebabkan kontroversi. Ryan Dahl, pencipta Node.js dan Deno, telah memfailkan petisyen untuk membatalkan tanda dagangan, dan dia percaya bahawa JavaScript adalah standard terbuka dan tidak boleh digunakan oleh Oracle

Rangka kerja JavaScript mana yang terbaik? Jawapannya ialah memilih yang paling sesuai mengikut keperluan anda. 1. REACT adalah fleksibel dan bebas, sesuai untuk projek sederhana dan besar yang memerlukan penyesuaian tinggi dan keupayaan seni bina pasukan; 2. Angular menyediakan penyelesaian lengkap, sesuai untuk aplikasi peringkat perusahaan dan penyelenggaraan jangka panjang; 3. Vue mudah digunakan, sesuai untuk projek kecil dan sederhana atau perkembangan pesat. Di samping itu, sama ada terdapat timbunan teknologi sedia ada, saiz pasukan, kitaran hayat projek dan sama ada SSR diperlukan juga faktor penting dalam memilih rangka kerja. Singkatnya, tidak ada kerangka terbaik, pilihan terbaik adalah yang sesuai dengan keperluan anda.

IIFE (Segera Dilanjutkan FunctionExpression) adalah ekspresi fungsi yang dilaksanakan dengan segera selepas definisi, digunakan untuk mengasingkan pembolehubah dan mengelakkan mencemarkan skop global. Ia dipanggil dengan membungkus fungsi dalam kurungan untuk menjadikannya ungkapan dan sepasang kurungan segera diikuti olehnya, seperti (fungsi () {/code/}) ();. Penggunaan terasnya termasuk: 1. Elakkan konflik berubah -ubah dan mencegah pertindihan penamaan antara skrip berganda; 2. Buat skop peribadi untuk menjadikan pembolehubah dalaman tidak kelihatan; 3. Kod modular untuk memudahkan permulaan tanpa mendedahkan terlalu banyak pembolehubah. Kaedah penulisan biasa termasuk versi yang diluluskan dengan parameter dan versi fungsi anak panah ES6, tetapi perhatikan bahawa ungkapan dan ikatan mesti digunakan.

Janji adalah mekanisme teras untuk mengendalikan operasi tak segerak dalam JavaScript. Memahami panggilan rantaian, pengendalian ralat dan gabungan adalah kunci untuk menguasai aplikasi mereka. 1. Panggilan rantai mengembalikan janji baru melalui .then () untuk merealisasikan persamaan proses tak segerak. Setiap .then () menerima hasil sebelumnya dan boleh mengembalikan nilai atau janji; 2. Pengendalian ralat harus menggunakan .catch () untuk menangkap pengecualian untuk mengelakkan kegagalan senyap, dan boleh mengembalikan nilai lalai dalam tangkapan untuk meneruskan proses; 3. Gabungan seperti janji.all () (berjaya hanya berjaya selepas semua kejayaan), janji.race () (penyempurnaan pertama dikembalikan) dan janji.allsettled () (menunggu semua penyelesaian)

CACHEAPI adalah alat yang disediakan oleh penyemak imbas kepada permintaan rangkaian cache, yang sering digunakan bersempena dengan ServiceWorker untuk meningkatkan prestasi laman web dan pengalaman luar talian. 1. Ia membolehkan pemaju menyimpan sumber secara manual seperti skrip, helaian gaya, gambar, dan lain -lain; 2. Ia boleh memadankan tindak balas cache mengikut permintaan; 3. Ia menyokong memotong cache tertentu atau membersihkan seluruh cache; 4. Ia boleh melaksanakan keutamaan cache atau strategi keutamaan rangkaian melalui perkhidmatan pekerja yang mendengar acara mengambil; 5. Ia sering digunakan untuk sokongan luar talian, mempercepat kelajuan akses berulang, sumber utama dan kandungan kemas kini latar belakang; 6. Apabila menggunakannya, anda perlu memberi perhatian kepada kawalan versi cache, sekatan penyimpanan dan perbezaan dari mekanisme caching HTTP.
