Iyi ngingo yatewe inkunga na SurveyJS Hano hari icyitegererezo cyo mumutwe benshi bateza imbere reaction basangiye batigeze babiganiraho hejuru. Iyo miterere igomba guhora igomba kuba ibice. Ibi bivuze igipande nka:

Kora Ifishi ya Hook kuri leta yaho (re-renders ntoya, kwandikisha umurima wa ergonomic, imikoranire ya ngombwa). Zod yo kwemeza (kwinjiza neza, kwemeza imipaka, ubwoko-bwizewe). Reba Ikibazo cyinyuma: gutanga, gusubiramo, kubika, guhuza seriveri, nibindi.

Kandi kubwinshi bwinshi bwimiterere - kwinjira kwa ecran, urupapuro rwimiterere, uburyo bwa CRUD - ibi bikora neza. Igice cyose gikora akazi kacyo, gihimba neza, kandi urashobora kwimukira mubice bya porogaramu yawe itandukanya ibicuruzwa byawe. Ariko burigihe, burigihe, ifishi itangira kwegeranya ibintu nkamategeko agaragara ashingiye kubisubizo byabanje, cyangwa indangagaciro zikomoka kumasaka atatu. Ahari nimpapuro zose zigomba gusimbuka cyangwa kwerekanwa ukurikije igiteranyo cyuzuye. Ukemura ikibazo cya mbere hamwe nogukoresha Isaha hamwe nishami ryumurongo, nibyiza. Hanyuma undi. Noneho uragera kuri superRefine kugirango ushireho amategeko yambukiranya imipaka gahunda yawe ya Zod idashobora kwerekana muburyo busanzwe. Noneho, kugendana intambwe bitangira kumeneka mubucuruzi. Igihe kimwe, urareba ibyo wubatse ukamenya ko form itakiri UI rwose. Nibindi byinshi byo gufata ibyemezo, kandi igiti cyibigize niho wabaye kugirango ubibike. Aha niho nibaza ko moderi yo mumutwe kumiterere muri Reaction isenyuka, kandi mubyukuri ntamakosa yabantu. Ikibaho cya RHF + Zod nicyiza kubyo cyagenewe. Ikibazo nuko dukunda gukomeza kuyikoresha kera aho abstraction yayo ihuye nikibazo kuko ubundi busaba ubundi buryo bwo gutekereza kumiterere yose. Iyi ngingo ivuga kubyerekeye ubundi buryo. Kugirango twerekane ibi, tuzubaka form imwe imwe yintambwe ebyiri:

Hamwe na Reaction Hook Ifishi + Zod wired kugirango Ukore Ikibazo kugirango utange, Hamwe na SurveyJS, ifata ifishi nkamakuru - igishushanyo cyoroshye cya JSON - kuruta igiti cyibigize.

Ibisabwa bimwe, logique imwe isabwa, guhamagara API kumpera. Noneho tuzashushanya neza icyimutse nicyagumye, hanyuma dushyireho inzira ifatika yo guhitamo icyitegererezo ugomba gukoresha, nigihe. Ifishi twubaka:

Iyi fomu izakoresha intambwe 4: Intambwe ya 1: Ibisobanuro

Izina rya mbere (risabwa), Imeri (bisabwa, imiterere yemewe).

Intambwe ya 2: Tegeka

Igiciro cyibice, Umubare, Igipimo cy'umusoro, Inkomoko: Subtotal, Umusoro, Igiteranyo.

Intambwe ya 3: Konti & Ibitekerezo

Ufite konti? (Yego / Oya) Niba Yego → ukoresha izina ryibanga + ijambo ryibanga, byombi bisabwa. Niba Oya → imeri yamaze gukusanywa mu ntambwe ya 1.

Igipimo cyo kunyurwa (1-5) Niba ≥ 4 → baza “Wakunze iki?” Niba ≤ 2 → baza “Niki dushobora kunonosora?”

Intambwe ya 4: Isubiramo

Gusa biragaragara niba byose> = 100 Kwiyemeza bwa nyuma.

Ibi ntibikabije. Ariko birahagije kwerekana itandukaniro ryubwubatsi. Igice cya 1: Ibikoresho-Bitwarwa (Reba Ifishi Ifata + Zod) Kwinjiza npm shyiramo reaction-hook-form zod @ hookform / abakemura @ tanstack / reaction-ikibazo

Igishushanyo cya Zod Reka duhere kuri Zod schema, kuko mubisanzwe aho niho imiterere yimiterere iba. Kubyiciro bibiri byambere - amakuru yihariye no gutondekanya ibyinjira - byose birigororotse: imirongo isabwa, imibare ifite byibuze, na enum. Igice gishimishije gitangira iyo ugerageje kwerekana amategeko asabwa.

gutumiza {z} muri "zod";

Ifishi yo kohereza hanzeSchema = z.ibintu ({Izina ryambere: z.string (). min (1, "Ibisabwa"), imeri: z.string (). imeri ("imeri itemewe"), igiciro: z.umubare (). min (0), ingano: z.umubare (). min (1), umusoroRate: z.umubare:) z. (! data.username) {ctx.addIsue ({code: "gakondo", inzira:

niba (data. kunyurwa> = 4 &&! data.positiveFeedback) {ctx.addIsue ({code: "gakondo", inzira: ["Ibitekerezo byiza"], ubutumwa: "Nyamuneka sangira ibyo ukunda"}); }

niba (data. kunyurwa <= 2 &&! data.impinduka zisubizwa) {ctx.addIkibazo ({code: "gakondo", inzira:["Gutezimbere Ibisubizo"], ubutumwa: "Nyamuneka tubwire icyo tugomba kunoza"}); }});

Ubwoko bwo kohereza hanze FormData = z.infer ;

Menya ko izina ryukoresha nijambo ryibanga byanditse nkubushake () nubwo bisabwa muburyo buteganijwe kuko ubwoko bwa Zod-urwego rwimiterere isobanura imiterere yikintu, ntabwo amategeko agenga iyo imirima ifite akamaro. Ibisabwa bisabwa bigomba kuba imbere muri superRefine, ikora nyuma yimiterere yemewe kandi ifite uburenganzira kubintu byose. Ukwo gutandukana ntabwo ari inenge; nibyo gusa igikoresho cyagenewe: superRefine niho logique yambukiranya imipaka igenda iyo idashobora kugaragarira muburyo bwimigambi ubwayo. Ikigaragara kandi hano nicyo iyi gahunda itagaragaza. Ntabwo ifite igitekerezo cyimpapuro, nta gitekerezo cyimirima igaragara aho bigeze, kandi nta gitekerezo cyo kugenda. Ibyo byose bizatura ahandi. Ibigize

gutumiza {gukoreshaForm, koreshaWatch} kuva "reaction-hook-form"; gutumiza {zodResolver} kuva "@ hookform / resolvers / zod"; gutumiza {gukoreshaMutation} kuva "@ tanstack / react-query";

const INTAMBWE = ["ibisobanuro", "gahunda", "konte", "gusubiramo"];

andika OrderPayload = FormData & {subtotal: umubare; umusoro: umubare; yose: umubare};

ibikorwa byo kohereza hanze RHFMultiStepForm () {const [intambwe, setStep] = gukoreshaState (0);

ihinduka rya mutation = gukoreshaMutation ({ mutationFn: async (kwishura: GutumizaPayload) => { const res = gutegereza kuzana ("/ api / amabwiriza", { buryo: "POST", imitwe: {"Ibirimo-Ubwoko": "gusaba / json"}, umubiri: JSON.hindura (kwishura), }); niba (! res.ok) guta Ikosa rishya ("Kunanirwa gutanga"); garuka res.json (); }, });

const. igiciro = gukoresha Reba ({kugenzura, izina: "igiciro"}); ubwinshi = gukoresha Reba ({kugenzura, izina: "ubwinshi"}); const taxRate = koresha Isaha ({kugenzura, izina: "umusoroRate"}); const ifiteAcount = gukoreshaWatch ({kugenzura, izina: "hasAccount"}); const kunyurwa = gukoresha Reba ({kugenzura, izina: "kunyurwa"}); const subtotal = gukoreshaMemo (() => (igiciro ?? 0) * (ubwinshi ?? 1), [igiciro, ubwinshi]); umusoro wa const = gukoreshaMemo (() => subtotal * (umusoroRate ?? 0), [subtotal, umusoroRate]); const total = gukoreshaMemo (() => subtotal + umusoro, [subtotal, umusoro]); const onSubmit = (data: FormData) => mutation.mutate ({... data, subtotal, umusoro, yose}); const showShereza = (intambwe === 2 && yose <100) || (intambwe === 3 && yose> = 100)

garuka (

intambwe === 1 && (<> agaciro = "0.1"> 10% 15%

Subtotal: {subtotal}
Umusoro: {umusoro}
Igiteranyo: {byose}
)}

{intambwe === 2 && (<> Yego

{hasAcount === "Yego" && (<>

{kunyurwa> = 4 && (