Ichi chinyorwa chinotsigirwa neSurveyJS Kune muenzaniso wepfungwa vazhinji vanogadzira React vanogovana vasina kumbotaura nezvazvo zvinonzwika. Mafomu iwayo anogara achifanirwa kunge ari zvikamu. Izvi zvinoreva stack senge:
React Hook Form yenzvimbo yenzvimbo (zvishoma-renders, ergonomic field kunyoreswa, kudyidzana kwakakosha). Zod yekusimbisa (kurongeka kwekuisa, kusimbiswa kwemuganho, mhando-yakachengeteka parsing). React Mubvunzo we backend: kuendesa, kuedzazve, caching, server sync, zvichingodaro.
Uye kune akawanda mafomu - ako ekupinda zviratidziro, ako mapeji ezvirongwa, yako CRUD modal - izvi zvinoshanda chaizvo. Chidimbu chega chega chinoita basa racho, vanonyora zvakachena, uye iwe unogona kuenda kune zvikamu zvekushandisa kwako izvo zvinonyatso siyanisa chigadzirwa chako. Asi nguva nenguva, fomu rinotanga kuunganidza zvinhu zvakaita semirau yekuona inotsamira pamhinduro dzekutanga, kana hunhu hwakatorwa hunoyerera nemuminda mitatu. Pamwe nyangwe mapeji ese anofanirwa kudururwa kana kuratidzwa zvichibva pahuwandu hwekumhanya. Iwe unobata yekutanga conditional ine useWatch uye inline bazi, izvo zvakanaka. Ipapo mumwe. Ipapo iwe uri kusvika kune superRefine yekuisa muchinjika-mumunda mitemo iyo yako Zod schema haigone kutaura nenzira yakajairika. Zvadaro, nhanho yekufambisa inotanga kudonha bhizinesi pfungwa. Pane imwe nguva, iwe unotarisa pane zvawakavaka uye woona kuti iyo fomu haisisiri iyo UI zvakare. Iyo yakawanda yesarudzo maitiro, uye chikamu chemuti ndiko kwawakaitika kuti uichengete. Apa ndipo pandinofunga kuti chimiro chepfungwa chemafomu muReact chinoputsika, uye haisi mhosva yemunhu. Iyo RHF + Zod stack yakanaka pane yayakagadzirirwa. Nyaya iripo ndeyekuti isu tinowanzo ramba tichiishandisa kupfuura iyo iyo yekubvisa kwayo inoenderana nedambudziko nekuti imwe nzira inoda imwe nzira yekufunga nezvemafomu zvachose. Ichi chinyorwa chiri pamusoro peimwe nzira iyoyo. Kuti tiratidze izvi, isu tichavaka iyo chaiyo yakawanda-nhanho fomu kaviri:
NeReact Hook Form + Zod wired to React Query yekuendesa, NeSurveyJS, iyo inobata fomu se data - iri nyore JSON schema - pane chikamu chemuti.
Zvimwe chete zvinodikanwa, zvakafanana zvemamiriro ezvinhu, yakafanana API kufona kumagumo. Ipapo tinozonyatso nyora izvo zvakafamba uye chii chakasara, uye toronga nzira inoshanda yekusarudza kuti ndeipi modhi yaunofanira kushandisa, uye rinhi. Fomu yatiri kugadzirira:
Iyi fomu ichashandisa 4-nhanho kuyerera: Danho 1: Tsanangudzo
Zita rekutanga (rinodiwa), Email (inodiwa, inoshanda fomati).
Danho rechipiri: Odha
Mutengo weyuniti, Huwandu, Mutero, Zvakatorwa: Subtotal, Mutero, Total.
Nhanho 3: Akaundi & Mhinduro
Une account here? (Hongu/Kwete) Kana Hongu → username + password, zvese zvinodiwa. Kana Kwete → email yakatounganidzwa mudanho rekutanga.
Chiyero chekugutsikana (1–5) Kana ≥ 4 → bvunza kuti “Chii chamakafarira?” Kana ≤ 2 → akabvunza “Chii chatingavandudza?”
Danho rechina: Ongorora
Inowanikwa chete kana yakazara >= 100 Kuendesa kwekupedzisira.
Izvi hazvina kunyanyisa. Asi zvakakwana kuratidza kusiyana kwezvivakwa. Chikamu 1: Chikamu-Chinofambiswa (React Hook Form + Zod) Installation npm isa react-hook-form zod @hookform/resolvers @tanstack/react-query
Zod Schema Ngatitangei neZod schema, nekuti kazhinji ndipo panotanga chimiro chefomu. Pamatanho maviri ekutanga - ruzivo rwemunhu uye kurongeka - zvese zvakatwasuka: tambo dzinodiwa, nhamba dzine hushoma, uye enum. Chikamu chinonakidza chinotanga kana iwe uchiedza kuratidza mitemo ine chirevo.
unza {z } kubva ku "zod";
export const formSchema = z.object({ firstName: z.string().min(1, "Inodiwa"), email: z.string().email("Imeiri isiriyo"), mutengo: z.number().min(0), uwandu: z.number().min(1), taxRate: z.number(),z.Ye.Yee:Acnum" z.string().optional(), password: z.string().optional(), kugutsikana: z.number().min(1).max(5), positiveFeedback: z.string().optional(), improvementFeedback: z.string().optional(),}).superRefine((data, ctx) => {kana (ccount)(data.=Year) =us {ctx.addIssue({code: "custom", nzira: ["username"], message: "Inodiwa"}} } kana (!data.password || data.password.length < 6) {ctx.addIssue({code: "custom", path: ["password"]), character:}}}
kana (data.satisfaction >= 4 && !data.positiveFeedback) {ctx.addIssue({code: "custom", nzira: ["positiveFeedback"], meseji: "Ndapota govera zvawafarira"}); }
kana (data.satisfaction <= 2 && !data.improvementFeedback) {ctx.addIssue({code: "custom", nzira:["improvementFeedback"], meseji: "Ndapota tiudze zvekuvandudza"}); }});
kunze mhando FormData = z.infer
Ziva kuti zita rekushandisa nepassword zvakataipa sesarudzo () kunyangwe zvichidikanwa nekuti Zod's type-level schema inotsanangura chimiro chechinhu, kwete mitemo inotonga kana minda ine basa. Izvo zvinodikanwa zvinofanirwa kugara mukati me superRefine, iyo inomhanya mushure mekunge chimiro chasimbiswa uye kuwana chizere chinhu. Kuparadzana ikoko hakusi kukanganisa; ndizvo chaizvo zvakagadzirirwa chishandiso: superRefine ndipo panoenda muchinjiko-mumunda pfungwa kana isingagone kuratidzwa mune schema chimiro pachayo. Chiri kucherechedzwawo apa ndechekuti schema iyi isingatauri. Iyo haina pfungwa yemapeji, hapana pfungwa yekuti ndeapi minda inoonekwa panguva ipi, uye hapana pfungwa yekufambisa. Zvose izvozvo zvichagara kumwewo. Form Component
import {useForm, useWatch } kubva ku "react-hook-form";import {zodResolver} kubva ku"@hookform/resolvers/zod";import {useMutation} kubva ku"@tanstack/react-query";import {useState, useMemo} kubva ku"react";import {formSchema} kubva ku"Daschema";
const STEPS = ["details", "order", "account", "review"];
mhando OrderPayload = FormData & {subtotal: nhamba; mutero: nhamba; hwerengedzo: nhamba };
kunze basa RHFMultiStepForm () {const [danho, setStep] = useState(0);
const mutation = useMutation ({ mutationFn: async (mubhadharo: OrderPayload) => { const res = kumirira kutora ("/ api/mirairo", { nzira: "POST", misoro: {"Content-Type": "application/json" }, muviri: JSON.stringify(payload), }); kana (!res.ok) ikande Chikanganiso chitsva("Yatadza kuunza"); return res.json(); }, });
const {rejista, control, handleSubmit, formState: {zvikanganiso}, } = useForm
dzorera (
);}Ona Pen SurveyJS-03-RHF [yakafukidzwa] nekutsakatika kwechitanhatu. Pane zvakawanda zviri kuitika pano, uye zvakakodzera kunonoka kuona kuti zvinhu zvakaguma kupi.
Iwo akatorwa tsika - subtotal, mutero, yakazara - inoverengerwa muchikamu kuburikidza neSetWatch uye useMemo nekuti zvinoenderana nehupenyu hwemunda hunhu uye hapana imwe nzvimbo yakasarudzika kwavari. Mitemo yekuona yezita rekushandisa, password, positiveFeedback, uye kuvandudzaFeedback inogara muJSX se inline zvimiso. Iyo nhanho-kusvetuka logic - peji yekudzokorora ichingoonekwa kana yakazara >= 100 - yakanyudzwa muratidziroTumira shanduko uye mamiriro ekupa padanho 3. Navigation pachayo ingori kushandisaState counter iyo isu tiri kuwedzera nemaoko. React Query inobata kuedzazve, caching, uye kusashanda. Iyo fomu inongodaidza mutation.mutate ine yakasimbiswa data.
Hapana chimwe cheizvi chakaipa, se. Ichi chichiri idiomatic React, uye chikamu chacho chiri kuita zvakanaka nekuda kwenzira iyo RHF inoparadzanisa nayo zvakare. Asi kana iwe waizopa izvi kune mumwe munhu asina kuzvinyora uye wovakumbira kuti vatsanangure kuti peji rekuongorora rinoonekwa pasi pemamiriro akaita sei, vanozofanira kutsvaga kuburikidza neshowSubmit, nhanho 3 inopa mamiriro, uye nav bhatani logic - nzvimbo nhatu dzakasiyana - kuvakazve mutemo ungadai wakataurwa mumutsara mumwe. Iyo fomu inoshanda, hongu, asi maitiro haanyatso kutarisika sehurongwa. Inofanira kuitwa mupfungwa. Zvinotonyanya kukosha, kuishandura kunoda kubatanidzwa kweinjiniya. Kunyangwe diki diki, sekugadzirisa kana danho rekuongorora richiratidza, zvinoreva kugadzirisa chikamu, kuvandudza kusimbiswa, kuvhura chikumbiro chekudhonza, kumirira kuongororwa, uye kutumira zvakare. Chikamu 2: Schema-Driven (SurveyJS) Zvino ngativake kuyerera kwakafanana tichishandisa schema. Installation npm isa ongororo-yakakosha ongororo-react-ui @tanstack/react-query
ongororo-musimbotiInjini yeMIT-yakatenderwa chikuva-yakasununguka runtime injini inopa simba reSurveyJS fomu rekupa - chikamu chatinotarisira pano. Zvinotora JSON schema, inovaka modhi yemukati kubva pairi, uye inobata zvese zvaizogara mune yako React chikamu: kuongorora maratidziro ekuonekwa, komputa yakatorwa tsika, kutonga peji peji, yekutevera kusimbiswa, uye kusarudza kuti "kukwana" kunorevei kupihwa mapeji akanyatso kuratidzwa.
ongororo-react-uiThe UI / rendering layer inobatanidza iyo modhi kuReact. Icho chakanyanya
Pamwe chete, vanokupa inoshanda zvizere, yakawanda-mapeji fomu yekumhanyisa pasina kunyora mutsara mumwechete wekudzora kuyerera. Iyo schema fomati pachayo, sezvambotaurwa, ingori JSON - hapana DSL kana chero chinhu. Iwe unogona kuipinza mumutsara, kuipinza kubva mufaira, kuitora kubva kuAPI, kana kuichengeta mukoramu yedatabase uye kuiisa mvura panguva yekumhanya. Iyo Yakafanana Fomu, SeData Heino fomu imwechete, ino nguva inoratidzwa sechinhu cheJSON. Iyo schema inotsanangura zvese: chimiro, kusimbiswa, mitemo yekuonekwa, yakatorwa kuverenga, peji yekufambisa - uye inoiisa kuModheru inoiongorora panguva yekumhanya. Hezvino izvo zvinotaridzika sezvakazara:
export const surveySchema = {zita: "Order Flow", showProgressBar: "top", mapeji: [ {zita: "details", elements: [ {type: "text", zita: "firstName", rinodiwa: chokwadi }, {type: "text", zita: "email", inputType: "email", isRequired: true, validators: [{ email'] "Inbox text:}" +zita: "TaxRate", defaultValue: 0.1, sarudzo: [ { value: 0.05, text: "5%"}, { value: 0.1, text: "10%" }, { value: 0.15, text: "15%" } ] }, {type: "expression", zita: "{subtotal type}}}: "matauriro", zita: "mutero", kutaura: "{subtotal} {taxRate}" }, {type: "matauriro", zita: "total", kutaura: "{subtotal} + {tax}" } ] }, {zita: "akaundi", zvinhu: [{type: "radiogroup", zita: "hasAccount", sarudzo: [""]""Yes zita", {Kwete zita}, "Hongu zita" zvinoonekaKana: "{hasAccount} = 'Hongu'", Inodiwa: chokwadi }, {type: "text", zita: "password", inputType: "password", inoonekaKana: "{hasAccount} = 'Hongu'", Inodiwa: chokwadi, vagadzirisi: [{ type: "text", minLength: 6, zvinyorwa, "Min: zita: 6} ratings, "Min: 6} "kugutsikana", rateMin: 1, rateMax: 5 }, {type: "comment", zita: "positiveFeedback", inoonekaKana: "{kugutsikana} >= 4" }, {type: "comment", zita: "improvementFeedback", inoonekaIf: "{kugutsikana} <= 2" } : ] : "{0} tarisa", {0} tarisa, {} , , , , , , , , , , , = 0 zvinhu: [] } ]};
Enzanisa izvi neRHF vhezheni kwechinguva.
Iyo superRefine block yaidiwa nemamiriro ekushandisa uye password yaenda. onekaKana: "{hasAccount} = 'Hongu'" yakasanganiswa neInodiwa: chokwadi chinobata zvese zvirikunetsa pamwechete, pamunda pacho, paungatarisira kuzviwana. The useWatch + useMemo cheni iyo yakaverengera subtotal, mutero, uye yakazara inotsiviwa nematatu ekutaura ndima anonongedzera mumwe nemumwe nemazita. Mamiriro ezve peji rekuongorora, ayo ari muRHF vhezheni akagadzirwazve chete nekutsvaga kuburikidza neshowSubmit, nhanho 3 inopa bazi. Uye pakupedzisira, iyo nav bhatani logic inoonekwa imwechete kana pfuma iri pane peji chinhu.
Same logic iripo. Ingori kuti schema inoipa iyo nzvimbo yekugara painooneka iri yega, pane kupararira muchikamu. Zvakare, cherechedza kuti schema inoshandisa mhando: 'kutaura' kune subtotal, mutero, uye yakazara. Matauriro anoverengwa-chete uye anoshandiswa kunyanya kuratidza hunhu hwakaverengerwa. SurveyJS inotsigirawo mhando: 'html' yezvakamira, asi kune akaverengerwa kukosha, kutaura ndiyo sarudzo chaiyo. Zvino kune React side. Kupa uye Kuzviisa pasi Very simple. Waya paYakwana kune yako API nenzira imwechete - kuburikidza nekushandisaMutation kana plain fetch:
pinza {useState, useEffect, useRef } kubva ku "react";import {useMutation} kubva "@tanstack/react-query";import {Model } kubva "survey-core";import {Survey} kubva "survey-react-ui";import "survey-core/survey-cores"
kunze basa SurveyForm () {const [model] = useState(() => new Model(surveySchema));
const mutation = useMutation ({ mutationFn: async (data) => { const res = kumirira kutora ("/ api/mirairo", { nzira: "POST", misoro: {"Content-Type": "application/json" }, muviri: JSON.stringify(data), }); kana (!res.ok) ikande Chikanganiso chitsva("Yatadza kuunza"); return res.json(); }, });
const mutationRef = useRef(mutation); mutationRef.current = mutation; useEffect(() => {const handler = (sender) => mutationRef.current.mutate(sender.data); model.onComplete.add(handler); dzoka () => model.onComplete.remove(handler); }, [modhi]); // ref inodzivirira kunyoresazve mugadziri wega wega (mutation chinhu chinoshanduka chinoshanduka)
dzoka (
<>
Ona Pen SurveyJS-03-SurveyJS [yakafukidzwa] nekutsakatika kwechitanhatu.
paPedzisa moto kana mushandisi asvika kumagumo ekupedzisira peji inooneka. Saka kana huwandu husina kumbobvira hwayambuka zana uye peji rekudzokorora rakasvetuka, rinoramba richipisa nemazvo nekuti SurveyJS inoongorora kuoneka isati yafunga kuti "peji rekupedzisira" rinorevei. Zvadaro, sender.data ine mhinduro dzese pamwe chete neakaverengerwa kukosha (subtotal, tax, total) seminda yekutanga, saka iyo API payload inofanana neiyo RHF vhezheni yakaunganidzwa pamaoko paSubmit. ThemutationRef pateni ndiyo imwe chete yaungasvikira chero kwaunoda yakagadzikana chiitiko chibatiso pamusoro pemutengo unochinja pane yega yega - hapana SurveyJS-yakanangana nazvo.
Iyo React chikamu hachisina chero bhizinesi logic zvachose. Iko hakuna useWatch, hapana mamiriro JSX, hapana nhanho counter, hapana useMemo cheni, hapana superRefine. React iri kuita zvazvakanakira pairi: kupa chinhu uye kuchiisa waya kune API kufona. Chii Chakabva MuReact?
Concern RHF Stack SurveyJS Kuonekwa JSX mapazi zvinoonekaKana Derived values useWatch / useMemo kutaura Cross-field mitemo superRefine Schema mamiriro Navigation step state Peji inoonekaKana Rule nzvimbo Yakagoverwa pamafaira ese Centralized mu schema
Izvo zvinogara muReact dhizaini, dhizaini, kuendesa wiring, uye kubatanidzwa kweapp, kureva, izvo zvinhu React zvakagadzirirwa chaizvo. Zvese zvimwe zvakapinda mu schema, uye nekuti schema ingori chinhu cheJSON, inogona kuchengetwa mudhatabhesi, yakashandurwa yakazvimiririra yekodhi yako yekushandisa, kana kugadziridzwa kuburikidza nechomukati chekushandisa pasina kuda kutumirwa. Maneja wechigadzirwa anoda kushandura chikumbaridzo chinokonzeresa peji rekuongorora anogona kuita izvozvo pasina kubata chikamu. Ndiwo mutsauko unoshanda wezvikwata uko maitiro emafomu anoshanduka kazhinji uye haagare achifambiswa nemainjiniya. Nguva Yokushandisa Nzira Imwe neimwe? Heino mutemo wakanaka wegunwe unoshanda kwandiri: fungidzira uchidzima fomu zvachose. Chii chaungarasikirwa nacho?
Kana iri skrini, iwe unoda mafomu anofambiswa nechikamu. Kana iri bhizinesi pfungwa, senge zvikumbaridzo, mitemo yebazi, uye zvimiro zvinodikanwa zvinoisa sarudzo chaidzo, iwe unoda schema injini.
Saizvozvo, kana shanduko dziri kuuya nenzira yako dzinenge dzine mazita, minda, uye dhizaini, RHF inokushandira zvakanaka. Kana zviri zvemamiriro, mhedzisiro, uye mitemo iyo ops yako kana timu yezvemitemo ingangoda kugadzirisa neChipiri masikati pasina kuisa tikiti, schema modhi neSurveyJS ndiyo yakanyanya kutendeseka. Nzira mbiri idzi hadzisi mumakwikwi. Vanogadzirisa makirasi akasiyana ematambudziko, uye chikanganiso chakakodzera kunzvenga kusapindirana kwehuremu hwepfungwa - kubata hurongwa hwekutonga sechikamu nekuti ndicho chishandiso chakajairika, kana kusvika kune injini yemitemo nekuti fomu rakakura kusvika pamatanho matatu uye rakawana ndima ine zvirevo. Fomu yatakavaka pano inogara pedyo nemuganhu nemaune, yakaoma zvakakwana kuti ibudise mutsauko asi kwete zvakanyanya zvokuti kuenzanisa kunonzwa kukanganiswa. Mazhinji mafomu chaiwo asina kusimba mucodebase yako angangogara padyo nemuganho mumwechete iwoyo, uye mubvunzo unowanzo kungoti chero munhu ataura zvaari chaizvo. Shandisa React Hook Fomu + Zod kana:
Mafomu ane CRUD-yakatarisana; Logic haina kudzika uye UI-inotyairwa; Mainjiniya vane maitiro ese; Backend inoramba iri sosi yechokwadi.
Shandisa SurveyJS kana:
Mafomu encode bhizinesi sarudzo; Mitemo inoshanduka yakazvimirira yeUI; Logic inofanirwa kuoneka, inoongororwa, kana kushandurwa; Vasiri mainjiniya vanofurira maitiro; Iyo fomu imwechete inofanirwa kumhanya kune akawanda ekumberi.