Nin barokun in ye SurveyJS ka dɛmɛn ye Hakilila-modɛli dɔ bɛ yen min bɛ React dilannikɛlaw fanba tila k’a sɔrɔ u ma baro kɛ o kan ni kanba ye abada. Ko sɛbɛnw ka kan ka Kɛ ‘fɛnw ye tuma bɛɛ. O kɔrɔ ye ko stack i n’a fɔ:

React Hook Form for local state (minimal re-renders, ergonomic field registration, imperative interaction). Zod ka ɲɛsin tiɲɛni ma (donni tiɲɛni, dancɛ tiɲɛni, suguya-safe parsing). React Query for backend: cikan, segin-ka-bɔnye, caching, server sync, ani o ɲɔgɔnnaw.

Wa foroko fanba la — i ka dondaw, i ka sigida ɲɛw, i ka CRUD modaliw — o bɛ baara kɛ kosɛbɛ tiɲɛ na. O yɔrɔ kelen-kelen bɛɛ b’a ka baara kɛ, u bɛ daɲɛw labɛn ka ɲɛ, wa i bɛ se ka taa i ka baarakɛminɛn yɔrɔw la minnu bɛ i ka fɛn dilannen danfara tiɲɛ na. Nka siɲɛ kelen-kelen bɛɛ, foroko dɔ bɛ daminɛ ka fɛnw dalajɛ i n’a fɔ yecogo sariyaw minnu bɛ bɔ jaabi fɔlɔw la, walima nafa sɔrɔlenw minnu bɛ wuli ka tɛmɛ foro saba fɛ. Laala hali ɲɛ kuuru minnu ka kan ka tɛmɛ walima ka jira ka da u bɛɛ lajɛlen kan minnu bɛ boli. I bɛ sarati fɔlɔ ɲɛnabɔ ni useWatch ye ani inline bolofara ye, o ka ɲi. O kɔ fɛ, dɔ wɛrɛ. O kɔ fɛ i b’i bolo Se superRefine ma walasa ka cross-field sariyaw kodɔn, i ka Zod schema tɛ Se k’olu Fɔ cogo la min bɛ Kɛ a cogo la. O kɔfɛ, senna-taama-sira bɛ daminɛ ka jagokɛlaw ka hakilinaw bɔ kɛnɛ kan. Waati dɔ la, i ye min jɔ, i b’o lajɛ k’a ye ko sɛbɛn in tɛ UI ye tiɲɛ na tugun. A ka ca ni latigɛ kɛcogo ye, wa component tree bɛ yɔrɔ min na dɔrɔn i y’a mara yɔrɔ min na. Nin yɔrɔ in de la n hakili la hakili-la-modɛli min bɛ forokow la React kɔnɔ, o bɛ tiɲɛ, wa tiɲɛ na, mɔgɔ si ka jalaki tɛ. RHF + Zod stack ka ɲi kosɛbɛ a dabɔra min kama. Ko min bɛ yen, o ye ko an b’a fɛ ka To ka baara Kɛ n’a ye ka Tɛmɛ yɔrɔ min na a ka abstractions (daɲɛw) bɛ Bɛn ni gɛlɛya ye yɔrɔ min na bari a nɔfɛta bɛ miiri cogo wɛrɛ Лini cogoyaw kan pewu. Nin barokun bɛ kuma o fɛɛrɛ wɛrɛ kan. Walasa k’o jira, an bɛna taabolo caman-sɛbɛn kelen tigitigi jɔ siɲɛ fila:

Ni React Hook Form + Zod sirilen don React Query la walasa ka ci, Ni SurveyJS ye, min bɛ foroko dɔ minɛ i n’a fɔ kunnafoni — JSON schema nɔgɔman — sanni ka kɛ jiribolo ye.

Wajibiya kelenw, sariyataamacogo kelen, API weleli kelen laban na. O kɔfɛ, an bɛna fɛn min jiginna ani min tora, an bɛna o karti tigitigi, ka fɛɛrɛ ɲuman dɔ labɛn walasa k’a latigɛ i ka kan ka baara kɛ ni modɛli min ye, ani waati min na. An bɛ foroko min jɔ:

Nin sɛbɛn in bɛna baara kɛ ni taabolo 4 ye: Taabolo fɔlɔ: Fɛn fitininw

Tɔgɔ fɔlɔ (a wajibiyalen don), . Email (a wajibiyalen don, a cogoya bɛnnen don).

Taabolo 2nan: Aw ye komandi kɛ

Unit sɔngɔ, . Hakɛ, . Takisi hakɛ, . A bɔra: Subtotal, 1999. Takisi, . Total (Jɛkulu bɛɛ lajɛlen).

Taabolo 3nan: Jatebɔ & Ladilikanw

Yala jatebɔsɛbɛn b’i bolo wa? (Ɔwɔ/Ayi) Ni Ɔwɔ → baarakɛla tɔgɔ + tɔgɔlasɛbɛn, o fila bɛɛ wajibiyalen don. Ni Ayi → email lajɛra kaban taamasiɲɛ 1 na.

Wasa hakɛ (1–5) . Ni ≥ 4 → aw bɛ ɲininkali kɛ “Mun diyara aw ye?” Ni ≤ 2 → ɲininkali “An bɛ se ka mun ɲɛ?”

Step 4: Review

A bɛ jira dɔrɔn ni a bɛɛ lajɛlen >= 100 Laseli laban.

O tɛ dantɛmɛko ye. Nka a bɛ se ka danfara minnu bɛ fɛn dilanni na, olu bɔ kɛnɛ kan. Yɔrɔ fɔlɔ: A bɛ ɲɛminɛ ni fɛnw ye (React Hook Form + Zod) . Installation (dadon) kɛli npm ka react-hook-form zod sigi @hookform/resolvers @tanstack/react-query la

Zod ka Skema An k’a daminɛ ni Zod schema ye, bawo a ka c’a la, o yɔrɔ de la foroko cogoya bɛ Sìgi sen kan. Taabolo fɔlɔ fila kama — mɔgɔ yɛrɛ ka kunnafoniw ani komandi dontaw — fɛn bɛɛ bɛ ɲɛ: sɛrɛkili wajibiyalenw, jateden minnu ka dɔgɔn, ani enum. Yɔrɔ min ka di, o bɛ daminɛ n’i y’a ɲini ka sariyakolow fɔ minnu bɛ kɛ ni sariya ye.

import { z } ka bɔ "zod" la;

export const formSchema = z.object({ Tɔgɔ fɔlɔ: z.string().min(1, "Wajibiya"), email: z.string().email("Email tiɲɛnen"), sɔngɔ: z.number().min(0), hakɛ: z.number().min(1), taxRate: z.number(), hasAccount: z.enum(["Yes", "No"]), baarakɛla tɔgɔ: z.string().optional(), password: z.string().optional(), wasa: z.number().min(1).max(5), positiveFeedback: z.string().optional(), improvementFeedback: z.string().optional(),}).superRefine((data, ctx) => { ni (data.hasAccount === "Yes") { ni (!data.username) { ctx.addIssue({ kode: "lada", sira: ["baarakɛla tɔgɔ"], cikan: "Wajibiya" }); } if (!data.password || data.password.length < 6) { ctx.addIssue({ code: "custom", sira: ["daɲɛgafe"], cikan: "Min 6 characters" });

if (data.satisfaction >= 4 && !data.positiveFeedback) { ctx.addIssue({ code: "custom", sira: ["positiveFeedback"], cikan: "Aw ye min diya aw ye, aw k'o tila" }); } .

ni (data.wasa <= 2 && !data.ɲɛnabɔliFeedback) { ctx.addIssue({ kode: "laada", sira:["improvementFeedback"], message: "Aw ka kan ka min ɲɛnabɔ, aw k'o fɔ an ye" }); }});

bɔli suguya FormData = z.infer;

A kɔlɔsi ko baarakɛla tɔgɔ ni tɔgɔlasɛbɛn bɛ sɛbɛn i n’a fɔ optional() hali n’u wajibiyalen don ni sarati ye bawo Zod ka type-level schema bɛ fɛn in cogoya ɲɛfɔ, a tɛ sariyaw ye minnu bɛ forow nafa jira waati min na. Sarati wajibiyalen ka kan ka balo superRefine kɔnɔ, min bɛ boli cogoya in tiɲɛni kɔfɛ ani ka se ka fɛn dafalen sɔrɔ. O farali tɛ fili ye; o ye baarakɛminɛn in dabɔra min kama dɔrɔn: superRefine ye yɔrɔ ye cross-field logic bɛ taa yɔrɔ min na n’a tɛ se ka fɔ schema structure yɛrɛ kɔnɔ. Fɛn min fana kɔlɔsira yan, o ye nin sɛbɛ in tɛ min Fɔ. A hakilina tɛ ɲɛw kan, hakilina t’a la ko foro minnu bɛ Ye yɔrɔ jumɛn na, wa hakilina tɛ a la ka ɲɛsin taamacogo ma. O bɛɛ bɛna sigi yɔrɔ wɛrɛ la. Formulaire Component (Formulaire Component) ye

import { useForm, useWatch } ka bɔ "react-hook-form";import { zodResolver } ka bɔ "@hookform/resolvers/zod";import { useMutation } ka bɔ "@tanstack/react-query";import { useState, useMemo } ka bɔ "react";import { formSchema, type FormData } ka bɔ "./schema

const STEPS = ["detail", "order", "jate", "seginkanni"];

type OrderPayload = FormData & { subtotal: number; takasi: jateden; total: jateden };

export function RHFMultiStepForm () { const [taamasenɲɛ, sigicogo] = baarakɛcogo Jamana (0);

const mutation = baarakɛcogoMutation({ mutationFn: async (nafalan: Ladilikan sarali) => { const res = jira fetch ("/api/cikanw", { fɛɛrɛ: "POST", headers: { "Kɔnɔkow-suguya": "application/json" }, farikolo: JSON.stringify (nafa sɔrɔli), . }); ni (!res.ok) throw new Error("A ma se ka ci"); segin res.json (); }, . });

const { sɛbɛnni, kunnafoni, handleSubmit, formState: { filiw }, } = useForm({ ɲɛnabɔbaga: zodResolver(formSchema), defaultValues: { sɔngɔ: 0, hakɛ: 1, impositiRate: 0.1, wasa: 3, hasAccount: "Ayi", }, }) const sɔngɔ = useWatch ({ kuntigiya, tɔgɔ: "sɔngɔ" }); const hakɛ = useWatch({ kuntigiya, tɔgɔ: "hakɛ" }); const taxRate = useWatch ({ kuntigiya, tɔgɔ: "taxRate" }); const hasAccount = useWatch ({ kuntigiya, tɔgɔ: "jate bɛ a bolo" }); const wasa = useWatch({ kuntigiya, tɔgɔ: "wasa" }); const subtotal = useMemo (() => (sɔngɔ ?? 0) * (hakɛ ?? 1), [sɔngɔ, hakɛ]); const tax = useMemo (() => jateden fitinin * (takisi hakɛ ?? 0), [jatebɔ fitinin, impositi hakɛ]); const total = useMemo (() => jateden fitinin + impositi, [jateden fitinin, impositi]); const onSubmit = (donanw: FormData) => mutation.mutate({ ...donanw, jatebɔ fitinin, takasi, bɛɛ lajɛlen }); const showSubmit = (taamasenɲɛ === 2 && bɛɛ lajɛlen < 100) || (step === 3 && total >= 100)

return (

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

{step === 1 && ( <>

|

{sen === 2 && ( <>

{hasAccount === "Ɔwɔ" && ( <> )}

{wasa >= 4 && (