He mea tautoko tenei tuhinga e SurveyJS He tauira hinengaro te nuinga o nga kaiwhakawhanake React e tohatoha ana me te kore korero nui. Ko nga puka e kiia ana he waahanga tonu. Ko te tikanga tenei he puranga penei:

Puka Matau Whakahohe mo te kawanatanga o te rohe (he iti te whakahoki ano, te rehitatanga mara ergonomic, te taunekeneke nui). Zod mo te whakamanatanga (tikanga whakauru, whakamana rohenga, momo-haumaru porotiti). Uiui Tauhohenga mo te tuara: te tuku, te ngana ano, te keteroki, te tukutahi tūmau, me era atu.

A mo te nuinga o nga puka - o mata takiuru, o wharangi tautuhinga, o CRUD modals - he pai te mahi. Ko ia waahanga ka mahi, ka tito ma, ka taea e koe te neke ki nga waahanga o to tono e tino rerekee ana i to hua. Engari i ia wa, ka timata te ahua ki te whakaemi i nga mea penei i nga ture tirohanga e whakawhirinaki ana ki nga whakautu o mua, ki nga uara i ahu mai i nga waahi e toru. Akene ko nga wharangi katoa ka pekehia, ka whakaatuhia ranei i runga i te tapeke e rere ana. Ka mau koe i te herenga tuatahi ma te whakamahiWatch me te peka raina, he pai. Katahi tetahi atu. Na kei te toro atu koe ki te superRefine ki te whakawaehere i nga ture-a-marae kaore e taea e to kaupapa Zod te whakaatu i te tikanga. Na, ka timata te whakatere hikoi ki te tuku i te arorau pakihi. I etahi wa, ka titiro koe ki nga mea i hangaia e koe ka mohio ko te puka ehara i te mea tino UI. He mahi whakatau, a ko te rakau waahanga kei te waahi tonu koe ki te penapena. Koinei taku whakaaro ka pakaru te tauira hinengaro mo nga puka i roto i te React, karekau he he. He tino pai te taapu RHF + Zod ki te mea i hangaia mo. Ko te take ko te kaha ki te whakamahi i mua i te waahi e rite ana ana tangohanga ki te raru na te mea he rereke te whakaaro mo nga puka. Ko tenei tuhinga mo tera rereke. Hei whakaatu i tenei, ka hangahia e matou te ahua o nga waahanga-maha kia rua:

Me te Puka Matau React + Zod kua waeahia ki te Uiui Whakahohe mo te tukunga, Ma te SurveyJS, e tohu ana i tetahi puka hei raraunga - he kaupapa JSON ngawari - kaua ki te rakau waahanga.

He rite ano nga whakaritenga, he rite te arorau here, he karanga API ano i te mutunga. Na ka mapi tonu tatou i nga mea i neke me nga mea i noho, me te whakatakoto i tetahi huarahi whaitake hei whakatau ko tehea tauira ka whakamahia e koe, me ahea. Ko te ahua e hanga ana e matou:

Ka whakamahia e tenei puka he rerenga 4-taahiraa: Hipanga 1: Taipitopito

Ingoa tuatahi (hiahiatia), Īmēra (e hiahiatia ana, hōputu whaimana).

Hipanga 2: Whakaritea

Utu wae, Rahi, Te utu taake, I ahu mai: Tapekeroto, Taake, Tapeke.

Hipanga 3: Pūkete & Urupare

He kaute kei a koe? (Ae/Kao) Mena Ae → ingoa kaiwhakamahi + kupuhipa, me hiahia nga mea e rua. Ki te Kao → kua kohia te imeera i te taahiraa 1.

Whakatauranga pai (1–5) Mena ≥ 4 → patai “He aha taau i pai ai?” Mēnā ≤ 2 → pātaihia “He aha tā mātou e pai ake ai?”

Hipanga 4: Arotake

Ka puta anake mena ka tapeke >= 100 Te tukunga whakamutunga.

Ehara tenei i te tino taikaha. Engari he nui ki te whakaatu i nga rereketanga o te hoahoanga. Wāhanga 1: Waahanga-Taia (React Hook Form + Zod) Tāutatanga npm tāuta react-hook-form zod @hookform/resolvers @tanstack/react-query

Kaupapa Zod Me timata tatou ki te kaupapa Zod, na te mea ko te tikanga ka tuu te ahua o te ahua. Mo nga hikoinga tuatahi e rua - nga taipitopito whaiaro me nga whakauru whakauru - he maamaa nga mea katoa: nga aho e hiahiatia ana, nga nama me te iti, me te enum. Ka timata te wahanga whakamere i te wa e ngana ana koe ki te whakapuaki i nga ture herenga.

kawemai {z} mai i "zod";

export const formSchema = z.object({ Ingoa tuatahi: z.string().min(1, "E hiahiatia ana"), email: z.string().email("Imera muhu"), utu: z.number().min(0), rahinga: z.number().min(1), TaakeRate: z.number(), hasAccount: z.enum" kupuhipa: z.string().kōwhiringa(), pai: z.number().min(1).max(5), positiveFeedback: z.string().optional(), improvementFeedback: z.string().kōwhiringa(),}).superRefine((data, ctx) => { if (data.hasAccount === "Ae") { if (!ctsuxusername) { dd ["ingoa kaiwhakamahi"], karere: "E hiahiatia ana" }); } if (!data.password || data.password.length <6) {ctx.addIssue({code: "rite", ara: ["kupuhipa"], karere: "Min 6 characters" } }

ki te (data.satisfaction >= 4 && !data.positiveFeedback) {ctx.addIssue({waehere: "ritenga", ara: ["positiveFeedback"], karere: "Tena koa tohatoha i taau i pai ai"}); }

ki te (data.satisfaction <= 2 && !data.improvementFeedback) {ctx.addIssue({waehere: "ritenga", ara:["improvementFeedback"], karere: "Tena korero mai ki a matou he aha hei whakapai ake" }); }});

momo kaweake FormData = z.infer;

Kia mahara ko te ingoa kaiwhakamahi me te kupuhipa ka patohia hei kowhiringa() ahakoa e hiahiatia ana na te mea ko te aronuinga taumata-momo a Zod e whakaatu ana i te ahua o te ahanoa, kaua ko nga ture e whakahaere ana i te wa e pa ana nga mara. Ko te whakaritenga herenga me noho ki roto i te superRefine, ka rere i muri i te whakamanatanga o te hanga me te whai waahi ki te katoa o te ahanoa. E hara taua wehenga i te he; he aha te taputapu i hangaia mo: ko te superRefine te wahi e haere ai te arorau whiti-marae ina kore e taea te whakaatu i roto i te hanganga aronuinga. Ko te mea nui i konei ko te mea kaore e whakaatuhia e tenei kaupapa. Karekau he ariā mo nga wharangi, karekau he ariā e kitea ana nga mara i tera waahi, karekau he ariā mo te whakatere. Ka noho era katoa ki tetahi atu wahi. Wae Puka

kawemai { useForm, useWatch } mai i "react-hook-form"; kawemai {zodResolver } mai i "@hookform/resolvers/zod"; kawemai { useMutation } mai i "@tanstack/react-query"; kawemai { useState, useMemo } mai i "react"; kawemai {formSchema, momo Raraungaraunga}"

const STEPS = ["details", "order", "account", "review"];

momo OrderPayload = PukaRaraunga & { tapeke iti: tau; tāke: tau; tapeke: tau };

mahi kaweake RHFMultiStepForm() {const [step, setStep] = useState(0);

const mutation = useMutation({ mutationFn: async (utu utu: OrderPayload) => { const res = tatari tiki("/api/orders", { tikanga: "POST", pane: { "Momo-Ihirangi": "tono/json"}, tinana: JSON.stringify(utu utu), }); if (!res.ok) throw new Hapa("I rahua ki te tuku"); whakahokia res.json(); }, });

const {rehita, mana, handleSubmit, formState: { errors }, } = useForm({solver: zodResolver(formSchema), defaultValues: {utu: 0, rahinga: 1, taxRate: 0.1, pai: 3, hasAccount: "}", }, } utu const = useWatch({mana, ingoa: "utu" }); const quantity = useWatch({ mana, ingoa: "rahi" }); const taxRate = useWatch({ mana, ingoa: "TaxRate" }); const hasAccount = useWatch({ mana, ingoa: "hasAccount" }); const satisfaction = useWatch({ control, name: "satisfaction" }); const subtotal = useMemo(() => (utu ?? 0) * (rahi ?? 1), [utu, rahi]); const tax = useMemo(() => tapekeroto * (TaxRate ?? 0), [tapekeroto, TaakeRate]); const tapeke = useMemo(() => tapeke iti + taake, [tapeke iti, taake]); const onSubmit = (raraunga: FormData) => mutation.mutate({ ...raraunga, tapeke iti, taake, tapeke }); const showSubmit = (step === 2 && tapeke <100) || (step === 3 && tapeke >= 100)

hoki mai (

{step === 0 && ( <> )}

{step === 1 && ( <>

Tapekeroto: {tapekeroto}
Take: {tax}
Tapeke: {total}
)}

{step === 2 && ( <>

{hasAccount === "Ae" && ( <> )}

{te pai >= 4 && (