ई लेख सर्वेजेएस के प्रायोजित बा एगो मानसिक मॉडल बा जवन अधिकतर रिएक्ट डेवलपर साझा करेलें बिना कबो जोर से चर्चा कइले. कि रूप हमेशा घटक होखे के चाहीं. एकर मतलब बा कि एगो ढेर जइसे कि:

स्थानीय राज्य खातिर रिएक्ट हुक फॉर्म (न्यूनतम रि-रेंडर, एर्गोनॉमिक फील्ड रजिस्ट्रेशन, जरूरी बातचीत)। सत्यापन खातिर ज़ोड (इनपुट सहीता, सीमा सत्यापन, प्रकार-सुरक्षित पार्सिंग)। बैकएंड खातिर रिएक्ट क्वेरी: सबमिशन, दोबारा कोशिश, कैशिंग, सर्वर सिंक, इत्यादि।

आ अधिकतर फॉर्म खातिर — राउर लॉगिन स्क्रीन, राउर सेटिंग पन्ना, राउर सीआरयूडी मोडल — ई वाकई बढ़िया काम करेला. हर टुकड़ा आपन काम करेला, ऊ साफ-सुथरा रचना करेला, आ रउरा अपना एप्लीकेशन के ओह हिस्सा पर जा सकेनी जवन असल में रउरा उत्पाद के अलगा करेला. बाकिर हर एक बेर कवनो फॉर्म में दृश्यता नियम जइसन चीज जमा होखे लागेला जवन पहिले के जवाब पर निर्भर करेला, भा व्युत्पन्न मान जवन तीन गो फील्ड में झरना के माध्यम से बहत रहेला. शायद पूरा पन्ना भी जवना के छोड़ दिहल जाव भा रनिंग टोटल के आधार पर देखावल जाव. रउआँ पहिला कंडीशनल के एगो useWatch आ एगो इनलाइन शाखा के साथ संभालेनी, जवन ठीक बा। फेर एगो अउरी। तब रउरा सुपररिफाइन के ओर बढ़ रहल बानी कि ऊ क्रॉस-फील्ड नियम के एन्कोड कर सके जवना के राउर ज़ोड स्कीमा सामान्य तरीका से ना व्यक्त कर सके. तब, स्टेप नेविगेशन में बिजनेस लॉजिक लीक होखे लागेला। कवनो समय रउरा जवन बनवले बानी ओकरा के देखब आ एहसास होला कि अब फार्म असल में यूआई नइखे. ई एगो निर्णय प्रक्रिया के अधिका ह, आ घटक पेड़ ठीक ओहिजा बा जहाँ संजोग से रउरा एकरा के संग्रहीत कइले रहीं. इहे ह जहाँ हमरा लागत बा कि रिएक्ट में फॉर्म खातिर मानसिक मॉडल टूट जाला, आ एहमें वाकई केहू के गलती नइखे. आरएचएफ + ज़ोड स्टैक जवना खातिर एकरा के डिजाइन कईल गईल रहे, ओकरा में बहुत बढ़िया बा। मुद्दा ई बा कि हमनी का एकर इस्तेमाल ओह बिंदु से आगे बढ़त रहेनी जा जहाँ एकर अमूर्तता समस्या से मेल खाला काहे कि विकल्प खातिर रूपन का बारे में पूरा तरह से सोचे के एगो अलग तरीका के जरूरत होला. ई लेख ओह विकल्प के बारे में बा। एकरा के देखावे खातिर हमनी के ठीक एकही मल्टी-स्टेप फॉर्म के दू बेर बनाइब जा:

रिएक्ट हुक फॉर्म + ज़ोड के रिएक्ट क्वेरी में सबमिशन खातिर तार कइल गइल बा, सर्वेक्षणजेएस के साथ, जवन कवनो फॉर्म के डेटा के रूप में मानेला — एगो साधारण जेएसओएन स्कीमा — ना कि घटक पेड़।

उहे आवश्यकता, उहे सशर्त तर्क, अंत में उहे एपीआई कॉल। एकरा बाद हमनी के ठीक से नक्शा बनाइब जा कि का हिलल आ का रह गइल, आ एगो व्यावहारिक तरीका तय करब जा कि रउरा कवन मॉडल के इस्तेमाल करे के चाहीं, आ कब. हमनी के जवन फार्म बनावत बानी जा:

एह फार्म में 4-चरण के प्रवाह के इस्तेमाल होई: चरण 1: विवरण के बारे में बतावल गइल बा

पहिला नाम (आवश्यक बा), . ईमेल (आवश्यक, वैध प्रारूप) के बा।

चरण 2: आदेश दिहल जाला

इकाई के दाम, 100 बा। मात्रा, 1999 के बा। कर दर, 1999 के बा। व्युत्पन्न भइल बा: उपकुल, 1999 के बा। कर, 1999 के बा। कुल मिला के बा।

चरण 3: खाता अउर प्रतिक्रिया

का रउरा लगे खाता बा? (हाँ/ना) के बा। अगर हाँ → यूजरनेम + पासवर्ड, दुनो के जरूरत बा। अगर ना → ईमेल चरण 1 में पहिले से एकट्ठा हो गइल बा।

संतुष्टि रेटिंग (1-5) के बा। अगर ≥ 4 → पूछीं “रउरा का पसंद आइल?” अगर ≤ 2 → पूछीं कि “हमनी के का सुधार कर सकेनी जा?”

चरण 4: समीक्षा करीं

तबे लउकेला जब कुल >= 100 होखे अंतिम प्रस्तुति के बा।

ई कवनो चरम बात नइखे. बाकिर वास्तुकला के अंतर के उजागर करे खातिर ई काफी बा. भाग 1: घटक-संचालित (रिएक्ट हुक फॉर्म + ज़ोड) के बा। इंस्टॉलेशन के बा npm रिएक्ट-हुक-फॉर्म ज़ोड @hookform/resolvers @tanstack/react-query इंस्टॉल करीं

ज़ोड योजना के बा शुरुआत ज़ोड स्कीमा से कइल जाव, काहे कि आमतौर पर ओहिजा रूप के आकार स्थापित हो जाला. पहिला दू गो स्टेप खातिर — पर्सनल डिटेल्स आ ऑर्डर इनपुट — सबकुछ सीधा बा: जरूरी स्ट्रिंग, न्यूनतम वाला नंबर, आ एगो एनम। दिलचस्प हिस्सा तब शुरू होला जब रउरा सशर्त नियम के व्यक्त करे के कोशिश करीं.

"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.number ().min (1). अधिकतम (5), सकारात्मकप्रतिक्रिया: z.string ().वैकल्पिक (), सुधारप्रतिक्रिया: z.string ().वैकल्पिक (),}).superRefine ((डेटा, ctx) => { अगर (डेटा.hasAccount === "हाँ") { अगर (! डेटा.उपयोगकर्ता नाम) { ctx.addIssue ({ कोड: "कस्टम", पथ: ["उपयोगकर्ता नाम"], संदेश: "आवश्यक" }); } if (! डेटा.पासवर्ड || डेटा.पासवर्ड.लंबाई < 6) { ctx.addIssue ({ कोड: "कस्टम", पथ: ["पासवर्ड"], संदेश: "Min 6 वर्ण" });

if (data.satisfaction >= 4 && !data.positiveFeedback) { ctx.addIssue({ कोड: "कस्टम", पथ: ["positiveFeedback"], संदेश: "कृपया उहे साझा करीं जवन रउआँ के पसंद आइल" }); } 1999 में भइल रहे।

अगर (डेटा.संतुष्टि <= 2 && !डेटा.सुधारप्रतिक्रिया) { ctx.addIssue ({ कोड: "कस्टम", पथ:["improvementFeedback"], message: "कृपया बताईं कि का सुधारल जा सकेला" }); }}) के बा;

निर्यात प्रकार फॉर्मडेटा = z.infer <फॉर्मस्कीमा के प्रकार>;

ध्यान दीं कि यूजरनेम आ पासवर्ड के वैकल्पिक() के रूप में टाइप कइल जाला भले ई सशर्त रूप से जरूरी होखे काहें से कि ज़ोड के टाइप-लेवल स्कीमा में ऑब्जेक्ट के आकार के वर्णन होला, ना कि फील्ड सभ के महत्व कब होखे के नियम के। सशर्त आवश्यकता के सुपररिफाइन के भीतर रहे के पड़े ला, जवन आकृति के मान्यता के बाद चले ला आ पूरा ऑब्जेक्ट तक पहुँच होला। ऊ अलगाव कवनो खामी ना ह; ई बस उहे बा जवना खातिर टूल के डिजाइन कइल गइल बा: superRefine ऊ जगह हवे जहाँ क्रॉस-फील्ड लॉजिक जाला जब एकरा के खुद स्कीमा संरचना में व्यक्त ना कइल जा सके। इहाँ जवन बात इहो उल्लेखनीय बा ऊ ई कि एह योजना में का नइखे बतावल गइल. एकरा में पन्ना के कवनो अवधारणा नइखे, कवनो अवधारणा नइखे कि कवन क्षेत्र कवना बिंदु पर लउकेला आ नेविगेशन के कवनो अवधारणा नइखे. ऊ सब कहीं अउर जियत रही। फार्म घटक के बा

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

const STEPS = ["विवरण", "क्रम", "खाता", "समीक्षा"];

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

निर्यात फ़ंक्शन RHFMultiStepForm () { const [चरण, सेटस्टेप] = राज्य के इस्तेमाल करीं (0);

const उत्परिवर्तन = उत्परिवर्तन के उपयोग ({ mutationFn: एसिंक (पेलोड: ऑर्डरपेलोड) => { const res = इंतजार करीं ले आवे ("/ api / आदेश", { विधि: "पोस्ट", के बा। हेडर: { "सामग्री-प्रकार": "एप्लीकेशन/जेएसओएन" }, शरीर: JSON.stringify (पेलोड), के बा। }); if (!res.ok) throw new Error ("सबमिट करे में विफल"); रिटर्न res.json () के बा; }, 1999 के बा। });

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

return (

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

{स्टेप === 1 && ( <> <इनपुट प्रकार="नंबर" {...रजिस्टर ("मूल्य", { valueAsNumber: सही })} /> <इनपुट प्रकार="नंबर" {...रजिस्टर ("मात्रा", { valueAsNumber: सही })} /> <{...रजिस्टर ("करदर", { valueAsNumber: सही })}> <विकल्प चुनीं value="0.05">5% के बा

उपकुल: {उपकुल}
कर: {कर}
कुल: {कुल}
)}

{step === 2 && ( <>

{hasAccount === "हाँ" && ( <> )}

<इनपुट प्रकार = "नंबर" {... रजिस्टर ("संतुष्टि", { valueAsNumber: सही })} />

{संतुष्टि >= 4 && (