Ko e fakamatala ko 'eni ko ha poupou 'e he SurveyJS . ‘Oku ‘i ai ha sipinga faka’atamai ‘oku vahevahe ‘e he tokolahi taha ‘o e kau developers ‘o e React ‘o ‘ikai ke nau teitei alea’i le’olahi ia. Ko e ngaahi fotunga ko ia 'oku totonu ma'u pe ke hoko ko e ngaahi konga. 'Oku 'uhinga 'eni ki ha stack hange ko e:

React Hook Foomu ki he pule'anga fakalotofonua (si'isi'i taha 'o e toe fakahoko, lesisita 'o e mala'e ergonomic, fetu'utaki 'oku fie ma'u). Zod ki he fakamo'oni (totonu 'o e input, fakamo'oni'i 'o e ngata'anga, fa'ahinga-malu parsing). Tali Fehu'i ki he backend: fakahu, toe feinga, caching, sync 'o e seva, mo e me'a pehe.

Pea ki he konga lahi 'o e ngaahi foomu — ho'o ngaahi screens login, ho'o ngaahi peesi settings, ho'o modals CRUD — 'oku ngaue lelei mo'oni 'eni. 'Oku fai 'e he konga takitaha 'ene ngaue, 'oku nau fa'u ma'a, pea 'e lava ke ke hoko atu ki he ngaahi konga 'o ho'o tohi kole 'oku ne fakafaikehekehe'i mo'oni ho'o koloa. Ka 'i he taimi kotoa pe, 'oku kamata ke tanaki 'e ha foomu 'a e ngaahi me'a hange ko e ngaahi tu'utu'uni 'o e visibility 'oku fakafalala ki he ngaahi tali kimu'a, pe ngaahi mahu'inga 'oku ma'u mei ai 'oku cascade 'i he ngaahi mala'e 'e tolu. Mahalo na'a mo e ngaahi peesi kakato 'oku totonu ke fakalaka pe fakahaa'i 'o makatu'unga 'i ha fakakatoa 'oku lele. 'Oku ke tokanga'i 'a e 'uluaki conditional 'aki ha useWatch mo ha va'a 'i he laine, 'a ia 'oku sai pe. Pea ko e taha. Pea ‘oku ke a’u atu ki he superRefine ke encode ‘a e ngaahi tu’utu’uni kolosi-mala’e ‘oku ‘ikai lava ke fakahaa’i ‘e ho’o Zod schema ‘i he founga angamaheni. Pea, kamata ke leaking 'a e folau 'eve'eva sitepu 'a e logic pisinisi. ‘I ha taimi, ‘oku ke vakai ki he me’a kuo ke langa pea ke ‘ilo’i ‘oku ‘ikai ke toe UI mo’oni ‘a e foomu. ‘Oku lahi ange ia ‘i ha founga tu’utu’uni, pea ko e ‘akau ‘o e konga ko e feitu’u pe ia na’e hoko ai ke ke tanaki ia. Ko e feitu’u ‘eni ‘oku ou fakakaukau ‘oku movete ai ‘a e sipinga faka’atamai ki he ngaahi foomu ‘i he React, pea ‘oku ‘ikai mo’oni ha hala ‘a ha taha. 'Oku lelei 'aupito 'a e RHF + Zod stack 'i he me'a na'e fa'u ki ai. Ko e issue ko 'etau hehema ke kei faka'aonga'i ia 'o fakalaka 'i he tu'unga 'oku fe'unga ai hono ngaahi abstractions mo e palopalema koe'uhi 'oku fie ma'u 'e he alternative ha founga kehe 'o e fakakaukau ki he ngaahi fotunga 'o faka'aufuli. Ko e kupu ko ení ‘oku fekau‘aki ia mo e founga kehe ko iá. Ke fakahaa’i ‘eni, te tau langa ‘a e foomu sitepu lahi tatau tofu pe tu’o ua:

Mo e Foomu Hook 'o e React + Zod uaea ki he Fehu'i 'o e React ki hono fakahu, 'I he SurveyJS, 'a ia 'oku ne tokanga'i ha foomu ko e fakamatala — ko ha schema JSON faingofua — kae 'ikai ko ha 'akau 'o e konga.

Ngaahi fie ma'u tatau, logic conditional tatau, ui API tatau 'i he ngata'anga. Pea te mau mape’i tonu ‘a e me’a na’e hiki mo e me’a na’e nofo, pea fokotu’u ha founga ‘aonga ke fakapapau’i pe ko e fē ‘a e sipinga ‘oku totonu ke ke ngaue’aki, pea mo e taimi. Ko e foomu ‘oku mau langa:

'E ngaue'aki 'e he foomu ko 'eni ha tafe 'o e sitepu 'e 4: Sitepu 1: Fakaikiiki

Hingoa ʻuluakí (ʻoku fie maʻu), . 'Imeili (fiema'u, fotunga 'oku 'aonga).

Sitepu 2: ʻOta

Totongi 'iuniti, Lahi, Ko e totongi tukuhau, Maʻu mei ai: Fakakātoa siʻisiʻi, Tukuhau, Fakakātoa.

Sitepu 3: 'Akauni & Fakakaukau

‘Oku ‘i ai ha‘o ‘akauni? (ʻIo/ʻIkai) Kapau 'Io → hingoa faka'aonga'i + lea fufuu, 'oku fie ma'u fakatou'osi. Kapau 'Oku 'Ikai → 'imeili kuo 'osi tanaki 'i he sitepu 1.

Fakafuofua ʻo e fiemālié (1–5) Kapau ≥ 4 → fehuʻi “Ko e hā naʻá ke saiʻia aí?” Kapau ≤ 2 → fehuʻi “Ko e hā te tau lava ʻo fakaleleiʻí?”

Sitepu 4: Toe vakaiʻi .

'Oku toki 'asi mai kapau 'oku fakakatoa >= 100 . Fakahū fakaʻosi.

‘Oku ‘ikai ke fu‘u tōtu‘a ‘eni. Ka ‘oku fe’unga pe ia ke fakahaa’i ‘a e ngaahi kehekehe faka’aati. Konga 1: Konga-fakalele (Foomu Hook tali + Zod) Fokotuʻu npm fokotu'u 'a e tali-hook-foomu zod @hookfoomu/kau fakalelei'i @tanstack/tali-fehu'i

Zod Sikima Tau kamata ‘aki ‘a e Zod schema, he ko e feitu’u ia ia ‘oku fa’a fokotu’u ai ‘a e fotunga ‘o e foomu. Ki he 'uluaki sitepu 'e ua — ngaahi fakaikiiki fakafo'ituitui mo e ngaahi inputs 'o e 'ota — 'oku hangatonu 'a e me'a kotoa pe: fie ma'u 'a e ngaahi aho, ngaahi fika mo e minimums, mo ha enum. ʻOku kamata ʻa e konga mālié ʻi he taimi ʻokú ke feinga ai ke fakahaaʻi ʻa e ngaahi tuʻutuʻuni fakakonisitūtoné.

hū mai { z } mei he "zod";

'ave ki tu'apule'anga const formSchema = z.me'a ({'uluakihingoa: z.string().min(1, "Fiema'u"), 'imeili: z.string().'imeili("'Imeili 'oku 'ikai ke 'aonga"), totongi: z.fika().miniti(0), lahi: z.fika().miniti(1), tukuhau: z.rna (), 'oku 'ikai ha 'akauni(), 'oku 'ikai ha 'akauni(), 'oku 'ikai ha'ane: z. z.afo ().fili (), lea fufuu: z.aho ().fili (), fiemalie: z.fika ().min (1).max (5), leleiFeedback: z.afo ().fili (), fakalelei'i: z.lau ().fili (),} "s). kapau (! fakamatala.hingoa faka'aonga'i) {ctx.addIssue ({kouti: "angamaheni", hala: ["hingoa faka'aonga'i"], fekau: "Fiema'u" } } kapau (! fakamatala.lea fufuu || fakamatala.lea fufuu.loloa < 6) "ctx.addIssue ({kouti:] s", ngaahi mata'itohi" }); } }

kapau (data.fiemalie >= 4 && !data.fakakaukau lelei) { ctx.addIssue ({ code: "angamaheni", hala: ["fakakaukau lelei"], fekau: "Kataki 'o vahevahe 'a e me'a na'a ke sai'ia ai" }); }

kapau (data.fiemalie <= 2 && !data.fakalelei'iFeedback) {ctx.addIssue({kouti: "angamaheni", hala:["fakalelei'iFeedback"], fekau: "Kataki 'o talamai 'a e me'a ke fakalelei'i" }); }});

fa'ahinga 'o e foomuData = z.infer;

Fakatokanga’i ange ‘oku lomi’i ‘a e hingoa faka’aonga’i mo e lea fufuu ko e fili() neongo ‘oku nau fie ma’u fakakonisitutone koe’uhi ‘oku fakamatala’i ‘e he schema ‘o e levolo ‘o e fa’ahinga ‘a Zod ‘a e fotunga ‘o e me’a, ‘o ‘ikai ko e ngaahi tu’utu’uni ‘oku pule’i ‘a e taimi ‘oku mahu’inga ai ‘a e ngaahi mala’e. Ko e fie ma'u 'o e tu'unga kuo pau ke nofo 'i loto 'i he superRefine, 'a ia 'oku lele hili hono fakamo'oni'i 'o e fotunga pea 'oku 'i ai 'a e 'alunga ki he me'a kakato. Ko e mavahe ko iá ʻoku ʻikai ko ha mele; ko e me’a pe ia ‘oku fakataumu’a ki ai ‘a e me’angaue: superRefine ko e feitu’u ia ‘oku ‘alu ki ai ‘a e logic kolosi-mala’e ‘i he taimi ‘oku ‘ikai lava ke fakahaa’i ai ‘i he fokotu’utu’u ‘o e schema ‘iate ia pe. Ko e me’a foki ‘oku fakatokanga’i heni ko e me’a ‘oku ‘ikai ke fakahaa’i ‘e he schema ko ‘eni. ʻOku ʻikai haʻane fakakaukau ki he ngaahi peesí, ʻikai haʻane fakakaukau pe ko e fē ʻa e ngaahi malaʻe ʻoku ʻasi ʻi he poini fē, pea ʻikai haʻane fakakaukau ki he folau ʻeveʻevá. Ko e kotoa ‘o e me‘a ko iá ‘e mo‘ui ia ‘i ha feitu‘u kehe. Konga Foomu

'omi { faka'aonga'i 'a e Foomu, faka'aonga'i 'a eWatch } mei he "tali-hook-foomu"; 'omi { zodResolver } mei he "@ hookform/resolvers/zod"; 'omi { faka'aonga'iMutation } mei he "@ tanstack/tali-fehu'i"; 'omi { faka'aonga'i 'o eState, faka'aonga'i 'a eMemo } mei he "tali"; ma, fa'ahinga {S

const SITEPU = ["fakaikiiki", "'ota", "'akauni", "vakai'i"];

fa'ahinga 'OtaPayload = FoomuData & {fakakatoa si'isi'i: fika; tukuhau: fika; fakakatoa: fika };

ngaue 'o e 'ave ki tu'apule'anga RHFMultiSitepuFoomu () { const [sitepu, setiSitepu] = faka'aonga'i 'o eState (0);

const liliu = faka'aonga'i 'a e liliu ({ liliuFn: async (totongi: 'Ota totongi) => { const res = tatali ki he 'omi ("/ api/ngaahi tu'utu'uni", { founga: "POST", ngaahi 'ulu'i tohi: { "Kanokato-Fa'ahinga": "tohi kole/json" }, sino: JSON.fakahokohoko (kavenga totongi), }); kapau (!res.ok) lī fo'ou Hala("Na'e 'ikai lava ke fakahū atu"); fakafoki mai 'a e res.json (); }, });

const {lesisita, pule'i, to'oto'oSubmit, formState: { ngaahi fehalaaki }, } = faka'aonga'i 'a e Foomu ({ fakalelei'i: zodResolver (foomuSchema), defaultValues: {totongi: 0, lahi: 1, tukuhau: 0.1, fiemalie: 3, "}, 'oku 'i ai ha A); const totongi = faka'aonga'iWatch ({pule'i, hingoa: "totongi" }); const lahi = faka'aonga'i 'a eWatch ({pule'i, hingoa: "lahi" }); const tukuhau = faka'aonga'i 'a eWatch ({pule'i, hingoa: "tukuhau" }); const 'oku 'i ai 'a e 'Akauni = faka'aonga'i 'a eWatch ({pule'i, hingoa: "'oku 'i ai 'a e 'Akauni" }); const fiemalie = useWatch ({pule'i, hingoa: "fiemalie" }); const fakakatoa si'isi'i = faka'aonga'i 'a eMemo (() => (totongi ?? 0) * (lahi ?? 1), [totongi, lahi]); const tukuhau = faka'aonga'i 'a eMemo (() => fakakatoa si'isi'i * (tukuhau ?? 0), [fakakatoa si'isi'i, tukuhau]); const fakakatoa = faka'aonga'iMemo (() => fakakatoa si'isi'i + tukuhau, [fakakatoa si'isi'i, tukuhau]); const onSubmit = (fakamatala: FoomuFakamatala) => liliu.mutate ({ ... fakamatala, fakakatoa si'isi'i, tukuhau, fakakatoa }); const fakahaa'i 'a e Fakahu = (sitepu === 2 && fakakatoa < 100) || (sitepu === 3 && fakakatoa >= 100)

fakafoki ( {sitepu === 0 && ( <> )

{sitepu === 1 && ( <> s: mo'oni })} /> 5% 10% 15%

Fakakātoa: {fakakātoa}
Tukuhau: {tukuhau}
Fakakātoa: {fakakātoa}
)}

{sitepu === 2 && ( <> 'Io 'Ikai

{hasAccount === "'Io" && ( <> )}

{fiemalie >= 4 && (