Lesi sihloko sixhaswe ngabakwa-SurveyJS Kunemodeli yengqondo iningi lonjiniyela be-React ababelana ngayo ngaphandle kokuxoxa ngayo ngokuzwakalayo. Lawo mafomu ngaso sonke isikhathi kufanele abe izingxenye. Lokhu kusho isitaki esifana nalokhu:
I-React Hook Form yesifunda sendawo (ukunikezwa kabusha okuncane, ukubhaliswa kwenkambu ye-ergonomic, ukusebenzisana okubalulekile). I-Zod yokuqinisekisa (ukulunga kokokufaka, ukuqinisekiswa komngcele, ukuhlukanisa okuphephile kohlobo). Umbuzo we-React for backend: ukuhambisa, ukuzama futhi, ukulondoloza isikhashana, ukuvumelanisa iseva, nokunye.
Futhi ngobuningi bamafomu - izikrini zakho zokungena ngemvume, amakhasi akho ezilungiselelo, amamodeli akho e-CRUD - lokhu kusebenza kahle kakhulu. Ucezu ngalunye lwenza umsebenzi walo, lubhala ngokuhlanzekile, futhi ungadlulela ezingxenyeni zohlelo lwakho lokusebenza ezihlukanisa ngempela umkhiqizo wakho. Kodwa njalo ngemva kwesikhathi esithile, ifomu liqala ukuqongelela izinto ezifana nemithetho yokubonakala encike ezimpendulweni zangaphambili, noma amanani atholiwe adlula ezinkambini ezintathu. Mhlawumbe nawo wonke amakhasi okufanele eqiwe noma aboniswe ngokusekelwe enanini elisebenzayo. Uphatha imibandela yokuqala nge-useWatch kanye negatsha elisemgqeni, lokho kulungile. Bese kuba omunye. Ngemuva kwalokho usufinyelela ku-superRefine ukuze ufake ikhodi yemithetho ye-cross-field schema sakho se-Zod esingakwazi ukuyiveza ngendlela evamile. Bese, ukuzulazula kwesinyathelo kuqala ukuvuza ingqondo yebhizinisi. Kwesinye isikhathi, ubheka lokho okwakhile bese ubona ukuthi ifomu ayiseyona i-UI ngempela. Kuyinqubo yesinqumo, futhi ingxenye yesihlahla yilapho nje wenze khona ukuthi uyigcine. Kulapho ngicabanga ukuthi imodeli yengqondo yamafomu ku-React ibhidlika, futhi empeleni akulona iphutha likabani. Isitaki se-RHF + Zod sihle kakhulu kulokho ebesiklanyelwe kona. Inkinga ukuthi sivame ukuqhubeka nokuyisebenzisa kudlule iphuzu lapho izifinyezo zayo zihambisana nenkinga ngoba enye idinga indlela ehlukile yokucabanga ngamafomu ngokuphelele. Lesi sihloko simayelana nalokho okunye. Ukukhombisa lokhu, sizokwakha ifomu elifanayo lezinyathelo eziningi kabili:
Nge-React Hook Form + i-Zod enentambo yokuphendula Umbuzo ukuze uthunyelwe, Nge-SurveyJS, ephatha ifomu njengedatha - i-schema ye-JSON elula - kunengxenye yesihlahla.
Izidingo ezifanayo, ingqondo enemibandela efanayo, ikholi ye-API efanayo ekugcineni. Ngemuva kwalokho sizobe sibeka imephu kahle ukuthi yini ehambile nokuthi yini eyasala, bese sibeka indlela esebenzayo yokunquma ukuthi iyiphi imodeli okufanele uyisebenzise, futhi nini. Ifomu esilakhayo:
Leli fomu lizosebenzisa ukugeleza okuyizinyathelo ezi-4: Isinyathelo 1: Imininingwane
Igama lokuqala (kuyadingeka), I-imeyili (edingekayo, ifomethi evumelekile).
Isinyathelo sesi-2: Oda
Intengo yeyunithi, Ubuningi, Izinga lentela, Kuthathwe: Isamba esiphelele, Intela, Ingqikithi.
Isinyathelo sesi-3: I-akhawunti nempendulo
Ingabe unayo i-akhawunti? (Yebo/Cha) Uma Yebo → igama lomsebenzisi + nephasiwedi, kokubili kuyadingeka. Uma Cha → i-imeyili isiqoqwe kakade esinyathelweni 1.
Isilinganiso sokwaneliseka (1–5) Uma ≥ 4 → buza “Yini oyithandile?” Uma ≤ 2 → buza “Yini esingayithuthukisa?”
Isinyathelo sesi-4: Buyekeza
Ivela kuphela uma ingqikithi >= 100 Ukuthunyelwa kokugcina.
Lokhu akukhona okweqisayo. Kodwa kwanele ukuveza umehluko wezakhiwo. Ingxenye 1: I-Component-Driven (I-React Hook Form + Zod) Ukufakwa npm faka i-react-hook-form zod @hookform/resolvers @tanstack/react-query
Zod Schema Ake siqale nge-schema ye-Zod, ngoba imvamisa yilapho ukwakheka kwefomu kusungulwa khona. Ezinyathelweni ezimbili zokuqala - imininingwane yomuntu siqu kanye nokokufaka kwe-oda - yonke into iqondile: izintambo ezidingekayo, izinombolo ezinobuncane, kanye ne-enum. Ingxenye ethokozisayo iqala lapho uzama ukuveza imithetho enemibandela.
ngenisa {z } kusuka ku-"zod";
thekelisa i-const formSchema = z.object({ firstName: z.string().min(1, "Kudingeka"), i-imeyili: z.string().i-imeyili("I-imeyili engavumelekile"), intengo: z.number().min(0), ubuningi: z.number().min(1), IntelaRate: z.number(), z.Yescount:Acnum" igama lomsebenzisi,Inombolo:YesNumber: z.string().ongakukhetha(), iphasiwedi: z.string().ongakukhetha(), ukwaneliseka: z.number().min(1).max(5), positiveFeedback: z.string().optional(), improvementFeedback: z.string().optional(),}).superRefine((data, ctx) => {if (data) =Yeus =Year (data.=Ames) = {ctx.addIssue({code: "custom", indlela: ["igama lomsebenzisi"], umlayezo: "Kuyadingeka" }} uma (!data.password || data.password.length < 6) {ctx.addIssue({code: "custom", path: ["password"]); umlayezo: "}}}
uma (data.satisfaction >= 4 && !data.positiveFeedback) {ctx.addIssue({code: "custom", path: ["positiveFeedback"], umlayezo: "Sicela wabelane ngokuthandile" }); }
uma (data.satisfaction <= 2 && !data.improvementFeedback) {ctx.addIssue({ code: "custom", indlela:["improvementFeedback"], umlayezo: "Sicela usitshele ukuthi sithuthukise ini" }); }});
thekelisa uhlobo FormData = z.infer
Qaphela ukuthi igama lomsebenzisi nephasiwedi kuthayiphiwe njengokukhetha() noma kudingekile ngokwemibandela ngoba i-schema yezinga le-Zod sichaza umumo wento, hhayi imithetho ebusa lapho izinkambu zibalulekile. Imfuneko enemibandela kufanele iphile ngaphakathi kwe-superRefine, esebenza ngemva kokuba umumo uqinisekisiwe futhi ukwazi ukufinyelela entweni egcwele. Lokho kuhlukana akulona iphutha; yilokho nje ithuluzi eliklanyelwe kona: i-superRefine yilapho ingqondo ye-cross-field logic iya khona lapho ingakwazi ukuvezwa kusakhiwo se-schema ngokwayo. Okunye okuphawulekayo lapha ukuthi lesi schema esingakuvezi. Ayinawo umqondo wamakhasi, akukho mqondo wokuthi yiziphi izinkambu ezibonakala lapho, futhi akukho mqondo wokuzulazula. Konke lokho kuyohlala kwenye indawo. Ingxenye Yefomu
ngenisa i-{useForm, useWatch } isuka ku-"react-hook-form";ngenisa i-{zodResolver } isuka ku-"@hookform/resolvers/zod";ngenisa {useMutation } isuka ku-"@tanstack/react-query";ngenisa {useState, useMemo } kusukela ku-"react";ngenisa {formSchema} kusuka ku-"Daschema";
const IZINYATHELO = ["imininingwane", "oda", "i-akhawunti", "buyekeza"];
thayipha i-OrderPayload = I-FormData & {ingqikithi encane: inombolo; intela: inombolo; inani: inombolo };
umsebenzi wokuthekelisa RHFMultiStepForm() { const [isinyathelo, setStep] = useState(0);
Const mutation = useMutation ({ mutationFn: async (payload: OrderPayload) => { const res = lindela ukulanda("/api/oda", { indlela: "THUMELA", izihloko: { "Content-Type": "application/json" }, umzimba: JSON.stringify(payload), }); uma (!res.ok) ephonsa Iphutha elisha("Yehlulekile ukuhambisa"); buyisela res.json(); }, });
const {rejista, lawula, phathaSubmit, formState: { errors }, } = useForm
buyisela (
);}Bheka i-Pen SurveyJS-03-RHF [ifakwe ngemfoloko] ngokuqothulwa kwesithupha. Kuningi okwenzekayo lapha, futhi kufanelekile ukuthi wehlise ijubane ukuze ubone ukuthi izinto zigcine kuphi.
Amanani atholiwe - inani elincane, intela, inani - abalwa engxenyeni kusetshenziswa i-useWatch ne-useMemo ngoba ancike emananini enkundla ebukhoma futhi ayikho enye indawo engokwemvelo yawo. Imithetho yokubonakala yegama lomsebenzisi, iphasiwedi, i-positiveFeedback, kanye nokuthuthukisaImpendulo bukhoma ku-JSX njengemibandela engaphakathi komugqa. Umqondo wokweqa izinyathelo — ikhasi lokubuyekeza livela kuphela uma inani >= 100 — lishunyekiwe embukisweniThumela okuguquguqukayo kanye nesimo sokunikezela esinyathelweni sesi-3. Ukuzulazula ngokwako kumane kuyikhawunta ye-useState esiyinyusayo mathupha. I-React Query iphatha ukuzama futhi, ukufaka kunqolobane, nokungavumelekile. Ifomu livele libize i-mutation.mutate ngedatha eqinisekisiwe.
Akukho kulokhu okungalungile, ngokwesibonelo. Lokhu kuseyi-idiomatic React, futhi ingxenye iyasebenza kakhulu ngenxa yokuthi i-RHF ihlukanisa kanjani ukunikezwa kabusha. Kodwa uma ubungase unikeze umuntu obengakakubhali lokhu futhi umcele ukuthi achaze ukuthi ikhasi lokubukeza livela ngaphansi kwaziphi izimo, kuzodingeka ukuthi alandelele ngokusebenzisa umbukisoThumela, isinyathelo sesi-3 sokunikeza umbandela, kanye nengqondo yenkinobho ye-nav — izindawo ezintathu ezihlukene — ukuze akhe kabusha umthetho obungashiwo emgqeni owodwa. Ifomu liyasebenza, yebo, kodwa ukuziphatha akuhloleki ngempela njengesistimu. Kumele kwenziwe ngokwengqondo. Okubaluleke nakakhulu, ukuyishintsha kudinga ukubandakanyeka konjiniyela. Ngisho ne-tweak encane, njengokulungisa lapho isinyathelo sokubuyekeza sivela, kusho ukuhlela ingxenye, ukuvuselela ukuqinisekiswa, ukuvula isicelo sokudonsa, ukulinda ukubuyekezwa, nokuphakela futhi. Ingxenye 2: I-Schema-Driven (SurveyJS) Manje ake sakhe ukugeleza okufanayo sisebenzisa i-schema. Ukufakwa npm faka i-survey-core survey-react-ui @tanstack/react-query
i-survey-coreInjini yesikhathi sokusebenza enelayisensi ye-MIT enelayisensi ye-MIT enika amandla ukunikezwa kwefomu le-SurveyJS - ingxenye esiyikhathalelayo lapha. Kudingeka i-schema se-JSON, yakhe imodeli yangaphakathi kuyo, futhi isingatha yonke into ebingaphila engxenyeni yakho ye-React: ukuhlola izinkulumo zokubonakala, ukwenza ikhompuyutha amanani atholiwe, ukuphatha isimo sekhasi, ukuqinisekiswa kokulandelela, kanye nokunquma ukuthi "qedela" kusho ukuthini uma kubhekwa ukuthi imaphi amakhasi abonisiwe ngempela.
i-survey-react-uiI-UI / isendlalelo esinikezayo esixhuma leyo modeli ku-React. Empeleni iyingxenye ye-
Ndawonye, bakunikeza ukusebenza ngokugcwele, isikhathi sokusebenza samakhasi amaningi ngaphandle kokubhala umugqa owodwa wokugeleza kokulawula. Ifomethi ye-schema ngokwayo, njengoba kushiwo ngaphambili, i-JSON nje - ayikho i-DSL nanoma yini ephathelene nokuphathelene. Ungayingenisa emgqeni, uyingenise efayelini, uyilande ku-API, noma uyigcine kukholomu yesizindalwazi futhi uyifake emanzini ngesikhathi sokusebenza. Ifomu elifanayo, njengedatha Nali ifomu elifanayo, kulokhu kuvezwe njengento ye-JSON. I-schema sichaza yonke into: isakhiwo, ukuqinisekiswa, imithetho yokubonakala, izibalo ezitholiwe, ukuzulazula kwekhasi - futhi sikunikeze Imodeli eyihlolayo ngesikhathi sokusebenza. Nakhu ukuthi kubukeka kanjani ngokugcwele:
export const surveySchema = {isihloko: "Ukugeleza Kwe-oda", showProgressBar: "phezulu", amakhasi: [ {igama: "imininingwane", izakhi: [ {uhlobo: "umbhalo", igama: "firstName", isRequired: true }, {type: "text", name: "i-imeyili", inputType: "i-imeyili", isRequired: true, validators: [{ type : imeyili ] "In imeyili yokuqinisekisa: [{ uhlobo:} }, {igama: "oda", izakhi: [ {uhlobo: "umbhalo", igama: "inani", i-inputType: "inombolo", iValue ezenzakalelayo: 0 }, {type: "text", igama: "quantity", inputType: "number", defaultValue: 1 }, {type: "dropdown",igama: "taxRate", defaultValue: 0.1, choices: [ {value: 0.05, text: "5%" }, {value: 0.1, text: "10%" }, {value: 0.15, text: "15%" } ] }, {type: "expression", name: "{subtotal type"}}: "subtotal type"}: "expression", name: "tax", expression: "{subtotal} {taxRate}" }, { type: "expression", name: "total", expression: "{subtotal} + {tax}" } ] }, {name: "account", elements: [ {type: "radiogroup", name: "hasAccount", choices: """"yebo"igama}, {"Yes type:" Nome text} visualIf: "{hasAccount} = 'Yebo'", isRequired: true }, {type: "text", igama: "password", inputType: "password", ebonakalayoIf: "{hasAccount} = 'Yebo'", kuyafuneka: true, validators: [{ type: "text", minLength: 6, text: "Min, type:}} ratings characters "satisfaction", rateMin: 1, rateMax: 5 }, {uhlobo: "comment", igama: "positiveFeedback", ebonakalayoUma: "{satisfaction} >= 4" }, {type: "comment", name: "improvementFeedback", ebonakalayoIf: "{satisfaction} <= 2" } : : ] : {0} buka {0}, {0} bheka, {0} izakhi: [] } ]};
Qhathanisa lokhu nenguqulo ye-RHF okwesikhashana.
Ibhulokhi ye-superRefine ebidinga igama lomsebenzisi nephasiwedi ngokwemibandela isihambile. visualIf: "{hasAccount} = 'Yebo'" kuhlanganiswe ne-IsRequired: iqiniso lisingatha kokubili ukukhathazeka ndawonye, enkundleni ngokwayo, lapho ubungalindela ukukuthola khona. Iketango le-useWatch + useMemo elibale inani eliphansi, intela, nesamba lithathelwa indawo izinkambu ezintathu zezinkulumo ezibhekisela enye nenye ngamagama. Isimo sekhasi lokubuyekeza, enguqulweni ye-RHF elakheka kabusha kuphela ngokulandelelwa ngombukisoThumela, isinyathelo sesi-3 sinikeza igatsha. Futhi ekugcineni, i-logic yenkinobho ye-nav iyisici esisodwa esibonakalayoUma isici sento yekhasi.
Ingqondo efanayo ikhona. Ukuthi nje i-schema iyinikeza indawo yokuhlala lapho ibonakala yodwa, kunokuba isabalale engxenyeni. Futhi, qaphela ukuthi i-schema isebenzisa uhlobo: 'umusho' wesamba esiphansi, intela, kanye nesamba. Inkulumo ifundwa kuphela futhi isetshenziswa kakhulu ukubonisa amanani abaliwe. I-SurveyJS iphinde isekele uhlobo: 'html' lokuqukethwe okumile, kodwa ngamavelu abaliwe, isisho siyisinqumo esifanele. Manje ngohlangothi lwe-React. Ukunikeza Nokuhambisa Kulula kakhulu. I-Wire onQedela ku-API yakho ngendlela efanayo - ngokusebenzisa Ukuguqulwa noma ukulanda okusobala:
ngenisa {useState, useEffect, useRef } usuka ku-"react";ngenisa {useMutation } usuka ku-"@tanstack/react-query";ngenisa {Model } usuka ku-"survey-core";ngenisa { Survey } from "survey-react-ui";ngenisa "survey-core/survey-cores"css.
umsebenzi wokuthekelisa i-SurveyForm() { const [imodeli] = useState(() => Imodeli entsha(surveySchema));
Const mutation = useMutation ({ i-mutationFn: i-async (idatha) => { const res = lindela ukulanda("/api/oda", { indlela: "THUMELA", izihloko: { "Content-Type": "application/json" }, umzimba: JSON.stringify(idatha), }); uma (!res.ok) ephonsa Iphutha elisha("Yehlulekile ukuhambisa"); buyisela res.json(); }, });
const mutationRef = useRef(ukuguqulwa); mutationRef.current = ukuguqulwa; useEffect(() => {const handler = (umthumeli) => mutationRef.current.mutate(sender.data); model.onComplete.add(handler); buyisela () => model.onComplete.remove(isibambi); }, [imodeli]); // i-ref igwema ukubhalisa kabusha isibambi konke okunikezwayo (ukuguquguquka kobunikazi bento)
buya (
<>
Bona i-Pen SurveyJS-03-SurveyJS [ifakwe ngemfoloko] ngokuqothulwa kwesithupha.
onQedela imililo lapho umsebenzisi efika ekugcineni kwekhasi lokugcina elibonakalayo. Ngakho-ke uma inani lingalokothi leqe u-100 futhi ikhasi lokubuyekeza leqiwe, lisavutha ngendlela efanele ngoba i-SurveyJS ihlola ukubonakala ngaphambi kokunquma ukuthi lisho ukuthini "ikhasi lokugcina". Bese, idatha yomthumeli iqukethe zonke izimpendulo kanye namanani abaliwe (isamba esingaphansi, intela, isamba) njengezinkambu zesigaba sokuqala, ngakho-ke ukulayishwa kwe-API kuyefana nalokho okuhlanganiswe yinguqulo ye-RHF ngesandla ekuthumeleni. IIphethini ye-mutationRef iyafana naleyo ongayifinyelela noma yikuphi lapho udinga isibambi somcimbi esizinzile ngaphezu kwevelu elishintshayo kukho konke okunikezwayo - akukho lutho oluqondile lwe-SurveyJS ngayo.
Ingxenye ye-React ayisaqukethe umqondo webhizinisi nhlobo. Ayikho i-useWatch, ayikho i-JSX enemibandela, akukho counter counter, akukho useMemo chain, akukho superRefine. I-React yenza lokho okuhle kakhulu kukho: ukunikeza ingxenye nokuyifaka ngezintambo kukholi ye-API. Yini Eyaphuma Ekuphenduleni?
Ukukhathazeka Isitaki se-RHF I-SurveyJS Ukubonakala Amagatsha e-JSX ebonakalayoUma Amanani atholiwe useWatch / useMemo isisho Imithetho yenkundla yesiphambano Qeqesha kakhulu Izimo ze-schema Ukuzulazula isimo sesinyathelo Ikhasi liyabonakalaUma Rule indawo Kusatshalaliswe kuwo wonke amafayela Ibekwe endaweni eyodwa ku-schema
Okuhlala ku-React isakhiwo, isitayela, izintambo zokuthumela, nokuhlanganiswa kohlelo lokusebenza, okusho ukuthi, izinto i-React ziklanyelwe zona. Konke okunye kuhanjiswe ku-schema, futhi ngenxa yokuthi i-schema siyinto ye-JSON nje, ingagcinwa kusizindalwazi, ihunyushwe ngaphandle kwekhodi yakho yohlelo lokusebenza, noma ihlelwe ngokusebenzisa amathuluzi angaphakathi ngaphandle kokudinga ukuthunyelwa. Umphathi womkhiqizo odinga ukushintsha umkhawulo ovula ikhasi lokubuyekeza angenza lokho ngaphandle kokuthinta ingxenye. Lowo umehluko ophusile wokusebenza wamaqembu lapho ukuziphatha kwefomu kuguquka njalo futhi kungaqhutshwa onjiniyela ngaso sonke isikhathi. Isetshenziswa Nini Indlela Ngayinye? Nawu umthetho omuhle ongisebenzelayo: zicabange ususe ngokuphelele ifomu. Ungalahlekelwa yini?
Uma kuyizikrini, ufuna amafomu aqhutshwa ingxenye. Uma kuwumqondo webhizinisi, njengemikhawulo, imithetho yegatsha, nezidingo ezinemibandela ezifaka izinqumo zangempela, ufuna injini ye-schema.
Ngokufanayo, uma izinguquko eziza kuwe ngokuvamile zimayelana namalebula, izinkambu, nesakhiwo, i-RHF izokusebenzela kahle. Uma imayelana nezimo, imiphumela, kanye nemithetho i-ops yakho noma ithimba lezomthetho elingase lidinge ukuyilungisa ngoLwesibili ntambama ngaphandle kokugcwalisa ithikithi, imodeli ye-schema ne-SurveyJS iyona elingana ngokwethembeka. Lezi zindlela ezimbili aziqhudelani ngempela. Babhekana nezigaba ezihlukene zezinkinga, futhi iphutha okufanele ligwenywe ukungafani nokulinganisa nesisindo somqondo - ukuphatha isimiso somthetho njengengxenye ngoba lelo ithuluzi elijwayelekile, noma ukufinyelela injini yenqubomgomo ngenxa yokuthi ifomu likhule laba yizinyathelo ezintathu futhi lathola inkambu enemibandela. Ifomu esilakhe lapha lihlala eduze komngcele ngamabomu, liyinkimbinkimbi ngokwanele ukuze liveze umehluko kodwa hhayi elidlulele kangangokuthi ukuqhathanisa kuzwakala kuqinisiwe. Amafomu amaningi angempela angatholakali kalula ku-codebase yakho cishe ahlala eduze kwalowo mngcele ofanayo, futhi umbuzo uvame ukuthi ngabe ukhona yini oqambe ukuthi uyini ngempela. Sebenzisa i-React Hook Form + Zod lapho:
Amafomu agxile ku-CRUD; I-Logic ayijulile futhi iqhutshwa yi-UI; Onjiniyela baphethe konke ukuziphatha; I-backend ihlala ingumthombo weqiniso.
Sebenzisa i-SurveyJS uma:
Amafomu ahlanganisa izinqumo zebhizinisi; Imithetho iyashintsha ngaphandle kwe-UI; Okunengqondo kufanele kubonakale, kufundeke, noma kwenziwe inguqulo; Abangebona onjiniyela banethonya ekuziphatheni; Ifomu elifanayo kufanele lisebenze ezindaweni ezingaphambili eziningi.