SurveyJS na-akwado edemede a Enwere ụdị echiche ọtụtụ ndị mmepe React na-ekekọrịta n'ekwughị ya n'olu dara ụda. Ụdị ndị ahụ kwesịrị ka ọ bụrụ akụkụ. Nke a pụtara nchịkọta dị ka:

Mpempe nkogharị mmeghachi omume maka steeti ime obodo (obere ntụgharị, ndebanye aha ubi ergonomic, mmekọrịta dị mkpa). Zod maka nkwado (ntinye ntinye, nkwado oke, ụdị-ntụgharị). Zaghachi ajụjụ maka nkwụghachi azụ: nrubeisi, nyochagharị, caching, mmekọrịta nkesa, na ihe ndị ọzọ.

Na maka ọtụtụ ụdị - ihuenyo nbanye gị, ibe ntọala gị, ụdị CRUD gị - nke a na-arụ ọrụ nke ọma. Ibe ọ bụla na-arụ ọrụ ya, ha na-edepụta nke ọma, ma ị nwere ike ịga n'ihu na akụkụ nke ngwa gị nke na-ekewa ngwaahịa gị n'ezie. Mana otu oge n'otu oge, ụdị na-amalite ịchịkọta ihe dị ka iwu visibiliti nke dabere na azịza mbụ, ma ọ bụ ụkpụrụ ewepụtara na-adaba na mpaghara atọ. Eleghị anya ọbụlagodi ibe niile kwesịrị ịwụpụ ma ọ bụ gosi dabere na mkpokọta na-agba ọsọ. Ị na-ejikwa ojijiWatch na ngalaba inline na-ejikwa ọnọdụ mbụ, nke dị mma. Mgbe ahụ ọzọ. Mgbe ahụ, ị ​​na-eru maka superRefine ka itinye koodu n'ofe mpaghara nke atụmatụ Zod gị enweghị ike igosipụta n'ụzọ nkịtị. Mgbe ahụ, nzọụkwụ nzọụkwụ na-amalite na-agbapụta mgbagha azụmahịa. N'oge ụfọdụ, ị na-eleba anya n'ihe ị wulitere wee ghọta na ụdị ahụ abụghịzi UI n'ezie. Ọ bụ usoro mkpebi karịa, na osisi akụrụngwa bụ naanị ebe ị mere ịchekwa ya. Nke a bụ ebe m chere na ụdị echiche maka ụdị React na-akụda, na ọ bụghị onye ọ bụla kpatara ya. Nchịkọta RHF + Zod mara mma n'ihe emere ya. Ihe iseokwu a bụ na anyị na-anọgide na-eji ya gafee ebe abstractions ya dabara na nsogbu ahụ n'ihi na nhọrọ ọzọ chọrọ ụzọ dị iche iche iche echiche banyere ụdị kpamkpam. Edemede a gbasara ihe ọzọ. Iji gosi nke a, anyị ga-ewu otu ụdị usoro ọtụtụ ugboro ugboro abụọ:

Na React Hook form + Zod wired ka ọ zaa ajụjụ maka nrubeisi, Site na SurveyJS, nke na-ewere ụdị dị ka data - atụmatụ JSON dị mfe - karịa osisi akụrụngwa.

Otu ihe achọrọ, otu mgbagha ọnọdụ, otu oku API na njedebe. Mgbe ahụ, anyị ga-akọwapụta kpọmkwem ihe kwagara na ihe fọdụrụ, wee wepụta ụzọ bara uru iji kpebie ụdị ị ga-eji, na mgbe. Form anyị na-ewu:

Ụdị a ga-eji usoro ụzọ anọ: Nzọụkwụ 1: Nkọwa

Aha mbụ (chọrọ), Email (chọrọ, ụdị dị irè).

Nzọụkwụ 2: Nye iwu

Ọnụ ego otu, Ọnụọgụ, Ọnụ ego ụtụ, Ewepụtara: Nchịkọta, Ụtụ isi, Mkpokọta.

Kwụpụ 3: Akaụntụ & Nzaghachi

Ị nwere akaụntụ? (Ee/Ee e) Ọ bụrụ Ee → aha njirimara + paswọọdụ, ha abụọ chọrọ. Ọ bụrụ Mba → anakọtara email na nzọụkwụ 1.

Ogo afọ ojuju (1–5) Ọ bụrụ ≥ 4 → jụọ "Gịnị masịrị gị?" Ọ bụrụ ≤ 2 → jụọ "Gịnị ka anyị nwere ike imeziwanye?"

Nzọụkwụ 4: Nyochaa

Na-egosi naanị ma ọ bụrụ mkpokọta> = 100 Nrubeisi ikpeazụ.

Nke a abụghị oke oke. Ma o zuru ezu ikpughe ọdịiche nke ụkpụrụ ụlọ. Nkebi 1: Akụkụ-Mkpụrụ Akpụ (Fọm nko na-emeghachi omume + Zod) Nwụnye npm tinye react-hook-form zod @hookform/resolvers @tanstack/react-query

Zod Schema Ka anyị malite na atụmatụ Zod, n'ihi na nke ahụ na-emekarị ka ọdịdị nke ụdị ahụ guzosie ike. Maka nzọụkwụ abụọ mbụ - nkọwa nkeonwe na ntinye iwu - ihe niile kwụ ọtọ: eriri achọrọ, ọnụọgụ nwere opekempe, na nọmba. Akụkụ na-adọrọ mmasị na-amalite mgbe ị na-agbalị ikwupụta iwu ọnọdụ.

mbubata {z} site na "zod";

mbupụ const formSchema = z.object ({ firstAha: z.string() .min(1, "Achọrọ"), email: z.string().email("email na-ezighi ezi"), ọnụ ahịa: z.number().min(0), quantity: z.number().min(1), taxRate: z.number(), hasAccount: z.enname: "["]), aha njirimara: z.enum ([") z.string ().nhọrọ (), okwuntughe: z.string ().nhọrọ (), afọ ojuju: z.number ().min (1).max (5), positiveFeedback: z.string () .nhọrọ (), mmeliteFeedback: z.string ().nhọrọ (),}).superRefine ((data, ctx) => {ma ọ bụrụ (data.hasAccount) {== "data. ctx.addIssue ({koodu: "omenala", ụzọ: ["aha njirimara"], ozi: "Achọrọ"}); } ma ọ bụrụ na (! data.password || data.password.length < 6) {ctx.addIssue

ọ bụrụ (data.satisfaction>= 4 && !data.positiveFeedback) {ctx.addIssue ({koodu: "custom", ụzọ: ["positiveFeedback"], ozi: "Biko kesaa ihe masịrị gị"}); }

ọ bụrụ (data.satisfaction <= 2 && !data.improvementFeedback) {ctx.addIssue({koodu: "omenala", ụzọ:["improvementFeedback"], ozi: "Biko gwa anyị ihe anyị ga-emeziwanye"}); }});

ụdị mbupụ FormData = z.infer<ụdị formSchema>;

Rịba ama na a na-ede aha njirimara na okwuntughe dị ka nhọrọ () n'agbanyeghị na achọrọ ha n'ọnọdụ n'ihi na ụdị ọkwa Zod na-akọwa ọdịdị nke ihe ahụ, ọ bụghị iwu na-achịkwa mgbe ubi dị mkpa. Ihe a chọrọ ka ọ dị ndụ ga-ebi n'ime superRefine, nke na-agba ọsọ mgbe ọdịdị ahụ kwadoro ma nwee ike ịnweta ihe zuru ezu. Nkewa ahụ abụghị ntụpọ; ọ bụ naanị ihe e mere maka ngwaọrụ ahụ: superRefine bụ ebe mgbagha mgbagha na-aga mgbe enweghị ike igosipụta ya na nhazi atụmatụ n'onwe ya. Ihe dị ịrịba ama ebe a bụ ihe atụmatụ a anaghị egosipụta. O nweghị echiche nke ibe, enweghị echiche nke mpaghara a na-ahụ anya n'oge, na enweghị echiche nke igodo. Ihe ndị ahụ niile ga-ebi n’ebe ọzọ. Ngwa Ngwa

mbubata {useForm, useWatch} site na "react-hook-form"; mbubata {zodResolver } site na "@hookform/resolvers/zod";import {useMutation } si "@tanstack/react-query"; mbubata {useState, jiriMemo } si"react"/bubata; ụdịdị FormSchetama,

const STEPS = ["nkọwa", "usoro", "akaụntụ", "nyocha"];

ụdị OrderPayload = FormData & {mkpokọta: nọmba; ụtụ: nọmba; mkpokọta: ọnụọgụ};

ọrụ mbupụ RHFMultiStepForm () {const [nzọụkwụ, setStep] = useState (0);

const mutation = iji Mutation ({ mutationFn: async (ụgwọ: OrderPayload) => { const res = chere weta ("/api/orders", { usoro: "POST", nkụnye eji isi mee: {"Ọdịnaya-Ụdị": "application/json"}, ahu: JSON.stringify(ibu), } ma ọ bụrụ na (!res.ok) tufuo Error ọhụrụ ("Enweghị n'okpuru"); laghachi res.json (); }, }

const {debanye aha, njikwa, handleSubmit, formState: { Error},} = useForm({ resolver: zodResolver (formSchema), defaultValues: { price: 0, quantity: 1, taxRate: 0.1, satifiction: 3, hasAccount: "Ee e",}); ọnụahịa const = useWatch ({nchịkwa, aha: "ọnụahịa"}); const quantity = useWatch ({nchịkwa, aha: "oke"}); const taxRate = useWatch ({nchịkwa, aha: "taxRate"}); const hasAccount = useWatch ({nchịkwa, aha: "hasAccount"}); afọ ojuju const = useWatch ({nchịkwa, aha: "afọ ojuju"}); const subtotal = useMemo(() => (ọnụahịa ?? 0) * (ọnụọgụ ?? 1), [ọnụahịa, oke]); const tax = useMemo(() => subtotal * (ụtụ ụtụ ?? 0), [subtotal, taxRate]); const mkpokọta = useMemo(() => subtotal + tax, [subtotal, tax]); const onSubmit = (data: FormData) => mutation.mutate ({...data, subtotal, tax, total }); const show Nyefee = (nzọụkwụ === 2 && mkpokọta <100) || (nzọụkwụ === 3 && mkpokọta> = 100)

nloghachi (

{nzọụkwụ === 0 && ( <> )}

{step === 1 && ( <> ọnụ ahịa "ezigbo" value = " 0.05 " >5% 10% 15%

Subtotal: {subtotal}
Tax: {tax}
Mkpokọta: {total}
)}

{step === 2 && ( <>

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

{ afọ ojuju >= 4 && (