Maqaalkan waxaa kafaala qaaday SurveyJS Waxaa jira qaab maskaxeed inta badan horumariyayaasha React ay wadaagaan iyaga oo aan waligood si sare uga hadlin. Foomamkaas ayaa had iyo jeer loo maleynayaa inay yihiin qaybo. Tani waxay ka dhigan tahay xirmo sida:
Foomka Hook React ee gobolka deegaanka (dib u soo celinta ugu yar, diiwaangelinta goobta ergonomic, isdhexgalka lama huraanka ah). Zod si loo ansixiyo (saxnimada gelinta, ansixinta xadka, kala saarista nooca-ammaan ah). Ka jawaab su'aalaha dhabarka: soo gudbinta, dib u tijaabinta, kaydinta, isku xidhka serverka, iyo wixii la mid ah.
Iyo inta badan foomamka - shaashadaha soo gelida, boggaga dejinta, moodooyinkaaga CRUD - tani waxay si fiican u shaqeysaa. Qayb kastaa waxay qabataa shaqadeeda, si nadiif ah ayay u diyaariyaan, waxaadna u gudbi kartaa qaybaha codsigaaga oo si dhab ah u kala sooca alaabtaada. Laakin hal mar oo ka mid ah, foomku waxa uu bilaabaa ururinta waxyaabo ay ka mid yihiin xeerarka aragga ee ku xidhan jawaabihii hore, ama qiyamka la soo saaray ee ku soo qulqulaya saddex qaybood. Waxaa laga yaabaa in xitaa bogag dhan oo ay tahay in la boodo ama la muujiyo iyadoo lagu saleynayo wadarta guud. Waxa aad ku xalinaysaa shuruuda koowaad ee isticmaalkaWatch iyo laan khad dhexdeed ah, taas oo fiican. Ka dibna mid kale. Markaa waxaad gaadhaysaa superRefine si aad u dejiso xeerarka goobta-goysyada ee Zod schemaagu aanu si caadi ah u sheegi karin. Kadibna, talaabada navigation-ka waxa uu bilaabaa soo daadashada macquulka ganacsiga. Mar marka qaarkood, waxaad eegtaa waxaad dhistay oo waxaad ogaataa in foomku aanu run ahaantii UI ahayn. Waa wax badan oo ka mid ah habka go'aan qaadashada, iyo geedka ka kooban yahay kaliya meesha aad ku dhacday inaad ku kaydiso. Tani waa halka aan u maleynayo in qaabka maskaxeed ee foomamka React uu burburo, oo runtii qofna qalad ma leh. Xirmada RHF + Zod waxay aad ugu fiican tahay waxa loogu talagalay. Arrintu waa in aan u isticmaalno ka gudubno meesha ay wax-soo-saarkeedu ku habboon yihiin dhibaatada sababtoo ah beddelka ayaa u baahan hab ka duwan oo looga fikiro foomamka gebi ahaanba. Maqaalkani waxa uu ku saabsan yahay beddelkaas. Si tan loo muujiyo, waxaanu dhisi doonaa isla foomkii talaabooyin badan oo isku mid ah laba jeer:
Foomka React Hook + Zod ayaa la xidhay si uu uga falceliyo weydiinta soo gudbinta, Iyada oo la adeegsanayo SurveyJS, kaas oo ula dhaqmaya foomka xog ahaan - qorshe JSON oo fudud - halkii uu ka ahaan lahaa geed ka kooban.
Shuruudo isku mid ah, caqli shuruudaysan, isla wacitaanka API dhamaadka. Kadibna waxaanu si sax ah u qaabayn doonaa waxa dhaqaaqay iyo waxa hadhay, waxaanan dejin doonaa hab wax ku ool ah oo lagu go'aamiyo moodeelka ay tahay inaad isticmaasho, iyo goorta. Foomka aan dhisayno:
Foomkan wuxuu isticmaali doonaa socodka 4-talaabo: Tallaabada 1: Faahfaahin
Magaca koowaad (loo baahan yahay), iimaylka (loo baahan yahay, qaab sax ah).
Tallaabada 2: Dalbo
Qiimaha cutubka, Tirada, Heerka canshuurta, Ka soo jeeda: Wadarta guud, Canshuur, Wadarta
Tallaabada 3: Xisaab & Jawaab celin
Xisaab ma leedahay? (Haa/Maya) Haddii Haa → username + password, labadaba loo baahan yahay. Haddii Maya → iimaylka mar hore la ururiyay tallaabada 1.
Qiimaynta qanacsanaanta (1-5) Haddii ≥ 4 → weydii "Maxaad jeclayd?" Haddii ≤ 2 → weydii "Maxaan hagaajin karnaa?"
Tallaabada 4: Dib u eegis
Kaliya ayaa soo muuqda haddii wadarta guud >= 100 Soo gudbinta kama dambaysta ah.
Tani maaha mid xad dhaaf ah. Laakiin waa ku filan inaad soo bandhigto kala duwanaanshaha dhismaha. Qaybta 1: Qayb-Waday (Foomka Hook React + Zod) Rakibaadda npm rakib react-hook-form zod @hookform/resolvers @tanstack/react-query
Zod Schema Aan ku bilowno schema Zod, sababtoo ah inta badan waa meesha qaabka qaabka loo sameeyo. Labada tillaabo ee hore - faahfaahinta shakhsiyeed iyo dalbashada soo-gelinta - wax walbaa waa toosan yihiin: xargaha loo baahan yahay, tirooyinka leh ugu yar, iyo tiro. Qaybta xiisaha lihi waxay bilaabataa markaad isku daydo inaad muujiso xeerarka shuruudda ah.
ka soo daji {z} "zod";
dhoofinta const formSchema = z.object ({magaca kowaad: z.string().min(1, "loo baahan yahay"), iimaylka: z.string().email("email aan sax ahayn"),qiimaha:z.number().min(0), tirada: z.number().min(1), cashuurta: z.number(), waxa uu leeyahayAccount: z.enum ([") string ctx.addIssue ({ code: "caado", waddo: ["username"], fariin: "loo baahan yahay"}); } haddii (! data.password || data.password.length <6) {ctx.addIssue
haddii (data.satisfaction>= 4 && !data.positiveFeedback) {ctx.addIssue ({ code: "custom", dariiqa: ["positiveFeedback"], fariin: "Fadlan wadaag waxa aad jeceshay"}); }
haddii (data.satisfaction <= 2 && !data.improvementFeedback) {ctx.addIssue({ code: "custom", path:["improvementFeedback"], fariin: "Fadlan noo sheeg waxa la hagaajinayo"}); }});
nooca dhoofinta FormData = z.infer
U fiirso in magaca isticmaalaha iyo erayga sirta ah loo qoray si ikhtiyaari ah () in kasta oo shuruud ahaan looga baahan yahay sababtoo ah qaabka nooca Zod wuxuu qeexayaa qaabka shayga, ma aha xeerarka xukuma marka beeruhu muhiim yihiin. Shuruudaha shuruudu waa inay ku noolaadaan gudaha superRefine, kaas oo socda ka dib marka qaabka la ansaxiyo oo uu galo shayga buuxa. Kala soocidaasi ceeb maaha; waa waxa kaliya ee aaladda loogu talagalay: superRefine waa meesha macquulka-goob-goobeedka marka aan lagu sheegi karin qaab-dhismeedka schema laftiisa. Waxa sidoo kale xusid mudan halkan waa waxa aanu qorshahani muujinayn. Ma laha fikrad bogag ah, ma jirto fikrad ah meelaha laga arki karo meesha, iyo fikradda navigation ma laha. Waxaas oo dhan waxay ku noolaan doonaan meel kale. Qaybta Foomka
ka soo dejinta {useForm, useWatch} ka "react-hook-form"; ka soo daji {zodResolver} ka "@hookform/resolvers/zod";import {useMutation } from "@tanstack/react-query";import {useState, useMemo } ka "react"/ka soo dejinta; FormSchema, nooca
const STEPS = ["faahfaahin", "dalabka", "account", "dib u eegis"];
nooca OrderPayload = FormData & {-hoosaadka: nambar; canshuurta: tirada; wadarta: nambar};
shaqada dhoofinta RHFMultiStepForm () {const [tallaabo, setStep] = useState (0);
isbeddelka is-beddelka = isticmaalka isbeddelka ({ mutationFn: async (lacag-bixin: OrderPayload) => { const res = sug soo doonan("/api/orders", { habka: "POST", madax-madaxeed: {"Content-Nooca": "application/json" }, jirka: JSON.stringify(load), } haddii (!res.ok) tuuro Khalad cusub ("Ku guuldareystay in la gudbiyo"); soo celi res.json (); }, }
const {diwaangeli, control, handleSubmit, formState: { khaladaad},} = useForm
soo celi (
);}Eeg Sahanka Qalinka JS-03-RHF [forked] by sixthextinction. Waxaa jira wax badan oo halkan ka dhacaya, waxaana habboon in la yareeyo si loo ogaado halka ay wax ku dambeeyaan.
Qiimaha la soo saaray - wadarta guud, canshuurta, wadarta - waxaa lagu xisaabiyaa qaybta iyadoo la adeegsanayo Watch and useMemo sababtoo ah waxay ku xiran yihiin qiyamka goobta nool mana jirto meel kale oo dabiici ah iyaga. Xeerarka muuqaalka ee magaca isticmaalaha, erayga sirta ah, jawaab celinta togan, iyo hagaajinta Jawaab celinta waxay ku nool yihiin JSX iyagoo shuruudo khadka ah ku jira. Caqliga-ka-boodista-bogga dib u eegista ayaa soo baxaya kaliya marka wadarta>= 100 - lagu dhex daro doorsoomiyaha bandhigga iyo xaaladda dhiibista ee tallaabada 3. Navigation lafteedu waa kaliya miiska isticmaalka Gobolka oo aanu gacanta ku kordhinayno. Ka falcelinta weydiinta waxay qabataa isku dayada, kaydinta, iyo burinta Foomku waxa kaliya oo uu wacaa mutation.mutate oo wata xog la ansaxiyay.
Midkoodna ma khaldana, halkii se. Kani wali waa falcelin sarbeeb ah, qaybtuna aad ayay u fiican tahay iyada oo ay ugu wacan tahay sida ay RHF u go'doomiso dib-u-celinta. Laakin haddii aad tan u dhiibto qof aan qorin oo aad weydiiso inuu sharaxo shuruudaha bogga dib u eegista u soo baxayo, waa inay raad raacaan showSubmit, tallaabada 3 xaalka bixinta, iyo macquulka badhanka nav - saddex meelood oo kala duwan - si dib loogu dhiso xeer lagu sheegay hal sadar. Foomku wuu shaqeeyaa, haa, laakiin habdhaqanku runtii maaha mid la baari karo nidaam ahaan. Waa in maskax ahaan loo fuliyo. Waxaa ka sii muhiimsan, beddelidda waxay u baahan tahay ka-qeybgalka injineernimada. Xitaa tweak yar, sida hagaajinta marka tallaabada dib u eegistu ay muuqato, waxay la macno tahay tafatirka qaybta, cusboonaysiinta ansaxinta, furitaanka codsiga jiidista, sugitaanka dib u eegista, iyo dib u dejinta mar kale. Qaybta 2: Qorshaha-Driven (SurveyJS) Hadda aynu dhisno isla socodka iyada oo la adeegsanayo schema. Rakibaadda npm rakib sahanka-core sahanka-react-ui @tanstack/react-query
sahanka-core Matoorka runtime madax-bannaan ee madal-Shatiga MIT ka haysta kaas oo awood u siinaya qaabka SurveyJS - qaybta aanu dan ka leenahay halkan. Waxay qaadanaysaa schema JSON, waxay ka dhistaa qaab gudaha ah, waxayna maamushaa wax kasta oo haddii kale ku noolaan lahaa qaybtaada falcelinta: qiimaynta tibaaxaha muuqaalka, xisaabinta qiyamka la soo saaray, maaraynta gobolka bogga, xaqiijinta dabagalka, iyo go'aaminta waxa "dhamaystiran" macnaheedu yahay in la bixiyay bogag dhab ahaantii la muujiyay.
Survey-react-uiThe UI/lakabka samaynta ee isku xidha moodelkaas si uu uga falceliyo. Asal ahaan waa
Si wada jir ah, waxay ku siinayaan runtime foom oo bogag badan leh oo si buuxda u shaqaynaysa iyada oo aan la qorin hal xariiq oo socodka xakamaynta. Qaabka schema laftiisu waa, sidii hore loo yidhi, JSON oo kaliya - ma jiro DSL ama wax kasta oo gaar ah. Waad dhex gelin kartaa, ka soo dejin kartaa faylka, ka soo qaadan kartaa API, ama waxaad ku kaydin kartaa tiirka xogta oo aad fuuqbixiso wakhtiga runtime. Isla Foomka, Sida Xogta Waa kan isla foomkii, markan waxaa lagu muujiyey shay JSON ah. Nidaamku wuxuu qeexayaa wax walba: qaab dhismeedka, ansaxinta, sharciyada muuqaalka, xisaabinta la soo saaray, bogga navigation - oo u dhiiba Model qiimeeya wakhtiga runtime. Waa kuwan sida ay taasi u ekaanayso buuxa:
dhoofinta const surveySchema = {ciwaanka: "Order Flow", showProgressBar: "sare", boggaga: [ {name: "details", element: [ { type: "text", name: "firstName", isRequired: true }, {nooca: "text", name: "email", inputType: "email", isRequired: "trust: "invalators": [{} email. ]}, {magaca: "dalabka", cunsurrada: [ {nooca: "text", magaca: "qiimaha", inputType: "lambar", defaultValue: 0}, {nooca: "text", magaca: "tiro", inputType: "lambar", defaultValue: 1 }, {nooca: "Dropdown",magaca: "TaxRate", defaultValue: 0.1, doorashada: [ {qiimaha: 0.05, qoraalka: "5%"}, {qiimaha: 0.1, text: "10%"}, {qiimaha: 0.15, text:"15%"} ] }, {nooca:"muujinta", magaca: "subtotal}, {price:" "Expression", magac: "canshuur", tibaax: "{subtotal} {cashuurta}"}, {nooca: "muujinta", magaca: "wadarta", odhaah: "{subtotal} + {canshuurta}" } ] }, {name: "account", curiyayaasha: "username", arkinIf: "{hasAccount} = 'Haa'", waa loo baahan yahay: run }, {nooca: "text", name: "password", inputType: "password", visualIf: "{hasAccount} = 'Haa'", isRequired: run, validators: [{ type: "text", minLength: " type 6}] text" magaca: "qanacsanaanta", rateMin: 1, rateMax: 5 }, {nooca: "comment", magac: "positiveFeedback", la arki karoIf: "{ku qanacsanaanta} >= 4" }, {nooca: "faallooyinka", magaca: "horumarin Feedback", la arki karo Haddii: "{ku qanacsanaanta} <= 2" }} ]}, 100", curiyayaasha: []} ]};
Is barbar dhig tan nooca RHF in yar.
Balooggii superRefine ee shardi ahaan looga baahnaa isticmaaleha iyo erayga sirta ah waa la waayay. muuqataIf: "{hasAccount} = 'Haa'" oo lagu daray isRequired: runtu waxay si wadajir ah u xalliyaan labada walaac, gudaha garoonka laftiisa, halkaas oo aad filayso inaad ka hesho. AdeegsigaWatch + Isticmaalka Silsiladda Memo ee la xisaabiyay wadarta guud, cashuurta, iyo wadarta waxa lagu bedelay saddex goobood oo tibaaxo midba midka kale u tixraacayo magac ahaan. Xaaladda bogga dib u eegista, kaas oo ku jira nooca RHF dib loo dhisi karo oo kaliya iyadoo la raadinayo showSubmit, tallaabada 3 waxay soo saartaa laanta. Ugu dambeyntiina, macquulka badhanka nav waa hal la arki karoIf hantida bogga shayga.
Isla caqli-gal ayaa jira. Kaliya waa in shaxdu ay siiso meel ay ku noolaato halkaas oo ay ka muuqato go'doon, halkii ay ku faafi lahayd qaybta. Sidoo kale, ogow in shaxdu isticmaasho nooca: 'muujinta' wadarta guud, cashuurta, iyo wadarta. Odhaahda waa akhris-kaliya waxaana inta badan loo isticmaalaa in lagu muujiyo qiyamka la xisaabiyay. SurveyJS sidoo kale waxay taageertaa nooca: 'html' ee nuxurka taagan, laakiin qiimayaasha la xisaabiyay, muujintu waa doorashada saxda ah. Hadda dhanka falcelinta. Bixinta iyo Gudbinta Aad u fudud. Siligu u Buuxi API-gaaga si la mid ah - adoo isticmaalaya Mutation ama keenid cad:
soo dejinta {useState, useEffect, useRef} ka "react"; ka soo daji { useMutation } "@tanstack/react-query";import {Model } from "survey-core"; Import { Survey } from "survey-react-ui"; ka soo daji "sahaminta-core/survey-core".
shaqada dhoofinta SurveyForm () {const [model] = useState (() => Qaabka cusub (surveySchema));
isbeddelka is-beddelka = isticmaalka isbeddelka ({ mutationFn: async (data) => { const res = sug soo doonan("/api/orders", { habka: "POST", madax-madaxeed: {"Content-Nooca": "application/json" }, jirka: JSON.stringify(xogta), } haddii (!res.ok) tuuro Khalad cusub ("Ku guuldareystay in la gudbiyo"); soo celi res.json (); }, }
const mutationRef = isticmaalRef (isbeddel); mutationRef.current = isbedel; useEffect (() => {const hander = (dire) => mutationRef.current.mutate(sender.data); model.onComplete.add(handle); celi () => model.onComplete.saar ( gacan-haye); }, [model]); // ref waxay ka fogaataa dib u diwaan galinta maamulaha waxqabad kasta (isbeddelka aqoonsiga shayga ayaa isbedela)
soo noqo (
<>
Eeg Sahanka QalinkaJS-03-SurveyJS [forked] by sixthextinction.
on Dhamaystir dabka marka isticmaaluhu gaadho dhamaadka bogga muuqda ee u dambeeya. Markaa haddii wadarta guud aysan dhaafin 100 oo bogga dib u eegista la boodo, wali si sax ah ayay u shidan tahay sababtoo ah SurveyJS waxay qiimeeyaan aragtida ka hor inta aysan go'aansan micnaha "bogga u dambeeya" Dabadeed, sender.data waxa ay ka kooban tahay dhammaan jawaabaha oo ay la socdaan qiyamka la xisaabiyay (isku-darka, cashuurta, wadarta) sida qaybaha fasalka koowaad, markaa culayska API-ga waxa uu la mid yahay waxa nooca RHF uu gacanta ugu soo ururiyay soo gudbinta. Theqaabka mutationRef waa isla midka aad gaari lahayd meel kasta oo aad uga baahan tahay maamule dhacdada deggan qiimaha wax ka beddelaya wax kasta - ma jiro SurveyJS-gaar ah oo ku saabsan.
Qaybta React hadda kuma jiraan wax macquul ah oo ganacsi gabi ahaanba. Ma jiro adeegsi-Watch, ma jiro JSX shuruudaysan, ma jiro jaranjaro jaranjaro ah, ma jiro silsilad adeegsadeMemo, ma jiro superRefine. React waa samaynta waxa ay dhab ahaantii ku fiican tahay: samaynta qayb iyo ku xidhid wicitaanka API. Maxaa ka baxay falcelinta?
Walaac Xirmada RHF SurveyJS Muuqashada laamaha JSX muuqda Hadday Qiimaha laga soo qaatay IsticmaalWatch/isticmaalMemo muujin Xeerarka isdhaafsiga superRefine Shuruudaha qorshaha Navigation gobolka tallaabo Bogga muuqda Haddii Goobta sharciga Loo qaybiyay dhammaan faylasha Dhexdhexaadiyay schema
Waxa ku sii jira React waa qaabaynta, qaabaynta, xargaha gudbinta, iyo is dhexgalka abka, taas oo ah in la yidhaahdo, waxyaalaha React ayaa dhab ahaantii loogu talagalay. Wax kasta oo kale ayaa loo soo guuray schema, sababtoo ah naqshaddu waa shay JSON oo keliya, waxaa lagu kaydin karaa kaydka xogta, si madax bannaan oo code-ka codsigaaga loo daabaco, ama lagu tafatiro iyada oo loo marayo qalab gudaha ah iyada oo aan loo baahnayn in la geeyo. Maareeyaha badeecada u baahan inuu beddelo marinka kicinaya bogga dib u eegista ayaa samayn kara taas isagoon taaban qaybta. Taasi waa kala duwanaansho hawleed macno leh oo kooxaha halkaas oo habdhaqanka qaabku uu si joogto ah u kobco oo aanay had iyo jeer ahayn kuwa ay wadaan injineerada. Goorma La Isticmaalayo Hab Kasta? Halkan waxaa ah xeer wanaagsan oo suulka ah oo aniga ii shaqeeya: ka fikir inaad tirtirto gabi ahaanba foomka. Maxaad waayi lahayd?
Haddii ay tahay shaashado, waxaad doonaysaa foomamka ka kooban qaybaha. Haddii ay tahay caqli-gal ganacsi, sida marinnada, xeerarka qaybinta, iyo shuruudaha shuruuda ee qeexaya go'aamada dhabta ah, waxaad rabtaa mashiinka schema.
Sidoo kale, haddii isbeddelada ku soo socda ay inta badan ku saabsan yihiin calaamadaha, goobaha, iyo qaabka, RHF waxay kuugu adeegi doontaa si fiican. Haddii ay ku saabsan yihiin shuruudaha, natiijooyinka, iyo xeerarka ay ops ama kooxdaada sharci u baahan karaan inay hagaajiyaan galabnimada Talaadada iyaga oo aan xareynin tigidh, qaabka schema ee SurveyJS ayaa ah midka ugu daacadsan. Labadan hab run ahaantii maaha kuwo tartan dhexdooda ah. Waxay wax ka qabtaan noocyo kala duwan oo dhibaatooyin ah, iyo qaladka mudan in laga fogaado waa isbarbardhigga miisaanka miisaanka macquulka - daaweynta nidaamka qaanuunka sida qayb sababtoo ah taasi waa qalabka la yaqaan, ama gaaritaanka mashiinka siyaasadda sababtoo ah foom wuxuu koray saddex tallaabo wuxuuna helay goob shuruud ah. Foomka aan ku dhisnay halkan wuxuu u fadhiyaa meel u dhow xadka si ula kac ah, oo adag oo ku filan si loo soo bandhigo farqiga laakiin maaha mid aad u xun oo isbarbardhigga dareemayo qallafsanaan. Inta badan foomamka dhabta ah ee aan ku shaqaynayn codebase-kaaga waxay u dhowdahay inay fadhiyaan isla xadkaas, su'aashuna waxay badanaa tahay kaliya haddii qof uu magacaabay waxay dhab ahaantii yihiin. Isticmaal Foomka Hook React + Zod marka:
Foomamku waa CRUD-oriented; Macquulku waa mid qoto dheer oo UI-gudbinaya; Injineerada ayaa leh dabeecad kasta; Dhabarku waa isha runta.
Isticmaal SurveyJS marka:
Foomamka waxay qeexayaan go'aamada ganacsiga; Xeerarku waxay u koraan si ka madax bannaan UI; Macquulku waa inuu ahaadaa mid muuqda, la xisaabin karo, ama la daabacay; Injineerada aan ahayn waxay saameeyaan dhaqanka; Qaab isku mid ah waa inuu ka gudbaa geeso badan oo hore.