हो लेख SurveyJS हांणी प्रायोजीत केल्लो आसा चडशे React विकसक केन्नाच मोट्यान चर्चा करिनासतना वांटून घेतात अशें मानसीक मॉडेल आसा. रूपां सदांच घटक आसूंक जाय अशें मानतात. हाचो अर्थ असो स्टॅक असो जाता:

थळाव्या स्थिती खातीर रिएक्ट हुक फॉर्म (उण्यांत उणें रि-रेंडर, एर्गोनॉमिक क्षेत्र नोंदणी, अत्यावश्यक परस्पर संवाद). प्रमाणीकरणाखातीर Zod (इनपुट योग्यताय, शिमो प्रमाणीकरण, प्रकार-सुरक्षीत विश्लेशण). बॅकएंडा खातीर प्रतिक्रिया क्वेरी: सबमिशन, परतून यत्न, कॅशिंग, सर्वर समक्रमण, आनी हेर.

आनी भोवतेक फॉर्मां खातीर — तुमचीं लॉगीन स्क्रीन, तुमचीं सेटिंग्ज पानां, तुमच्या CRUD मोडलां खातीर — हें खरेंच बरें काम करता. दरेक तुकडो आपलें काम करता, ते निवळ रचतात, आनी तुमी तुमच्या ऍप्लिकेशनाच्या भागांचेर वचूंक शकतात जे प्रत्यक्षांत तुमच्या उत्पादनांत फरक करतात. पूण दर एक फावट, एक फॉर्म आदल्या जापांचेर आदारून आशिल्ले दृश्यताय नेम, वा तीन क्षेत्रांतल्यान झरपी व्युत्पन्न मोलां सारकिल्ल्यो गजाली एकठांय करपाक लागता. घडये पुराय पानां लेगीत जीं वगडावचीं वा चलपी एकूणाचेर आदारीत दाखोवचीं. तुमी पयलें सशर्त useWatch आनी इनलायन शाखे वरवीं हाताळटात, जें बरें आसा. मागीर दुसरो. मागीर तुमी superRefine कडेन पावतात क्रॉस-फील्ड नेम एन्कोड करपाक जे तुमची Zod येवजण सामान्य रितीन व्यक्त करूंक शकना. मागीर, स्टेप नेव्हिगेशन वेवसायीक तर्क लीक जावपाक लागता. कांय वेळार, तुमी कितें बांदलां तें पळयतात आनी आतां फॉर्म खरेंच UI ना हें कळटा. तो चडसो निर्णय प्रक्रिया, आनी घटक झाड फकत तुमी संयोगान तें सांठोवपाचें सुवातेर आसा. हांगाच म्हाका दिसता रिएक्टांतल्या फॉर्मां खातीर मानसीक मॉडेल मोडटा, आनी खरेंच कोणाचीच चूक ना. RHF + Zod स्टॅक ज्या खातीर तयार केल्लो तातूंत उत्कृश्ट आसा. मुद्दो म्हळ्यार ताचीं अमूर्तताय समस्याक जुळटा त्या बिंदू वयल्यान आमी ताचो वापर करत रावपाची प्रवृत्ती आसता कारण पर्याया खातीर पुरायपणान रुपां विशीं वेगळी विचार करपाची गरज आसता. हो लेख त्या पर्याया विशीं आसा. हें दाखोवपाक, आमी दोन फावटीं सारकोच मल्टी-स्टेप फॉर्म तयार करतले:

सादर करपा खातीर रिएक्ट हुक फॉर्म + ज़ोड रिएक्ट क्वेरीक तार केल्लो आशिल्ल्यान, SurveyJS कडेन, जो फॉर्माक डेटा म्हणून मानता — सादी JSON येवजण — घटक झाडा परस.

समान गरजां, समान सशर्त तर्क, निमाणें समान एपीआय कॉल. मागीर आमी कितें हाललें आनी कितें उरलें तें सारकें नकाशे तयार करतले, आनी तुमी खंयचें मॉडेल वापरचें, आनी केन्ना वापरचें तें थारावपाचो वेव्हारीक मार्ग मांडटले. आमी बांदतात तो फॉर्म:

हो फॉर्म 4 पांवड्याचो प्रवाह वापरतलो: पांवडो 1: तपशील

पयलें नांव (आवश्यक), २. ईमेल (गरजेचें, वैध स्वरूप).

पांवडो 2: ऑर्डर दिवप

एकक किंमत, . प्रमाण, २. कर दर, ८. व्युत्पन्न: १. उपकुल, 1999. कर, ८. एकूण.

पांवडो 3: खातें & प्रतिसाद

तुमचें खातें आसा? (होय/ना) . हो → वापरप्याचें नांव + पासवर्ड जाल्यार, दोनूय गरजेचे. जर ना → ईमेल पयलींच पांवडो 1 त एकठांय केल्लो.

समाधान रेटिंग (1-5) 1.1. जर ≥ 4 → विचारात “तुका कितें आवडलें?” जर ≤ 2 → विचारात “आमी कितें सुदारूं येता?”

पांवडो 4: पुनरावलोकन करप

फकत एकूण >= 100 आसल्यारच दिसता निमाणें सादरीकरण.

हें चडांत चड न्हय. पूण वास्तुशिल्पांतले फरक उक्ते करपाक पुरो. भाग 1: घटक-संचालित (रिएक्ट हुक फॉर्म + ज़ोड) स्थापन करप npm react-hook-form zod @hookform/resolvers @tanstack/react-query प्रतिष्ठापीत करचें

ज़ोड येवजण सुरवात करूंया Zod येवजणे पासून, कारण चड करून थंयच फॉर्माचो आकार स्थापन जाता. पयल्या दोन पांवड्यां खातीर — वैयक्तीक तपशील आनी ऑर्डर इनपुट — सगळें सरळ आसा: गरजेच्यो स्ट्रिंग्स, किमान आशिल्ले क्रमांक, आनी एक enum. सशर्त नेम उक्तावपाचो यत्न करतना मनोरंजक भाग सुरू जाता.

"zod" कडल्यान { z } आयात करात;

निर्यात const formSchema = z.object ({ पयलें नांव: z.string ().min (1, "गरजेचें"), ईमेल: z.string ().email ("अवैध ईमेल"), किंमत: z.number ().min (0), प्रमाण: z.number ().min (1), taxRate: z.number (), hasAccount: z.enum (["होय", "ना"]), वापरप्याचें नांव: z.string ().पर्यायी (), पासवर्ड: z.string (). पर्यायी (), समाधान: z.संख्या ().min (1). चडांत चड (5), सकारात्मकप्रतिसाद: z.string (). पर्यायी (), सुदारणाप्रतिसाद: z.string (). पर्यायी (),}).superRefine ((डेटा, ctx) => { if (data.hasAccount === "होय") { जर (! डेटा.वापरपी नांव) { ctx.addIssue ({ कोड: "सानुकूल", मार्ग: ["वापरप्याचें नांव"], संदेश: "गरज" }); } if (! डेटा.पासवर्ड || डेटा.पासवर्ड.लांबाय < 6) { ctx.addIssue({ कोड: "सानुकूल", मार्ग: ["पासवर्ड"], संदेश: "Min 6 अक्षरां" });

if (data.satisfaction >= 4 && !data.positiveFeedback) { ctx.addIssue({ कोड: "सानुकूल", मार्ग: ["सकारात्मक प्रतिसाद"], संदेश: "कृपा करून तुमकां आवडलें तें वांटचें" }); } .

if (डेटा.समाधान <= 2 && !डेटा.सुदारणाप्रतिसाद) { ctx.addIssue({ कोड: "सानुकूल", मार्ग:["improvementFeedback"], message: "कृपा करून आमकां कितें सुदारचें तें सांगात" }); }});

निर्यात प्रकार FormData = z.infer ;

वापरप्याचें नांव आनी पासवर्ड सशर्तपणान गरजेचे आसले तरी पर्यायी() म्हणून टायप केल्यात हें लक्षांत घेयात कारण Zod ची प्रकार-पातळेची येवजण वस्तूच्या आकाराचें वर्णन करता, क्षेत्रां केन्ना म्हत्वाचीं थारतात तें नियंत्रीत करपी नेम न्हय. सशर्त गरज superRefine भितर रावचें पडटा, जी आकार प्रमाणीत जाले उपरांत चलता आनी पुराय वस्तूक प्रवेश मेळटा. तें वेगळेपण हें एक दोश न्हय; it’s just what the tool is designed for: superRefine म्हणल्यार जेन्ना क्रॉस-फील्ड लॉजिक वता जेन्ना ती येवजण संरचनेंतच व्यक्त करूंक मेळना. हांगासरय उल्लेखनीय म्हणल्यार ही येवजण कितें व्यक्त करीना. तातूंत पानांची संकल्पना ना, खंयचीं क्षेत्रां खंयच्या बिंदूचेर दिसतात हाची संकल्पना ना आनी नेव्हिगेशनाची संकल्पना ना. तें सगळें खंय तरी जियेतलें. फॉर्म घटक

आयात { useForm, useWatch } from "react-hook-form";import { zodResolver } from "@hookform/resolvers/zod";import { useMutation } from "@tanstack/react-query";import { useState, useMemo } from "react";आयात { formSchema, type FormData } from "./schema";

const STEPS = ["तपशील", "ऑर्डर", "खातें", "पुनरावलोकन"];

प्रकार ऑर्डरपेलोड = फॉर्मडेटा & { उपएकूण: संख्या; कर: संख्या; एकूण: संख्या };

निर्यात फंक्शन RHFMultiStepForm () { const [पांवडो, setStep] = useState (0);

const उत्परिवर्तन = useMutation ({ mutationFn: async (पेलोड: ऑर्डरपेलोड) => { const res = वाट पळोवचें fetch ("/ api / आदेश", { पद्दत: "पोस्ट", headers: { "सामग्री-प्रकार": "ऍप्लिकेशन/json" }, शरीर: JSON.stringify (पेलोड), }); if (!res.ok) throw new Error("सबमिट करपाक अपेस आयलें"); res.json () परत करचें; }, ४. });

const { रजिस्टर, नियंत्रण, handleSubmit, formState: { त्रुटी }, } = useForm ({ रिझोल्वर: zodResolver (formSchema), defaultValues: { किंमत: 0, प्रमाण: 1, करदर: 0.1, समाधान: 3, hasAccount: "ना", }, }); const किंमत = useWatch ({ नियंत्रण, नांव: "किंमत" }); const quantity = useWatch ({ नियंत्रण, नांव: "प्रमाण" }); const taxRate = useWatch ({ नियंत्रण, नांव: "करदर" }); const hasAccount = useWatch ({ नियंत्रण, नांव: "खातें आसा" }); const समाधान = useWatch ({ नियंत्रण, नांव: "समाधान" }); const subtotal = useMemo (() => (किंमत ?? 0) * (प्रमाण ?? 1), [किंमत, प्रमाण]); const कर = useMemo (() => उपएकूण * (करदर ?? 0), [उपएकूण, करदर]); const एकूण = useMemo (() => उपएकूण + कर, [उपएकूण, कर]); const onSubmit = (डेटा: FormData) => mutation.mutate ({ ...डेटा, उपएकूण, कर, एकूण }); const showSubmit = (पांवडो === 2 && एकूण < 100) || (पांवडो === 3 && एकूण >= 100)

return (

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

{step === 1 && ( <> <इनपुट प्रकार="क्रमांक" {...register("किंमत", { valueAsNumber: true })} />

उपएकूण: {उपएकूण}
कर: {कर}
एकूण: {एकूण}
)}

{step === 2 && ( <>

{hasAccount === "होय" && ( <> )}

{समाधान >= 4 && (