SurveyJS ne ke daukar nauyin wannan labarin Akwai ƙirar tunani mafi yawan masu haɓaka React suna rabawa ba tare da sun taɓa yin magana da babbar murya ba. Waɗancan siffofin koyaushe yakamata su kasance abubuwan haɗin gwiwa. Wannan yana nufin tari kamar:

Fom ɗin ƙugiya React don ƙaramar jihar (mafi ƙarancin sake fasalin, rajistar filin ergonomic, hulɗar mahimmanci). Zod don ingantawa (daidaitaccen shigarwar, ingantacciyar iyaka, nau'in-lafiya ta tantancewa). Amsa Tambaya don baya: ƙaddamarwa, sake gwadawa, caching, daidaitawar uwar garke, da sauransu.

Kuma ga mafi yawan nau'ikan nau'ikan - allon shiga ku, shafukan saitunanku, tsarin CRUD ɗinku - wannan yana aiki sosai. Kowane yanki yana yin aikinsa, suna tsarawa cikin tsafta, kuma zaku iya matsawa zuwa sassan aikace-aikacenku waɗanda ke bambanta samfuran ku. Amma kowane lokaci a cikin wani lokaci, wani nau'i yana fara tara abubuwa kamar ƙa'idodin ganuwa waɗanda suka dogara da amsoshi na farko, ko ƙimar da aka samo waɗanda suka ɓace ta hanyoyi uku. Wataƙila ma duka shafukan da ya kamata a tsallake su ko a nuna su bisa jimlar gudana. Kuna sarrafa yanayin farko tare da amfaniWatch da reshen layi, wanda yayi kyau. Sai wani. Sannan kuna isa ga SuperRefine don ɓoye ƙa'idodin filin da tsarin Zod ɗin ku ba zai iya bayyanawa ta al'ada ba. Sa'an nan, kewayawa mataki yana fara yoyo dabaru na kasuwanci. A wani lokaci, kuna kallon abin da kuka gina kuma ku gane cewa fom ɗin ba ainihin UI bane kuma. Yana da ƙarin tsarin yanke shawara, kuma itacen bangaren shine kawai inda kuka faru don adana shi. Wannan shine inda nake tsammanin ƙirar tunani don siffofi a cikin React ya rushe, kuma hakika ba laifin kowa bane. Tarin RHF + Zod yana da kyau ga abin da aka tsara shi don shi. Matsalar ita ce mukan ci gaba da yin amfani da shi bayan lokacin da abubuwan da ke tattare da shi ya dace da matsalar saboda madadin yana buƙatar wata hanya ta daban ta tunani game da siffofi gaba ɗaya. Wannan labarin game da wancan madadin. Don nuna wannan, za mu gina ainihin tsari iri ɗaya sau biyu:

Tare da React Hook Form + Zod wanda aka haɗa don amsa tambaya don ƙaddamarwa, Tare da SurveyJS, wanda ke ɗaukar nau'i azaman bayanai - tsari mai sauƙi na JSON - maimakon bishiyar sassa.

Bukatu iri ɗaya, dabaru na sharadi iri ɗaya, kiran API iri ɗaya a ƙarshen. Sa'an nan za mu yi taswirar ainihin abin da ya motsa da abin da ya zauna, da kuma tsara hanya mai amfani don yanke shawarar wane samfurin ya kamata ku yi amfani da shi, da kuma lokacin. Sigar da muke ginawa:

Wannan fom zai yi amfani da kwararar matakai 4: Mataki 1: Cikakkun bayanai

Sunan farko (da ake buƙata), Imel (da ake buƙata, ingantaccen tsari).

Mataki 2: Oda

Farashin naúrar, Yawan, Yawan haraji, An samo: Ƙarfafawa, Haraji, Jimlar.

Mataki 3: Account & Feedback

Kuna da asusun ajiya? (Ee/A'a) Idan Ee → sunan mai amfani + kalmar sirri, duka ana buƙata. Idan A'a → an riga an tattara imel a mataki na 1.

Ƙimar gamsuwa (1-5) Idan ≥ 4 → tambayi "Me kuke so?" Idan ≤ 2 → tambayi "Me za mu iya inganta?"

Mataki na 4: Bita

Yana bayyana kawai idan duka>= 100 Ƙarshe ƙaddamarwa.

Wannan ba matsananci ba ne. Amma ya isa ya nuna bambance-bambancen gine-gine. Sashe na 1: Abubuwan da ake Kokawa (Form React Hook + Zod) Shigarwa npm shigar react-hook-form zod @hookform/resolvers @tanstack/react-query

Zod Schema Bari mu fara da tsarin Zod, saboda yawanci shine inda aka kafa siffar siffar. Don matakai biyu na farko - cikakkun bayanai na sirri da shigarwar oda - komai mai sauki ne: kirtani da ake buƙata, lambobi tare da mafi ƙarancin ƙima, da adadi. Bangaren ban sha'awa yana farawa lokacin da kuke ƙoƙarin bayyana ƙa'idodin sharadi.

shigo da {z} daga "zod";

fitarwa const formSchema = z.abun ({Na farko Suna: z.string() .min(1, "Ake Bukatar"), email: z.string().email("Imel mara inganci"), farashin: z.number().min(0), yawa: z.number().min(1), haraji: z.number(), yana daAccount: z.enum(["]), lambar lambar ([") string ctx.addIssue ({ code: "custom", hanya: ["sunan mai amfani"], saƙo: "An buƙata"});

idan (data.satisfaction>= 4 && !data.positiveFeedback) {ctx.addIssue ({ code: "custom", hanya: ["positiveFeedback"], saƙo: "Da fatan za a raba abin da kuke so"}); }

idan (data.satisfaction <= 2 && !data.improvementFeedback) {ctx.addIssue({ code: "custom", hanya:["improvementFeedback"], saƙo: "Don Allah gaya mana abin da za mu inganta"}); }});

nau'in fitarwa na FormData = z.infer;

Lura cewa ana buga sunan mai amfani da kalmar wucewa azaman zaɓi () ko da yake ana buƙatar su bisa sharadi saboda tsarin nau'in nau'in nau'in Zod yana bayyana sifar abun, ba ƙa'idodin da ke tafiyar da filaye ba. Abubuwan da ake bukata dole ne su zauna a cikin superRefine, wanda ke gudana bayan an tabbatar da siffar kuma yana da damar yin amfani da cikakken abu. Wannan rabuwa ba aibi ba ne; kawai abin da aka tsara kayan aikin don: superRefine shine inda ma'anar giciye ke tafiya lokacin da ba za a iya bayyana shi a cikin tsarin tsarin kanta ba. Abin da kuma abin lura a nan shi ne abin da wannan tsari bai bayyana ba. Ba shi da ra'ayi na shafuka, ba shi da ra'ayi na waɗanne fage ne ake iya gani a wane lokaci, kuma ba shi da ra'ayi na kewayawa. Duk waɗannan za su zauna a wani wuri dabam. Samfurin Samfura

shigo da {useForm, useWatch} daga "react-hook-form"; shigo da {zodResolver} daga "@hookform/resolvers/zod";import {useMutation } daga "@tanstack/react-query";shigo {useState, amfaniMemo } daga "react"/shigo da "Nau'in FormSchetama,}

const STEPS = ["bayanai", "oda", "asusu", "bita"];

nau'in OrderPayload = FormData & {ƙaddara: lamba; haraji: lamba; jimla: lamba};

aikin fitarwa RHFMultiStepForm () {const [mataki, setStep] = amfaniState (0);

maye gurbi = amfani da Mutation ({ mutationFn: async (nauyin kaya: OrderPayload) => { const res = jira a samo ("/api/orders", { hanya: "POST", buga kai: {"Nau'in Abun ciki": "application/json"}, jiki: JSON.stringify (nauyin kaya), }); idan (!res.ok) jefa sabon Kuskure ("Ba a kasa ƙaddamarwa"); dawo res.json (); }, });

const {rejista, sarrafawa, handleSubmit, formState: {kurakurai},} = useForm({mai warwarewa: zodResolver (formSchema), defaultValues: {farashin: 0, adadi: 1, haraji: 0.1, gamsuwa: 3, yana da Account: "A'a",}); farashin const = useWatch ({ikon, suna: "farashin"}); yawan amfani = amfaniWatch ({ sarrafawa, suna: "yawanci"}); const taxRate = useWatch ({control, name: "TaxRate"}); const hasAccount = useWatch ({control, name: "hasAccount"}); gamsuwa gamsuwa = amfaniWatch ({ikon, suna: " gamsuwa"}); const subtotal = useMemo(() => (farashi ?? 0) * (yawan ?? 1), [farashi, yawa]); harajin haraji = amfaniMemo (() => jimla * (Rashin haraji ?? 0), [subtotal, taxRate]); jimlar jimlar = useMemo(() => subtotal + haraji, [subtotal, haraji]); const onSubmit = (bayanai: FormData) => maye gurbi.mutate ({...data, subtotal, tax, total}); const showSubmit = (mataki === 2 && jimlar < 100) || (mataki === 3 && jimla >= 100)

mayar (

{mataki === 0 && ( <>

{mataki === 1 && ( <> ƙimar gaskiya", {: ƙimar gaskiya. value = " 0.05 " > 5% < darajar zažužžukan = "0.1"> 10% < darajar = "0.15"> 15%

Subtotal: {subtotal}
Haraji: {haraji}
Total: {total}
)}

{mataki === 2 && ( <>

{ gamsuwa >= 4 && (