Tuléhsan nyoe geusponsor lé SurveyJS . Na model mental nyang sebagian rayeuk pengembang React geubagikan tanpa pernah geudiskusikan deungon su nyang kreuh. Nyan bentuk-bentuk sabee seharusjih jeut keu komponen. Nyoe meumakna tumpukan lagee:
Bentuk React Hook keu nanggroe bagian lokal (peugot ulang minimal, pendaftaran lapangan ergonomis, interaksi imperatif). Zod keu validasi (keubeunaran input, validasi bataih, parsing aman keu tipe). React Query keu backend: peusampoe, usaha lom, cache, sinkronisasi server, dan laen-laen.
Dan keu sebagian rayeuk formulir — layar login droeneuh, halaman pengaturan droeneuh, modal CRUD droeneuh — nyoe berfungsi deungon get that. Tiëp-tiëp bagian jipeubuet buet jih, awaknyan jikarang deungon gleh, dan droeneuh jeuet neujak u bagian-bagian aplikasi droeneuh nyang beutôi-beutôi meubedakan produk droeneuh. Tapi tiep-tiep sigo-go, saboh bentuk mulai mengumpulkan hal-hal lagee aturan visibilitas nyang meugantung bak jawaban awai, atawa nilai-nilai turunan nyang berkaskade melalui lhee bidang. Mungken bahkan mandum halaman nyang haroh dileupah atawa dipeudeuh berdasarkan total nyang meujalan. Kamoe meutangani kondisional phon ngon useWatch dan cabang inline, nyang hana masalah. Lheuh nyan laen lom. Teuma droeneuh neujak bak superRefine keu neukode aturan lintas bidang nyang hana jeuet neupeugah le skema Zod droeneuh deungon cara normal. Lheueh nyan, navigasi langkah mulai bocor logika bisnis. Bak saboh watee, droeneuh neu kalon peu nyang ka neu peugot dan neu sadar bahwa formulir nyan kon le UI nyang beutoi. Nyoe leubeh dari proses keputusan, dan bak komponen nyan hanya dipat droeneuh kebetulan neu simpan jih. Disinoe keuh lon pike model mental untuk bentuk lam React rusak, dan nyan beutoi-beutoi hana salah soe. Tumpukan RHF + Zod that jroh bak peu nyang dirancang. Masalah jih adalah bahwa tanyo cenderung sabe tapakek jih lewat titek di pat abstraksi jih seusuai deungen masalah kareuna alternatif jih memerlukan cara meupike yeng beda teuntang bentuk seucara mandum. Tuléhsan nyoe nakeuh teuntang alternatif nyan. Keu tapeuleumah nyoe, tanyoe akan tapeugot formulir multi-langkah nyang saban persis dua goe:
Deungon Formulir Hook React + Zod kabel keu React Query keu pengajuan, Deungon SurveyJS, nyang geupeulaku saboh formulir seubagoe data — skema JSON sederhana — nibak bak komponen.
Syarat nyang saban, logika kondisional nyang saban, panggilan API nyang saban bak akhe. Kemudian kamoe akan memetakan persis peu nyang bergerak dan peu nyang teutap, dan meuletakkan cara praktis untuk memutuskan model pat nyang harus droeneuh pakek, dan pajan. Formulir nyang teungoh kamoe peugot:
Formulir nyoe akan geupake alur 4 langkah: Langkah 1: Rincian
Nan phon (peureulee), . Email (peureulèë, format nyang sah).
Langkah 2: Peusan
Harga satuan, Jumlah, Tingkat pajak, Peutron: Subjumlah, Pajak, Jumlah jih.
Langkah 3: Akun & Umpan Balik
Na akun droeneuh? (Jeut/Hana) Meunyo Jeut → nan pengguna + kata sandi, bandua nyan dipeureulee. Meunyo Hana → email ka geukumpoi bak langkah 1.
Rating kepuasan (1-5) Meunyo ≥ 4 → tanyong “Peue nyang galak droeneuh?” Meunyo ≤ 2 → tanyong “Peue nyang jeuet tapeugot?”
Langkah 4: Kaji ulang
Hanya deuh meunyo jumlah >= 100 . Peusampoe akhe.
Nyoe kon ekstrem. Teuma ka sep keu peuhah perbedaan arsitektur. Bagian 1: Komponen-Didorong (Bentuk Kait Reaksi + Zod) Peupasang npm pasang reaksi-kait-bentuk zod @kait-bentuk/penyelesaian @tanstack/reaksi-kueri
Skema Zod Mari ta mulai ngon skema Zod, sabab disinan biasa jih bentuk formulir nyan meuteutap. Keu dua langkah phon — detail pribadi ngon input urutan — mandum lurus: string nyang dipeureulee, angka ngon minimum, ngon enum. Bagian nyang menarik dimulai watee droeneuh neucuba peugah aturan-aturan nyang bersyarat.
impor { z } nibak "zod";
ekspor const formSkema = z.objek ({nan phon: z.string ().min (1, "Dipeureulee"), email: z.string (). email ("Email hana sah"), harga: z.angka ().min (0), jumlah: z.angka (). min (1), "Tarif pajak: z.angka (), Hana Rekening (Y), na Rekening (Y. z.string (). opsional (), kata sandi: z. string (). opsional (), kepuasan: z. angka (). min (1). maks (5), positifUmpan Balik: z. string (). opsional (), perbaikanUmpan Balik: z. string (). opsional (),} "s). if (! data.nan pengguna) { ctx.tambahMasalah ({ kode: "adat", jalur: ["nan pengguna"], pesan: "Diperlukan" }); aksara" }); } }
if (data.kepuasan >= 4 && !data.umpanBalikpositif) { ctx.addIssue({ kode: "adat", jalur: ["umpanBalikpositif"], pesan: "Silahkan bagikan peu nyang droeneuh galak" }); }
meunyo (data.kepuasan <= 2 && !data.perbaikanUmpanBalik) { ctx.tambahkanMasalah ({ kode: "adat", jalur:["peuningkatUmpanBalik"], peusan: "Tulong peugah bak kamoe peue nyang haroh tapeugot" }); }});
jeunèh eksporDataFormulir = z.infer
Perhatikan bahwa nan pengguna dan kata sandi diketik sebagai opsional () meskipun awaknyan diperlukan secara bersyarat kareuna skema tingkat tipe Zod menjelaskan bentuk objek, kon aturan yang mengatur watee bidang-bidang peunteng. Syarat kondisional nyan haroh tinggai lam superRefine, nyang meujalan lheuh bentuk nyan divalidasi dan na akses keu objek nyang lengkap. Peumisah nyan kon saboh cacat; nyan mantong peu nyang dirancang alat nyan: superRefine nakeuh teumpat logika lintas bidang jijak watee hana jeut ji peugah lam struktur skema nyan keudroe. Nyang cit peunteng disinoe nakeuh peu nyang hana dipeugah le skema nyoe. Nyoe hana konsep halaman, hana konsep bidang pat nyang deuh bak titek pat, ngon hana konsep navigasi. Banmandum nyan teuma udeb di teumpat laén. Komponen Bentuk
impor { gunakanFormulir, gunakanWatch } dari "reaksi-kait-bentuk";impor { zodPenyelesaian } dari "@formulir-kait/penyelesaian/zod";impor {gunaMutasi } dari "@tanstack/reaksi-kueri";impor {gunaKeadaan;ata, gunakanMemo } dari "reaksi";ma, skema {m
const LANGKAH = ["rincian", "peusan", "akun", "tinjauan"];
tipe PesanMuatan = DataFormulir & { subtotal: jumlah; pajak: angka; jumlah: jumlah };
fungsi ekspor RHFMultiLangkahBentuk () { const [langkah, setLangkah] = penggunaanKeadaan (0);
mutasi const = pakekMutasi ({ mutasiFn: async (beban: BebanPesan) => { const res = preh cok ("/ api/peusan", { cara: "POST", . ulèë: { "Jeunèh-Asoë": "aplikasi/json" }, badan: JSON.meuikat (beban), }); meunyo (!res.ok) boh Kesalahan baro ("Gagal dijok"); keumbalikan res.json (); }, });
const { daftar, kontrol, penangananKirahkan, KeadaanFormulir: { kesalahan }, } = gunakanFormulir
return (
{langkah === 1 && ( <>
{langkah === 2 && ( <>
{hasAccount === "Jeut" && ( <>
{kepuasan >= 4 && (
{kepuasan <= 2 && (
{langkah === 3 && jumlah >= 100 &&
Neukalön Survei PenJS-03-RHF [geucabang] lé nam boh punah. Cukop le that nyang teungoh teudjadi disinoë, dan payah ta peulambat keu ta perhatikan pat hai-hai nyan akhéjih.
Nilai-nilai nyang dipeutren — subtotal, pajak, total — dihitong lam komponen melalui useWatch ngon useMemo kareuna awaknyan meugantung bak nilai lapangan udep ngon hana teumpat alami laen keu awaknyan. Aturan visibilitas keu nan pengguna, kata sandi, Umpan Balik positif, dan Umpan Balik perbaikan udep lam JSX seubagoe kondisional inline. Logika meuleupah langkah — halaman ulasan hanya deuh watee total >= 100 — disematkan lam variabel showSubmit ngon kondisi render bak langkah 3. Navigasi nyan keudroe nakeuh saboh penghitung useState nyang tanyoe peu ek secara manual. React Query geutangani usaha lom, cache, ngon hana sah. Formulir nyan cuma geukheun mutasi.mutasi ngon data nyang ka geuvalidasi.
Hana meusaboh pih nyang salah, per se. Nyoe mantong idiomatik React, ngon komponen jih cukop berkinerja berkat kiban RHF mengisolasi render ulang. Teuma meunyo droeneuh neujok nyoe keu ureung nyang golom neutuleh dan neulakèe awak nyan neubri penjelasan lam kondisi peu halaman ulasan nyan deuh, awak nyan haroh neutelusuri melalui showSubmit, kondisi render langkah 3, dan logika tombol nav - lhee teumpat nyang teupisah - keu neurekonstruksi saboh aturan nyang jeut neunyatakan lam saboh bareh. Bentuk nyan meuhase, ya, tapi tingkah laku hana that jeut diperiksa seubagoe sistem. Nyan harus dieksekusi secara mental. Leubeh peunteng lom, geu ubah jih perle keterlibatan rekayasa. Bahkan tweak ubeut, lagee menyesuaikan watee langkah review deuh, berarti mengedit komponen, memperbarui validasi, buka permintaan tarik, preh review, dan deploy lom. Bagian 2: Skema-Gudong (SurveiJS) Jinoe mari tapeugot alur nyang saban ngon tapeuguna skema. Peupasang npm pasang survei-inti survei-reaksi-ui @tanstack/reaksi-kueri
survey-coreMeusén runtime independen platform nyang geubri lisensi MIT nyang geubri daya keu rendering formulir SurveyJS — bagian nyang kamoe pedulikan di sinoe. Nyoe peureulee skema JSON, membangun model internal dari nyan, dan menangani mandum nyang akan udep lam komponen React droeneuh: mengevaluasi ekspresi visibilitas, menghitung nilai-nilai turunan, mengelola keadaan halaman, validasi pelacakan, dan memutuskan peu arti "lengkap" mengingat halaman pat nyang sebenar jih ditunjukkan.
survei-reaksi-uiLapisan UI/rendering nyang meuhubong model nyan ngon React. Pada dasar jih nyoe komponen
Meusajan, awak nyan geubri runtime formulir multi-halaman nyang fungsional sepenuh jih tanpa geutuleh saboh bareh alur kontrol. Format skema nyan keudroe, lagee nyang ka geupeugah dilee, cuma JSON — hana DSL atawa peu mantong nyang na hak milek. Droeneuh jeuet neu inline, neu import dari saboh file, neucok dari saboh API, atawa neu simpan lam kolom database dan neu hidrasi bak watee runtime. Bentuk Nyang Sama, Seubagoe Data . Nyoe keuh bentuk nyang saban, kali nyoe geunyatakan seubagoe objek JSON. Skema nyan geubri definasi keu mandum: struktur, validasi, aturan visibilitas, perhitungan turunan, navigasi halaman — dan geujok keu Model nyang geuevaluasi bak watee runtime. Nyoe keuh lagee nyan seucara lengkap:
ekspor const surveySchema = { judul: "Alur Peusan", tampilkanBarKemajuan: "ateuh", halaman: [ { nan: "rincian", elemen: [ { tipe: "teks", nan: "nan phon", isDibutuhkan: beutoi }, { tipe: "teks", nan: "email", "equi is: a", tipe: "email", teks: "email hana sah" }] } ] }, { nan: "peusan", elemen: [ { tipe: "teks", nan: "harga", inputTipe: "angka", NilaiLawaan: 0 }, { tipe: "teks", nan: "jumlah", drojeuneh: p 1", {tipe: "nunan: "taxRate", NilaiLalai: 0,1, pilihan: [ { nilai: 0,05, teks: "5%" }, { nilai: 0,1, teks: "10%" }, { nilai: 0,15, teks: "15%" }" ] }, {jeunèh: "ekspresi", {{anti} keu tipe: "ekspresi", nan: "pajak", ungkapan: "{subjumlah} {Tarifpajak}" }, { tipe: "ungkapan", nan: "jumlah", ungkapan: "{subjumlah} + {pajak}" } ] }, { nan: "rekening", elemen: [" { tipe: "hitungan radioA", {}, "i: s" tipe: "teks", nan: "nan pengguna", visibleIf: "{naAkun} = 'Ya'", isPeureulee: beutoi }, { tipe: "teks", nan: "kata sandi", inputType: "kata sandi", visibleIf: "{naAkun} = 'Ya'", [{na: ng beutoi: 6, teks: "Min 6 karakter" }] }, { ketik: "nilai", nan: "kepuasan", tingkatMin: 1, tingkatMaks: 5 }, { ketik: "komentar", nan: "UmpanBalikpositif", visibleIf: "{kepuasan} >= 4" }, "improve F: me: deuhMeunyoe: "{kepuasan} <= 2" } ] }, { nan: "tinjauan", deuhMeunyoe: "{jumlah} >= 100", elemen: [] } ]};
Bandengkan nyoe ngon versi RHF siat.
Blok superRefine nyang secara syarat peureulee nan pengguna ngon kata sandi ka hana le. visibleIf: "{hasAccount} = 'Ya'" digabongkan ngon isRequired: true geutangani bandua masalah nyan beusaban, bak lapangan nyan keudroe, dipat droeneuh neuharap neuteumeung awaknyan. Rantai useWatch + useMemo nyang geuhitong subtotal, pajak, ngon total geugantoe le lhee boh bidang ekspresi nyang saleng merujuk ngon nan. Kondisi halaman review, nyang lam versi RHF jeut direkonstruksi hanya deungon cara jijak melalui showSubmit, cabang render langkah 3. Dan akhe jih, logika tombol nav nakeuh saboh properti visibleIf bak objek halaman.
Logika nyang saban na disinan. Hanya saja skema nyan geubri teumpat untuk tinggai dipat deuh secara meuisolasi, daripada menyebar di seluroh komponen. Meunan cit, neukalön bahwa skema nyan geungui tipe: 'ekspresi' keu subtotal, pajak, ngon total. Ekspresi nyan jeuet tabaca mantong ngon geungui utamajih keu geupeuleumah nilai-nilai nyang ka geuhitong. SurveyJS pih jidukung tipe: 'html' keu asoe statis, tapi keu nilai nyang dihitong, ekspresi nakeuh pilihan nyang paih. Jinoe keu sisi React. Peusampoe Dan Peusampoe Sangat sederhana. Kawat onComplete keu API droeneuh ngon cara nyang saban — rot useMutation atawa fetch biasa:
import { penggunaanKeadaan, penggunaanEfek, penggunaanRef } dari "reaksi";impor { penggunaanMutasi } dari "@tanstack/react-query";impor { Model } dari "inti-survei";impor { Survei } dari "survei-reaksi-ui";impor "inti-survei/survei;
fungsi ekspor BentukSurvei () { const [model] = penggunaanKeadaan (() => Model baro (SkemaSurvei));
mutasi const = pakekMutasi ({ mutasiFn: asinkron (data) => { const res = preh cok ("/ api/peusan", { cara: "POST", . ulèë: { "Jeunèh-Asoë": "aplikasi/json" }, badan: JSON.peugot (data), }); meunyo (!res.ok) boh Kesalahan baro ("Gagal dijok"); keumbalikan res.json (); }, });
const mutasiRujukan = gunaRujukan (mutasi); mutasiRef.saat nyoe = mutasi; useEffect (() => { const penanganan = (pengirim) => mutasiRef.saat nyoe.mutasi (pengirim.data); model.onLengkap.tamah (penanganan); kembali () => model.onLengkap.hapus (penanganan); }, [model]); // ref menghindari pendaftaran ulang penanganan setiap render (identitas objek mutasi berubah)
pulang (
<>
Neukalön Survei PenJS-03-SurveiJS [dicabang] lé nam boh punah.
onComplete apui watee ureueng ngui troh bak akhe halaman nyang deuh akhe. Jadi meunyo total hana tom meulintas 100 dan halaman review dilewatkan, mantong meuapui deungon beutoi kareuna SurveyJS dievaluasi visibilitas seugolom memutuskan peu makna “halaman akhe”. Teuma, sender.data meuasoe mandum jawaban meusajan ngon nilai-nilai nyang dihitong (subtotal, pajak, total) seubagoe bidang glah phon, sehingga beban API identik ngon peu nyang versi RHF dirakit secara manual lam onSubmit. NyanPola mutationRef nakeuh nyang saban ngon nyang akan droeneuh capai dipat mantong droeneuh peureulee penangan acara nyang stabil ateuh nilai nyang meu ubah bak tiep render — hana sapeu nyang spesifik SurveyJS teuntang nyan.
Komponen React hana le meuasoe logika bisnis sama sekali. Hana useWatch, hana JSX bersyarat, hana penghitung langkah, hana rante useMemo, hana superRefine. React nyoe jipeugot peu nyang sebenar jih get: ji render saboh komponen dan ji kabel keu panggilan API. Peue Nyang Pindah Dari React?
Keuprihatinan Tumpukan RHF SurveiJS Keu deuh Cabang JSX . deuhMeunyoe Nilai-nilai nyang geucok pakekTonton / pakekMemo ekspresi Aturan lintas lapangan superHalus Kondisi skema Navigasi langkah keadaan Laman deuhMeunyoe Lokasi aturan . Disebarkan bak mandum file Dipusatkan lam skema .
Nyang teutap lam React nakeuh tata letak, gaya, kabel pengajuan, ngon integrasi app, nyang jeut ta peugah, hal-hal nyang React sebenar jih dirancang untuk. Mandum nyang la'én geupinah u dalam skema, ngon kareuna skema nyan nakeuh saboh objek JSON mantong, jeuët geusimpan lam database, geuversikan seucara independen nibak kode aplikasi droëneuh, atawa geusunting rot alat-alat internal hana peureulèë deploy. Saboh pengurus produk nyang peureulee geu ubah ambang batah nyang memicu halaman ulasan jeut geupeugot nyan tanpa menyentuh komponen. Nyan perbedaan operasional nyang bermakna keu tim di pat perilaku bentuk seureng berkembang ngon hana sabe ji dorong le insinyur. Pajan Ta Pakèk Tiëp-tiëp Pendekatan? Nyoe keuh saboh aturan praktis nyang jroh nyang berhasil keu lon: bayangkan neusampôh formulir nyan mandum. Peue nyang teuma gata gadôh?
Meunyo layar, droeneuh neuk formulir nyang dipeudong le komponen. Meunyoe nyan logika bisnis, lagee ambang batah, aturan percabangan, ngon syarat kondisional nyang mengkode keputusan nyang nyata, droeneuh meuheut keu meusen skema.
Meunan cit, meunyo perubahan nyang teuka bak jalan droeneuh sebagian rayeuk teuntang label, bidang, dan tata letak, RHF akan melayani droeneuh deungon get. Meunyoe awak nyan teuntang kondisi, hasee, dan aturan nyang mungken perle disesuaikan le ops atawa tim hukom droeneuh bak uroe Selasa seupot tanpa mengajukan tiket, model skema ngon SurveyJS adalah nyang leubeh jujur. Dua boh pendekatan nyoe hana beutoi-beutoi saleng meusaingan. Awak nyan geutangani glah masalah nyang berbeda, ngon kesalahan nyang layak geuhindari adalah hana cocok ngen abstraksi ngen bobot logika - geupeulaku sistem aturan lagee komponen kareuna nyan adalah alat nyang ka akrab, atawa mencapai meusen kebijakan kareuna saboh bentuk timoh jeut keu lhee langkah ngon meurumpok bidang bersyarat. Bentuk njang kamoë peugot disinoë djiduëk toë deungon bataih deungon sengaja, cukôp kompleks untôk peuhah perbedaan tapi hana that ekstrem sampoë peubandéng njan meurasa djipeu-atô. Seubagian rayek bentuk nyata nyang ka jeuet keu hana meuguna lam codebase droeneuh mungken duek toe ngon bataih nyang saban, dan pertanyaan jih biasa jih hanya peue na nyang ka geuboh nan peu nyang sebenar jih. Gunakan Bentuk React Hook + Zod watee:
Bentuk-bentuk nyang berorientasi CRUD; Logika nyan dangkal dan UI-driven; Insinyur na mandum prilaku; Backend teutap jeut keu sumber kebenaran.
Gunakan SurveyJS watee:
Formulir-formulir nyan geukode keputusan bisnis; Aturan berkembang secara independen dari UI; Logika wajeb deuh, jeuet geu audit, atawa geu versi; Non-insinyur meupeungaroh keu tingkah laku; Bentuk nyang saban wajeb meujalan di padum-padum boh frontend.