Nkhaniyi idathandizidwa ndi SurveyJS Pali mtundu wamaganizidwe omwe ambiri opanga React amagawana osakambirana nawo mokweza. Mafomu amenewo nthawi zonse amayenera kukhala zigawo. Izi zikutanthauza stack monga:

React Hook Form ya dera lanulo (zongobwereza zochepa, kulembetsa kwa ergonomic field, kuyanjana kofunikira). Zod yotsimikizira (kulondola kwa zolowetsa, kutsimikizira malire, kuyika motetezeka). React Query for backend: kugonjera, kuyesanso, caching, kulunzanitsa kwa seva, ndi zina zotero.

Ndipo pamitundu yambiri - zowonetsera zanu zolowera, masamba anu okhazikitsira, ma mods anu a CRUD - izi zimagwira ntchito bwino. Chigawo chilichonse chimagwira ntchito yake, amalemba mwaukhondo, ndipo mutha kupita ku magawo a pulogalamu yanu yomwe imasiyanitsa malonda anu. Koma nthawi ndi nthawi, mawonekedwe amayamba kudziunjikira zinthu monga malamulo owonekera omwe amadalira mayankho am'mbuyomu, kapena zikhalidwe zomwe zimachokera zomwe zimadutsa magawo atatu. Mwinanso masamba onse omwe akuyenera kudumphidwa kapena kuwonetsedwa kutengera kuchuluka kwazomwe zikuchitika. Mumayendetsa zoyambira ndi useWatch ndi nthambi yamkati, zomwe zili bwino. Kenako wina. Kenako mukufika ku superRefine kuti muyike malamulo ophatikizika omwe schema yanu ya Zod singathe kufotokoza mwachizolowezi. Kenako, kuyenda pang'onopang'ono kumayamba kutulutsa malingaliro abizinesi. Nthawi ina, mumayang'ana zomwe mwamanga ndikuzindikira kuti mawonekedwewo salinso UI. Ndi zambiri mwachisankho, ndipo mtengo wachigawo ndi pomwe mudasunga. Apa ndipamene ndikuganiza kuti mtundu wamaganizidwe amitundu mu React umasokonekera, ndipo palibe vuto lililonse. RHF + Zod stack ndiyabwino kwambiri pazomwe idapangidwira. Vuto ndiloti timakonda kupitiliza kuzigwiritsa ntchito mpaka pomwe zotsalira zake zimafanana ndi vutoli chifukwa njira ina imafuna njira yosiyana yoganizira mafomu kwathunthu. Nkhaniyi ikunena za njira ina. Kuti tiwonetse izi, tipanga mawonekedwe ofanana ndendende kawiri:

Ndi React Hook Fomu + Zod yolumikizidwa kuti Muyankhe Mafunso kuti mupereke, Ndi SurveyJS, yomwe imagwiritsa ntchito mawonekedwe ngati deta - schema yosavuta ya JSON - osati mtengo wachigawo.

Zofunikira zomwezo, malingaliro ofanana, kuyimba komweko kwa API kumapeto. Kenako tidzalemba ndendende zomwe zidasuntha ndi zomwe zidatsalira, ndikuyika njira yothandiza yosankha mtundu womwe muyenera kugwiritsa ntchito, komanso liti. Fomu yomwe timapanga:

Fomu iyi igwiritsa ntchito masitepe anayi: Gawo 1: Tsatanetsatane

Dzina loyamba (lofunikira), Imelo (yofunikira, mtundu wovomerezeka).

Gawo 2: Kuyitanitsa

Mtengo wa unit, kuchuluka, Mtengo wa msonkho, Zochokera: Pafupifupi, Tax, Zonse.

Gawo 3: Akaunti & Ndemanga

Kodi muli ndi akaunti? (Inde/Ayi) Ngati inde → lolowera + mawu achinsinsi, onse amafunikira. Ngati Ayi → imelo yotengedwa kale mu gawo 1.

Kukhutitsidwa (1-5) Ngati ≥ 4 → funsani "Munakonda chiyani?" Ngati ≤ 2 → funsani “Kodi tingawongolere chiyani?”

Gawo 4: Unikaninso

Zimangowoneka ngati zonse >= 100 Kupereka komaliza.

Izi sizonyanyira. Koma ndizokwanira kuwulula kusiyana kwa zomangamanga. Gawo 1: Chigawo Choyendetsedwa (React Hook Form + Zod) Kuyika npm ikani react-hook-form zod @hookform/resolvers @tanstack/react-query

Zokonda Schema Tiyeni tiyambe ndi Zod schema, chifukwa nthawi zambiri ndipamene mawonekedwe a mawonekedwe amakhazikitsidwa. Pazigawo ziwiri zoyambirira - zambiri zaumwini ndi zolowetsa - zonse ndi zowongoka: zingwe zofunika, manambala okhala ndi zochepa, ndi enum. Gawo losangalatsa limayamba pamene mukuyesera kufotokoza malamulo ovomerezeka.

lowetsani {z} kuchokera ku "zod";

export const formSchema = z.object({ firstName: z.string().min(1, "Zofunika"), imelo: z.string().email("Imelo yosalondola"), mtengo: z.number().min(0), kuchuluka: z.number().min(1), taxRate: z.number(),z.Nocount:Yescount:Nocount:Yes"Acnum" z.string().mwasankha(), mawu achinsinsi: z.string().mwasankha(), kukhutitsidwa: z.number().min(1).max(5), positiveFeedback: z.string().optional(), improvementFeedback: z.string().optional(),}).superRefine((deta, ctx) => {if (data.=Year) =Yes. {ctx.addIssue({code: "custom", path: ["username"], message: "Required" }} ngati (!data.password || data.password.length < 6) {ctx.addIssue({code: "custom", path: ["password"]); uthenga: "}}

ngati (data.satisfaction >= 4 && !data.positiveFeedback) {ctx.addIssue({code: "custom", path: ["positiveFeedback"], uthenga: "Chonde gawani zomwe mumakonda"}); }

ngati (data.satisfaction <= 2 && !data.improvementFeedback) {ctx.addIssue({code: "custom", njira:["improvementFeedback"], uthenga: "Chonde tiuzeni zomwe tikuyenera kukonza" }); }});

mtundu wa kunja FormData = z.infer;

Zindikirani kuti dzina lolowera ndi mawu achinsinsi amalembedwa ngati zosankha () ngakhale zimafunikira chifukwa schema yamtundu wa Zod imalongosola mawonekedwe a chinthucho, osati malamulo omwe amalamulira minda ikafunikira. Chofunikira chokhazikika chiyenera kukhala mkati mwa superRefine, yomwe imayenda pambuyo poti mawonekedwewo atsimikiziridwa ndipo amatha kupeza chinthu chonsecho. Kulekana kumeneko sikuli chilema; ndizomwe chidacho chidapangidwira: superRefine ndipamene malingaliro apakati amapita pomwe sangathe kufotokozedwa mu schema dongosolo lokha. Chodziwikanso apa ndi chomwe schema iyi sichikuwonetsa. Ilibe lingaliro lamasamba, palibe lingaliro la magawo omwe akuwoneka panthawi yomwe, ndipo palibe lingaliro lakuyenda. Zonsezo zidzakhala kwinakwake. Chigawo cha Fomu

lowetsani {useForm, useWatch } kuchokera ku "react-hook-form"; lowetsani {zodResolver } kuchokera ku "@hookform/resolvers/zod"; lowetsani {useMutation } kuchokera ku "@tanstack/react-query"; lowetsani {useState, useMemo } kuchokera ku "react"; lowetsani {formSchema} kuchokera ku "Daschema";

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

lembani OrderPayload = FormData & {subtotal: nambala; msonkho: nambala; chiwerengero };

ntchito yotumiza kunja RHFMultiStepForm() {const [site, setStep] = useState(0);

const mutation = useMutation ({ mutationFn: async (payload: OrderPayload) => { const res = ait fetch("/api/oda", { njira: "POST", mitu: {"Content-Type": "application/json" }, thupi: JSON.stringify(payload), }); ngati (!res.ok) aponyerani Cholakwika chatsopano("Yalephera kugonjera"); kubwerera res.json (); }, });

const {rejista, control, handleSubmit, formState: {zolakwika}, } = useForm({solver: zodResolver(formSchema), defaultValues: {mtengo: 0, quantity: 1, taxRate: 0.1, satisfaction: 3, hasAccount: "No);,}} const price = useWatch({ control, name: "price" }); const quantity = useWatch({ control, name: "quantity" }); const taxRate = useWatch({ control, name: "taxRate" }); const hasAccount = useWatch({ control, name: "hasAccount" }); const satisfaction = useWatch({ control, name: "kukhutira"}); const subtotal = useMemo(() => (mtengo ?? 0) * (kuchuluka ?? 1), [mtengo, kuchuluka]); const tax = useMemo(() => subtotal * (taxRate ?? 0), [subtotal, taxRate]); const total = useMemo(() => subtotal + tax, [subtotal, tax]); const onSubmit = (data: FormData) => mutation.mutate({ ...data, subtotal, tax, total }); const showSubmit = (site === 2 && chiwerengero <100) || (gawo === 3 && chiwonkhetso >= 100)

bwezerani (

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

{step === 1 && ( <> {A value},{A mtengo="0.05">5%

Total: {subtotal}
Msonkho: {tax}
Total: {total}
)}

{site === 2 && ( <> < sankhani {...register("hasAccount")}>

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

{kukhutira >= 4 && (