हा लेख SurveyJS द्वारे प्रायोजित आहे एक मानसिक मॉडेल आहे जे बहुतेक प्रतिक्रिया विकसक कधीही मोठ्याने चर्चा न करता सामायिक करतात. ते फॉर्म नेहमी घटक असावेत. याचा अर्थ असा स्टॅक आहे:
स्थानिक राज्यासाठी प्रतिक्रिया हुक फॉर्म (किमान री-रेंडर, एर्गोनॉमिक फील्ड नोंदणी, अनिवार्य परस्परसंवाद). प्रमाणीकरणासाठी झोड (इनपुट अचूकता, सीमा प्रमाणीकरण, टाइप-सेफ पार्सिंग). बॅकएंडसाठी प्रतिक्रिया क्वेरी: सबमिशन, पुन्हा प्रयत्न, कॅशिंग, सर्व्हर सिंक इ.
आणि बहुसंख्य फॉर्मसाठी — तुमची लॉगिन स्क्रीन, तुमची सेटिंग्ज पेज, तुमचे CRUD मॉडेल — हे खरोखर चांगले काम करते. प्रत्येक तुकडा त्याचे कार्य करतो, ते स्वच्छपणे तयार करतात आणि आपण आपल्या अनुप्रयोगाच्या भागांवर जाऊ शकता जे आपल्या उत्पादनामध्ये फरक करतात. परंतु प्रत्येक वेळी, एक फॉर्म पूर्वीच्या उत्तरांवर अवलंबून असलेल्या दृश्यमानतेचे नियम किंवा तीन फील्डमधून कॅस्केड होणारी व्युत्पन्न मूल्ये यासारख्या गोष्टी जमा करू लागतो. कदाचित संपूर्ण पृष्ठे जी वगळली जावीत किंवा चालू असलेल्या एकूण संख्येवर आधारित दर्शविली जावीत. तुम्ही युजवॉच आणि इनलाइन शाखेसह पहिले सशर्त हाताळता, जे ठीक आहे. मग दुसरा. मग तुम्ही क्रॉस-फील्ड नियम एन्कोड करण्यासाठी सुपररिफाइनपर्यंत पोहोचत आहात जे तुमचा Zod स्कीमा सामान्य पद्धतीने व्यक्त करू शकत नाही. नंतर, स्टेप नेव्हिगेशन व्यवसाय तर्क गळती सुरू होते. काही क्षणी, तुम्ही काय तयार केले आहे ते तुम्ही पाहता आणि लक्षात येते की फॉर्म आता खरोखर UI नाही. ही एक निर्णय प्रक्रिया आहे, आणि घटक वृक्ष आहे जिथे तुम्ही ते संग्रहित केले आहे. इथेच मला वाटते की प्रतिक्रिया मधील फॉर्म्सचे मानसिक मॉडेल खंडित होते आणि यात खरोखर कोणाचाही दोष नाही. RHF + Zod स्टॅक ज्यासाठी डिझाइन केले होते त्यामध्ये उत्कृष्ट आहे. समस्या अशी आहे की आम्ही ते वापरत राहण्याचा कल असतो जिथे त्याचे अमूर्त समस्येशी जुळतात कारण पर्यायाला पूर्णपणे फॉर्म्सबद्दल विचार करण्याच्या वेगळ्या पद्धतीची आवश्यकता असते. हा लेख त्या पर्यायाबद्दल आहे. हे दर्शविण्यासाठी, आम्ही तंतोतंत समान मल्टी-स्टेप फॉर्म दोनदा तयार करू:
React Hook Form + Zod सह React Query सबमिट करण्यासाठी वायर्ड, SurveyJS सह, जे फॉर्मला डेटा म्हणून हाताळते — एक साधा JSON स्कीमा — घटक वृक्षाऐवजी.
समान आवश्यकता, समान सशर्त तर्क, शेवटी समान API कॉल. मग आम्ही नेमके काय हलवले आणि काय राहिले याचा नकाशा बनवू आणि तुम्ही कोणते मॉडेल आणि कधी वापरायचे हे ठरवण्याचा एक व्यावहारिक मार्ग तयार करू. आम्ही तयार करत असलेला फॉर्म:
हा फॉर्म 4-चरण प्रवाह वापरेल: पायरी 1: तपशील
नाव (आवश्यक), ईमेल (आवश्यक, वैध स्वरूप).
पायरी 2: ऑर्डर करा
युनिट किंमत, प्रमाण, कर दर, व्युत्पन्न: उपएकूण, कर, एकूण.
पायरी 3: खाते आणि फीडबॅक
तुमचे खाते आहे का? (होय/नाही) होय असल्यास → वापरकर्तानाव + पासवर्ड, दोन्ही आवश्यक. जर नाही → ईमेल आधीच चरण 1 मध्ये संकलित केले आहे.
समाधान मानांकन (1-5) जर ≥ 4 → "तुम्हाला काय आवडले?" विचारले तर जर ≤ 2 → विचारले की "आम्ही काय सुधारू शकतो?"
पायरी 4: पुनरावलोकन करा
एकूण >= १०० असल्यासच दिसते अंतिम सबमिशन.
हे टोकाचे नाही. परंतु आर्किटेक्चरल फरक उघड करण्यासाठी ते पुरेसे आहे. भाग 1: घटक-चालित (प्रतिक्रिया हुक फॉर्म + झोड) स्थापना npm install react-hook-form zod @hookform/resolvers @tanstack/react-query
झोड स्कीमा चला Zod स्कीमा सह प्रारंभ करूया, कारण सामान्यतः तिथेच फॉर्मचा आकार स्थापित होतो. पहिल्या दोन चरणांसाठी — वैयक्तिक तपशील आणि ऑर्डर इनपुट — सर्वकाही सरळ आहे: आवश्यक स्ट्रिंग, किमान संख्या आणि एक एनम. जेव्हा आपण सशर्त नियम व्यक्त करण्याचा प्रयत्न करता तेव्हा मनोरंजक भाग सुरू होतो.
"zod" वरून { z } आयात करा;
निर्यात const formSchema = z.object({ firstName: z.string().min(1, "आवश्यक"), ईमेल: z.string().email("अवैध ईमेल"), किंमत: z.number().min(0), मात्रा: z.number().min(1), कर दर: z.number().min(1), करदर: z.cumber(", [Yumeunt(), आहे. "नाही"]), वापरकर्तानाव: z.string().optional(), पासवर्ड: z.string().optional(), satisfaction: z.number().min(1).max(5), positiveFeedback: z.string().optional(), improvementFeedback: z.string().optional(ef), ine(ct(fine), }(dai) = super. (data.hasAccount === "होय") { if (!data.username) { ctx.addIssue({ code: "custom", path: ["username"], message: "Required" }); } if (!data.password || data.password.length x. cuss{Ict: 6) ["पासवर्ड"], संदेश: "किमान 6 वर्ण" } });
जर (data.satisfaction >= 4 && !data.positiveFeedback) { ctx.addIssue({ code: "custom", path: ["positiveFeedback"], संदेश: "कृपया तुम्हाला काय आवडले ते शेअर करा" }); }
जर (data.satisfaction <= 2 && !data.improvementFeedback) { ctx.addIssue({ code: "custom", path:["improvementFeedback"], संदेश: "कृपया आम्हाला काय सुधारायचे ते सांगा" }); }});
निर्यात प्रकार FormData = z.infer
लक्षात घ्या की वापरकर्तानाव आणि संकेतशब्द सशर्त आवश्यक असला तरीही पर्यायी() म्हणून टाईप केले आहेत कारण Zod चा प्रकार-स्तरीय स्कीमा ऑब्जेक्टच्या आकाराचे वर्णन करते, फील्ड महत्त्वाच्या असताना नियमन करणारे नियम नाही. सशर्त आवश्यकता सुपररिफाइनमध्ये राहणे आवश्यक आहे, जे आकार प्रमाणित झाल्यानंतर चालते आणि पूर्ण ऑब्जेक्टमध्ये प्रवेश आहे. तो वियोग हा दोष नाही; हे साधन कशासाठी डिझाइन केले आहे ते आहे: सुपररिफाईन हे जेथे क्रॉस-फील्ड लॉजिक जाते जेव्हा ते स्कीमा स्ट्रक्चरमध्ये व्यक्त केले जाऊ शकत नाही. हे स्कीमा व्यक्त करत नाही ते येथे देखील उल्लेखनीय आहे. यात पृष्ठांची संकल्पना नाही, कोणत्या फील्ड्स कोणत्या बिंदूवर दृश्यमान आहेत याची कल्पना नाही आणि नेव्हिगेशनची संकल्पना नाही. ते सर्व कुठेतरी राहतील. फॉर्म घटक
"react-hook-form" वरून { useForm, useWatch } आयात करा; "@hookform/resolvers/zod" वरून { zodResolver } आयात करा; "@tanstack/react-query" वरून { useMutation } आयात करा; "react" वरून { useState, useMemo } आयात करा; "react" वरून { useState, useMemo } आयात करा; "maata" फॉर्म वरून आयात करा;
const STEPS = ["तपशील", "ऑर्डर", "खाते", "पुनरावलोकन"];
टाइप करा OrderPayload = FormData & { उपटोटल: संख्या; कर: संख्या; एकूण: संख्या };
निर्यात कार्य RHFMultiStepForm() { const [step, setStep] = useState(0);
const mutation = useMutation({ mutationFn: async (payload: OrderPayload) => { const res = आणण्याची प्रतीक्षा करा("/api/orders", { पद्धत: "पोस्ट", शीर्षलेख: { "सामग्री-प्रकार": "अनुप्रयोग/json" }, मुख्य भाग: JSON.stringify(पेलोड), }); जर (!res.ok) नवीन त्रुटी टाकली ("सबमिट करण्यात अयशस्वी"); res.json(); }, });
const { register, control, handleSubmit, formState: { errors }, } = useForm
परत करा (
);}Pen SurveyJS-03-RHF पहा [फोर्क केलेले] सिक्सटेक्टंक्शन. येथे बरेच काही घडत आहे, आणि गोष्टी कुठे संपल्या हे लक्षात घेणे कमी करणे योग्य आहे.
व्युत्पन्न मूल्ये — उपटोटल, कर, एकूण — घटकामध्ये UseWatch आणि useMemo द्वारे मोजले जातात कारण ते थेट फील्ड मूल्यांवर अवलंबून असतात आणि त्यांच्यासाठी दुसरे कोणतेही नैसर्गिक स्थान नाही. वापरकर्तानाव, पासवर्ड, सकारात्मक फीडबॅक आणि सुधारणा फीडबॅकसाठी दृश्यमानता नियम JSX मध्ये इनलाइन कंडिशनल म्हणून राहतात. स्टेप-स्किपिंग लॉजिक — एकूण >= 100 — शोसबमिट व्हेरिएबलमध्ये एम्बेड केलेले आणि स्टेप 3 वरील रेंडर कंडिशनमध्ये केवळ पुनरावलोकन पृष्ठ दिसते. नॅव्हिगेशन हे फक्त एक यूजस्टेट काउंटर आहे जे आम्ही व्यक्तिचलितपणे वाढवत आहोत. प्रतिक्रिया क्वेरी पुन्हा प्रयत्न, कॅशिंग आणि अवैधीकरण हाताळते. फॉर्म वैध डेटासह mutation.mutate कॉल करतो.
यापैकी काहीही चुकीचे नाही. ही अजूनही मुर्ख प्रतिक्रिया आहे, आणि RHF री-रेंडर कसे वेगळे करतो त्याबद्दल धन्यवाद. परंतु ज्याने हे लिहिले नाही अशा व्यक्तीला तुम्ही हे द्यायचे असेल आणि पुनरावलोकन पृष्ठ कोणत्या परिस्थितीत दिसते हे समजावून सांगायला सांगायचे असेल तर, त्यांना showSubmit, चरण 3 प्रस्तुत स्थिती आणि एनएव्ही बटण तर्क - तीन स्वतंत्र ठिकाणे - एका ओळीत नमूद केले जाऊ शकतील अशा नियमाची पुनर्रचना करणे आवश्यक आहे. फॉर्म कार्य करतो, होय, परंतु वर्तन प्रणाली म्हणून खरोखर निरीक्षण करण्यायोग्य नाही. ती मानसिकरित्या पार पाडावी लागते. महत्त्वाचे म्हणजे ते बदलण्यासाठी अभियांत्रिकीचा सहभाग आवश्यक आहे. अगदी छोटासा चिमटा, जसे की पुनरावलोकनाची पायरी दिसल्यावर समायोजित करणे, म्हणजे घटक संपादित करणे, प्रमाणीकरण अद्यतनित करणे, पुल विनंती उघडणे, पुनरावलोकनाची प्रतीक्षा करणे आणि पुन्हा तैनात करणे. भाग २: स्कीमा-चालित (सर्वेजेएस) आता स्कीमा वापरून समान प्रवाह तयार करू. स्थापना npm सर्वेक्षण-कोर सर्वेक्षण-प्रतिक्रिया-उआय @tanstack/react-query स्थापित करा
सर्वेक्षण-कोर एमआयटी-परवानाकृत प्लॅटफॉर्म-स्वतंत्र रनटाइम इंजिन जे SurveyJS च्या फॉर्म रेंडरिंगला सामर्थ्य देते - आम्हाला येथे महत्त्वाचा भाग आहे. हे JSON स्कीमा घेते, त्यातून एक अंतर्गत मॉडेल तयार करते आणि तुमच्या प्रतिक्रिया घटकामध्ये राहतील अशा सर्व गोष्टी हाताळते: दृश्यमानता अभिव्यक्तींचे मूल्यांकन करणे, व्युत्पन्न मूल्यांची गणना करणे, पृष्ठ स्थिती व्यवस्थापित करणे, प्रमाणीकरणाचा मागोवा घेणे आणि कोणती पृष्ठे प्रत्यक्षात दर्शविली गेली याचा अर्थ "पूर्ण" म्हणजे काय हे ठरवणे. सर्वेक्षण-प्रतिक्रिया-uiThe UI/रेंडरिंग स्तर जो त्या मॉडेलला प्रतिक्रियाशी जोडतो. हे मूलत: <सर्वे मॉडेल={मॉडेल} /> घटक आहे जे जेव्हा जेव्हा इंजिनची स्थिती बदलते तेव्हा पुन्हा प्रस्तुत होते. SurveyJS UI लायब्ररी Angular, Vue3 आणि इतर अनेक फ्रेमवर्कसाठी देखील उपलब्ध आहेत.
एकत्रितपणे, ते तुम्हाला नियंत्रण प्रवाहाची एक ओळ न लिहिता पूर्णपणे कार्यशील, एकाधिक-पृष्ठ फॉर्म रनटाइम देतात. आधी म्हटल्याप्रमाणे स्कीमा फॉरमॅट स्वतःच फक्त एक JSON आहे — DSL किंवा काहीही मालकी नाही. तुम्ही ते इनलाइन करू शकता, फाईलमधून आयात करू शकता, ते API वरून आणू शकता किंवा डेटाबेस कॉलममध्ये संग्रहित करू शकता आणि रनटाइममध्ये हायड्रेट करू शकता. समान फॉर्म, डेटा म्हणून येथे समान फॉर्म आहे, यावेळी JSON ऑब्जेक्ट म्हणून व्यक्त केला आहे. स्कीमा सर्वकाही परिभाषित करते: रचना, प्रमाणीकरण, दृश्यमानता नियम, व्युत्पन्न गणना, पृष्ठ नेव्हिगेशन — आणि रनटाइमच्या वेळी त्याचे मूल्यांकन करणाऱ्या मॉडेलकडे सोपवते. ते पूर्णतः कसे दिसते ते येथे आहे:
निर्यात const surveySchema = { शीर्षक: "ऑर्डर फ्लो", showProgressBar: "शीर्ष", पृष्ठे: [ { name: "तपशील", घटक: [ { type: "text", name: "firstName", isRequired: true }, { type: "text", name: "email", inputType: "email", isRequired: valid type: "email" , "equired: valid, val" }] } ] }, { नाव: "ऑर्डर", घटक: [ { प्रकार: "मजकूर", नाव: "किंमत", इनपुट प्रकार: "संख्या", डीफॉल्ट मूल्य: 0 }, { प्रकार: "मजकूर", नाव: "प्रमाण", इनपुट प्रकार: "संख्या", डीफॉल्ट मूल्य: 1 }, { प्रकार: "ड्रॉपडाउन",नाव: "करदर", डीफॉल्ट मूल्य: 0.1, निवडी: [ { मूल्य: 0.05, मजकूर: "5%" }, { मूल्य: 0.1, मजकूर: "10%" }, { मूल्य: 0.15, मजकूर: "15%" } ] }, { प्रकार: "अभिव्यक्ती", नाव: "{ताल}}, expression: "{ताल}}, expression: {ताल}} प्रकार: "अभिव्यक्ती", नाव: "कर", अभिव्यक्ती: "{subtotal} {taxRate}" }, { type: "expression", name: "total", expression: "{subtotal} + {tax}" } ] }, { name: "खाते", घटक: [ { type: "radiogroup", name: "hasoAc}", "hasAc}", "hasAc}", [YesAc}} type: "text", name: "username", visibleIf: "{hasAccount} = 'होय'", isRequired: true }, { type: "text", name: "password", inputType: "password", visibleIf: "{hasAccount} = 'होय'", isRequired: true: 6 text, valid, "Type:" "किमान 6 वर्ण" }] }, { प्रकार: "रेटिंग", नाव: "समाधान", दरमिनिम: 1, दर कमाल: 5 }, { प्रकार: "टिप्पणी", नाव: "पॉझिटिव्ह फीडबॅक", दृश्यमान असल्यास: "{समाधान} >= 4" }, { प्रकार: "टिप्पणी", नाव: "इम्फेक्शन}, "इम्फेक्शन}, "इम्फेक्शन} <= 2" } ] }, { नाव: "पुनरावलोकन", दृश्यमान असल्यास: "{एकूण} >= 100", घटक: [] } ]};
क्षणभर RHF आवृत्तीशी याची तुलना करा.
सशर्त वापरकर्तानाव आणि पासवर्ड आवश्यक असलेला सुपररिफाइन ब्लॉक निघून गेला आहे. visibleIf: "{hasAccount} = 'होय'" isRequired सह एकत्रित: खरे दोन्ही चिंता एकत्र हाताळते, फील्डवरच, जिथे तुम्ही त्यांना शोधण्याची अपेक्षा करता. useWatch + useMemo शृंखला जी सबटोटल, टॅक्स आणि टोटलची गणना करते ती तीन अभिव्यक्ती फील्डने बदलली जाते जी एकमेकांना नावाने संदर्भित करते. पुनरावलोकन पृष्ठ स्थिती, जी RHF आवृत्तीमध्ये फक्त showSubmit, चरण 3 प्रस्तुत शाखाद्वारे ट्रेस करून पुनर्रचना करण्यायोग्य होती. आणि शेवटी, एनएव्ही बटण लॉजिक एकच दृश्यमान आहेIf पृष्ठ ऑब्जेक्टवर गुणधर्म.
तिथेही तेच तर्क आहे. हे फक्त इतकेच आहे की स्कीमा त्याला राहण्यासाठी एक जागा देते जिथे ते घटकांमध्ये पसरण्याऐवजी अलगावमध्ये दृश्यमान आहे. तसेच, लक्षात घ्या की स्कीमा प्रकार वापरते: उप-टोटल, कर आणि एकूण साठी 'एक्स्प्रेशन'. अभिव्यक्ती केवळ-वाचनीय आहे आणि मुख्यतः गणना केलेली मूल्ये प्रदर्शित करण्यासाठी वापरली जाते. SurveyJS हे स्टॅटिक सामग्रीसाठी प्रकार: 'html' ला देखील समर्थन देते, परंतु गणना केलेल्या मूल्यांसाठी, अभिव्यक्ती ही योग्य निवड आहे. आता प्रतिक्रिया बाजूसाठी. प्रस्तुतीकरण आणि सबमिशन अगदी साधे. तुमच्या API वर त्याच प्रकारे वायर onComplete करा — UseMutation किंवा प्लेन फेच द्वारे:
"react" वरून { useState, useEffect, useRef } आयात करा; "@tanstack/react-query" वरून { useMutation } आयात करा; "सर्व्हे-कोर" वरून { मॉडेल } आयात करा; "सर्वे-रिएक्ट-ui" वरून { सर्वेक्षण } आयात करा; "सर्वे-कोर/सीएसएस"-आयात करा
एक्सपोर्ट फंक्शन सर्व्हेफॉर्म() { const [मॉडेल] = useState(() => नवीन मॉडेल(सर्वे स्कीमा));
const mutation = useMutation({ mutationFn: async (data) => { const res = आणण्याची प्रतीक्षा करा("/api/orders", { पद्धत: "पोस्ट", शीर्षलेख: { "सामग्री-प्रकार": "अनुप्रयोग/json" }, मुख्य भाग: JSON.stringify(डेटा), }); जर (!res.ok) नवीन त्रुटी टाकली ("सबमिट करण्यात अयशस्वी"); res.json(); }, });
const mutationRef = useRef(उत्परिवर्तन); mutationRef.current = उत्परिवर्तन; useEffect(() => { const handler = (sender) => mutationRef.current.mutate(sender.data); model.onComplete.add(handler); return () => model.onComplete.remove(handler); }, [मॉडेल]); // ref प्रत्येक रेंडर हँडलरची पुनर्-नोंदणी टाळते (उत्परिवर्तन ऑब्जेक्ट ओळख बदलते)
परत ( <> <सर्वे मॉडेल={मॉडेल} /> {mutation.isError &&
Pen SurveyJS-03-SurveyJS [फोर्क केलेले] सहाविषय पहा.
जेव्हा वापरकर्ता शेवटच्या दृश्यमान पृष्ठाच्या शेवटी पोहोचतो तेव्हा onComplete फायर होते. त्यामुळे जर एकूण कधीच १०० ओलांडले नाही आणि पुनरावलोकन पृष्ठ वगळले गेले, तरीही ते योग्यरित्या चालू होते कारण SurveyJS “अंतिम पृष्ठ” म्हणजे काय हे ठरवण्यापूर्वी दृश्यमानतेचे मूल्यांकन करते. त्यानंतर, sender.data मध्ये प्रथम श्रेणी फील्ड म्हणून गणना केलेल्या मूल्यांसह सर्व उत्तरे (उपटोटल, कर, एकूण) समाविष्ट आहेत, म्हणून API पेलोड RHF आवृत्ती onSubmit मध्ये मॅन्युअली असेंबल केलेल्या समान आहे. दmutationRef पॅटर्न सारखाच आहे जिथे तुम्हाला प्रत्येक रेंडरवर बदलणाऱ्या मूल्यावर स्थिर इव्हेंट हँडलरची आवश्यकता असते - त्याबद्दल सर्वेक्षणजेएस-विशिष्ट काहीही नाही.
प्रतिक्रिया घटकामध्ये यापुढे कोणतेही व्यावसायिक तर्क नाही. वॉचचा वापर नाही, सशर्त JSX नाही, स्टेप काउंटर नाही, मेमो चेन नाही, सुपररिफाइन नाही. प्रतिक्रिया हे प्रत्यक्षात चांगले आहे ते करत आहे: एक घटक प्रस्तुत करणे आणि ते API कॉलमध्ये वायरिंग करणे. काय प्रतिक्रिया बाहेर हलविले?
काळजी आरएचएफ स्टॅक सर्वेक्षण जेएस दृश्यमानता JSX शाखा दृश्यमान असल्यास व्युत्पन्न मूल्ये वॉच / मेमो वापरा अभिव्यक्ती क्रॉस-फील्ड नियम सुपर रिफाइन स्कीमा अटी नेव्हिगेशन चरण राज्य पृष्ठ दृश्यमान असल्यास नियम स्थान फायलींमध्ये वितरीत केले स्कीमा मध्ये केंद्रीकृत
React मध्ये जे राहते ते म्हणजे लेआउट, स्टाइलिंग, सबमिशन वायरिंग आणि ॲप इंटिग्रेशन, म्हणजेच रिॲक्ट ज्या गोष्टींसाठी डिझाइन केलेले आहे. बाकी सर्व काही स्कीमामध्ये हलवले गेले आणि स्कीमा हा फक्त JSON ऑब्जेक्ट असल्यामुळे, तो डेटाबेसमध्ये संग्रहित केला जाऊ शकतो, तुमच्या ऍप्लिकेशन कोडची स्वतंत्र आवृत्ती बनवू शकतो किंवा डिप्लॉय न करता अंतर्गत टूलिंगद्वारे संपादित केला जाऊ शकतो. उत्पादन व्यवस्थापक ज्याला पुनरावलोकन पृष्ठ ट्रिगर करणारा थ्रेशोल्ड बदलण्याची आवश्यकता आहे तो घटकाला स्पर्श न करता ते करू शकतो. संघांसाठी हा एक अर्थपूर्ण ऑपरेशनल फरक आहे जिथे फॉर्म वर्तन वारंवार विकसित होते आणि नेहमी अभियंते चालवत नाहीत. प्रत्येक दृष्टीकोन कधी वापरायचा? माझ्यासाठी काम करणारा हा एक चांगला नियम आहे: फॉर्म पूर्णपणे हटवण्याची कल्पना करा. आपण काय गमावाल?
ते स्क्रीन असल्यास, तुम्हाला घटक-चालित फॉर्म हवे आहेत. थ्रेशहोल्ड, ब्रँचिंग नियम आणि वास्तविक निर्णय एन्कोड करणाऱ्या सशर्त आवश्यकतांसारखे व्यवसाय तर्क असल्यास, तुम्हाला स्कीमा इंजिन हवे आहे.
त्याचप्रमाणे, जर तुमच्या मार्गावर येणारे बदल मुख्यतः लेबल, फील्ड आणि लेआउट बद्दल असतील, तर RHF तुम्हाला चांगले काम करेल. जर ते अटी, परिणाम आणि नियमांबद्दल असतील जे तुमच्या ऑपरेशन्स किंवा कायदेशीर टीमला तिकीट न भरता मंगळवारी दुपारी समायोजित करावे लागतील, तर SurveyJS सह स्कीमा मॉडेल अधिक प्रामाणिकपणे योग्य आहे. हे दोन दृष्टिकोन खरोखर एकमेकांशी स्पर्धा करत नाहीत. ते समस्यांच्या विविध वर्गांना संबोधित करतात, आणि टाळण्यासारखी चूक म्हणजे तर्काच्या वजनाशी अमूर्ततेशी जुळत नाही — नियम प्रणालीला घटकाप्रमाणे हाताळणे कारण ते परिचित साधन आहे, किंवा पॉलिसी इंजिनपर्यंत पोहोचणे कारण एक फॉर्म तीन पायऱ्यांपर्यंत वाढला आणि सशर्त फील्ड प्राप्त केले. आम्ही येथे तयार केलेला फॉर्म मुद्दाम सीमारेषेजवळ बसलेला आहे, फरक उघड करण्याइतपत गुंतागुंतीचा आहे परंतु इतका टोकाचा नाही की तुलनेमध्ये खडखडाट वाटेल. तुमच्या कोडबेसमध्ये अवास्तव असलेले बहुतेक वास्तविक स्वरूप कदाचित त्याच सीमारेषेजवळ बसतात आणि प्रश्न सामान्यतः फक्त हाच असतो की ते प्रत्यक्षात काय आहेत ते कोणी नाव दिले आहे का. React Hook Form + Zod वापरा जेव्हा:
फॉर्म CRUD-भिमुख आहेत; तर्कशास्त्र उथळ आणि UI-चालित आहे; अभियंते सर्व वर्तनाचे मालक आहेत; बॅकएंड सत्याचा स्रोत राहतो.
SurveJS वापरा जेव्हा:
फॉर्म व्यावसायिक निर्णय एन्कोड करतात; नियम UI पासून स्वतंत्रपणे विकसित होतात; तर्क दृश्यमान, ऑडिट करण्यायोग्य किंवा आवृत्तीत असणे आवश्यक आहे; गैर-अभियंता वर्तनावर प्रभाव पाडतात; समान फॉर्म एकाधिक फ्रंटएंडवर चालणे आवश्यक आहे.