دا مقاله د SurveyJS لخوا سپانسر شوې ده دلته یو ذهني ماډل شتون لري چې ډیری د عکس العمل پراختیا کونکي پرته له دې چې په لوړ غږ بحث وکړي شریکوي. دا فورمې تل باید اجزا وي. دا پدې مانا ده چې یو سټیک لکه:
د محلي دولت لپاره د عکس العمل هوک فورمه (لږ تر لږه بیا رینډر، د ایرګونومیک ساحې ثبت، لازمي تعامل). د اعتبار لپاره زوډ (د ننوتلو سموالی، د حد تایید، د ډول خوندي تجزیه). د شالید لپاره د عکس العمل عکس العمل: سپارل ، بیا هڅه کول ، کیچ کول ، د سرور ترکیب ، او داسې نور.
او د ډیری فورمو لپاره - ستاسو د ننوتلو سکرینونه، ستاسو د ترتیباتو پاڼې، ستاسو د CRUD موډلونه - دا واقعیا ښه کار کوي. هره ټوټه خپله دنده ترسره کوي، دوی په پاکه توګه ترکیب کوي، او تاسو کولی شئ د خپل غوښتنلیک برخو ته لاړ شئ چې واقعیا ستاسو محصول توپیر کوي. مګر هر یو په یو وخت کې، فورمه د شیانو راټولول پیل کوي لکه د لید قواعد چې په پخوانیو ځوابونو پورې اړه لري، یا ترلاسه شوي ارزښتونه چې د دریو برخو له لارې تیریږي. شاید حتی ټولې پاڼې چې باید پریښودل شي یا د چلولو مجموعې پراساس ښودل شوي. تاسو لومړی مشروط د UseWatch او انلاین څانګې سره اداره کوئ، کوم چې ښه دی. بیا بل. بیا تاسو د کراس فیلډ قواعد کوډ کولو لپاره سوپر ریفین ته ورسیږئ چې ستاسو د زوډ سکیما نشي کولی په نورمال ډول څرګند کړي. بیا، ګام نیویګیشن د سوداګرۍ منطق لیک پیل کوي. په ځینو وختونو کې، تاسو هغه څه وګورئ چې تاسو یې جوړ کړي او پوه شئ چې دا فورمه واقعیا UI نه ده. دا د پریکړې پروسه ډیره ده، او د برخې ونې یوازې هغه ځای دی چې تاسو یې د ذخیره کولو لپاره پیښ شوي. دا هغه ځای دی چې زه فکر کوم په عکس العمل کې د شکلونو لپاره ذهني ماډل ماتیږي ، او دا واقعیا د هیچا ګناه نه ده. د RHF + Zod سټیک د هغه څه لپاره خورا ښه دی چې د دې لپاره ډیزاین شوی و. مسله دا ده چې موږ د دې ټکي څخه تیریدو ته دوام ورکوو چیرې چې د دې خلاصون له ستونزې سره سمون لري ځکه چې بدیل په بشپړ ډول د فورمو په اړه مختلف فکر کولو ته اړتیا لري. دا مقاله د دې بدیل په اړه ده. د دې ښودلو لپاره، موږ به ورته ورته څو مرحلې فارم دوه ځله جوړ کړو:
د عکس العمل هوک فورمې سره + زوډ د سپارلو لپاره د عکس العمل پوښتنې ته واستول، د SurveyJS سره، کوم چې د ډیټا په توګه فورمه درملنه کوي - یو ساده JSON سکیما - د برخې ونې پرځای.
ورته اړتیاوې، ورته شرطي منطق، په پای کې ورته API کال. بیا به موږ په سمه توګه نقشه وکړو چې څه حرکت شوي او څه پاتې دي، او د دې پریکړه کولو لپاره یوه عملي لاره جوړه کړو چې کوم ماډل باید وکاروئ، او کله. هغه فورمه چې موږ یې جوړوو:
دا فورمه به د 4 مرحلې جریان کاروي: مرحله 1: توضیحات
لومړی نوم (اړین) بریښنالیک (اړین، باوري بڼه).
2 ګام: امر
د واحد قیمت، مقدار، د مالیاتو کچه، اخستل شوي: فرعي مجموعه مالیه، ټول.
3 ګام: حساب او فیډبیک
ایا تاسو حساب لرئ؟ (هو/نه) که هو → کارن-نوم + پټنوم، دواړه اړین دي. که نه وي → بریښنالیک دمخه په لومړي ګام کې راټول شوی.
د رضایت درجه (1-5) که چیرې ≥ 4 → وپوښتئ "څه مو خوښ کړل؟" که ≤ 2 → وپوښتئ چې "موږ څه ښه کولی شو؟"
4 ګام: بیاکتنه
یوازې ښکاره کیږي که چیرې ټولټال >= 100 وي وروستنۍ سپارنه.
دا افراط نه دی. مګر دا د معمارۍ توپیرونو څرګندولو لپاره کافي دی. برخه 1: د اجزاو چلول (د عکس العمل هک فورمه + زوډ) نصب کول npm انسټالول react-hook-form zod @hookform/resolvers @tanstack/react-query
زود سکیما راځئ چې د زوډ سکیما سره پیل وکړو، ځکه چې دا معمولا هغه ځای دی چې د فارم شکل رامینځته کیږي. د لومړیو دوو مرحلو لپاره - شخصي توضیحات او د ترتیب کولو معلومات - هرڅه سم دي: اړین تارونه، شمیرې لږ تر لږه، او یو اینوم. په زړه پورې برخه هغه وخت پیل کیږي کله چې تاسو د شرطي قواعدو څرګندولو هڅه وکړئ.
واردول {z } له "zod" څخه؛
د صادرولو کانسټ فارم سکیما = z.object({لومړی نوم: z.string().min(1، "اړین")، بریښنالیک: z.string().email("ناسلي بریښنالیک")، بیه: z.number().min(0)، مقدار: z.number().min(1)، د مالیې نرخ: z.number().min(1)، د مالیې نرخ: z.number(:")، . "نه"])، کارن-نوم: z.string().اختیاري()، پټنوم: z.string().optional()، اطمینان: z.number().min(1).max(5)، positive Feedback: z.string().optional() , improvement Feedback: z.string().optional(ef)، ct(fine) = (fine)) super = (data.hasAccount === "هو") { که (!data.username) { ctx.addIssue({ code: "custom", path: ["usenname"], message: "Required" }); ["پاسورډ"]، پیغام: "لږ تر لږه 6 حروف" } });
که (data.satisfaction>= 4 && !data.positiveFeedback) { ctx.addIssue({ code: "custom", path: ["positive Feedback"]، پیغام: "مهرباني وکړئ هغه څه شریک کړئ چې تاسو یې خوښوي" }); }
که (data.satisfaction <= 2 && !data.improvementFeedback) { ctx.addIssue({ کوډ: "کسټم"، لاره:["improvementFeedback"]، پیغام: "مهرباني وکړئ موږ ته ووایاست چې څه ښه کړو" }); }});
د صادراتو ډول FormData = z.infer
په یاد ولرئ چې د کارونکي نوم او پټنوم د اختیاري () په توګه ټایپ شوي که څه هم دوی په مشروط ډول اړین دي ځکه چې د زوډ ډول کچې سکیما د څیز شکل بیانوي ، نه هغه مقررات چې اداره کوي کله چې ساحې مهمې وي. شرطي اړتیا باید د سوپر ریفین دننه ژوند وکړي، کوم چې د شکل تایید وروسته پرمخ ځي او بشپړ اعتراض ته لاسرسی لري. دا بېلتون کومه نیمګړتیا نه ده؛ دا یوازې هغه څه دي چې وسیله د دې لپاره ډیزاین شوې: سوپر ریفین هغه ځای دی چیرې چې د کراس فیلډ منطق ځي کله چې دا پخپله د سکیما جوړښت کې څرګند نشي. هغه څه چې دلته هم د پام وړ دي هغه څه دي چې دا سکیما نه څرګندوي. دا د مخونو هیڅ مفهوم نلري، هیڅ مفهوم نلري چې کوم ساحې په کوم ځای کې لیدل کیږي، او د نیویګیشن هیڅ مفهوم نلري. دا ټول به په بل ځای کې ژوند وکړي. د فورمې اجزا
وارد کړئ { useForm, useWatch } له "react-hook-form" څخه؛ وارد کړئ { zodResolver } له "@hookform/resolvers/zod" څخه؛ وارد کړئ { useMutation } له "@tanstack/react-query" څخه؛ وارد کړئ { useState, useMemo } له "react" څخه؛ وارد کړئ { useState, useMemo } له "react" څخه؛ د schema } فورمه وارد کړئ.
const STEPS = ["تفصیلات"، "حکم"، "حساب"، "بیاکتنه"]؛
ډول OrderPayload = FormData & { فرعي مجموعه: شمیره; مالیه: شمیره مجموعه: شمېره };
د صادرولو فنکشن RHFMultiStepForm() { const [step, setStep] = useState(0);
const mutation = استعمال تغیر ({ mutationFn: async (payload: OrderPayload) => { const res = د راوړلو انتظار وکړئ("/api/orders"، { طریقه: "POST" سرلیکونه: { "د منځپانګې ډول": "application/json" }, بدن: JSON.stringify(payload) }); که (!res.ok) نوې تېروتنه وغورځوي("په سپارلو کې پاتې راغلی")؛ بیرته راګرځئ res.json(); }، });
const { راجستر، کنټرول، سمبالول، فورمه: { تېروتنې }، } = استعمال فارم
بیرته ستنیدنه (
);}د قلم سروې JS-03-RHF وګورئ [فورک شوی] د شپږم ختمیدو په واسطه. دلته ډیر څه پیښیږي، او دا د پام وړ ارزښت لري چې پوه شي چې شیان چیرته پای ته رسیدلي.
ترلاسه شوي ارزښتونه - فرعي مجموعه، مالیه، مجموعه - په اجزا کې د UseWatch او useMemo له لارې محاسبه کیږي ځکه چې دوی په ژوندیو ساحوي ارزښتونو پورې اړه لري او د دوی لپاره بل طبیعي ځای شتون نلري. د کارن-نوم، پټنوم، مثبت فیډبیک، او اصلاح فیډبیک لپاره د لید قواعد په JSX کې د انلاین شرایطو په توګه ژوند کوي. د ګام پریښودو منطق - د بیاکتنې پا pageه یوازې هغه وخت څرګندیږي کله چې مجموعه >= 100 - د showSubmit متغیر او په 3 مرحله کې د رینډر حالت کې ځای په ځای شوی وي. نیویګیشن پخپله یوازې د استعمال ریاست کاونټر دی چې موږ په لاسي ډول وده کوو. د عکس العمل پوښتنه د بیا تکرار کولو ، کیچ کولو او باطلولو اداره کوي. فورمه یوازې د تایید شوي معلوماتو سره mutation.mutate غږوي.
له دې څخه هیڅ یو غلط نه دی، په خپله. دا لا تر اوسه محاوره غبرګون دی، او برخه یې خورا فعاله ده مننه چې څنګه RHF بیا جلا کوي. مګر که تاسو دا یو چا ته سپارلی وای چې دا یې نه وي لیکلی او له دوی څخه یې وغواړئ چې تشریح کړي چې د بیاکتنې پا pageه په کوم شرایطو کې څرګندیږي ، دوی باید د showSubmit له لارې تعقیب کړي ، د 3 مرحلې رینډر حالت ، او د نیوی بټن منطق - درې جلا ځایونه - د داسې قاعدې بیا رغولو لپاره چې په یوه لیکه کې ویل کیدی شي. فورمه کار کوي، هو، مګر چلند واقعیا د سیسټم په توګه د معاینې وړ ندی. دا باید په ذهني توګه اعدام شي. تر ټولو مهم، د دې بدلول د انجینرۍ ښکیلتیا ته اړتیا لري. حتی یو کوچنی ټیک ، لکه تنظیم کول کله چې د بیاکتنې مرحله ښکاره شي ، پدې معنی چې د برخې ترمیم کول ، د اعتبار تازه کول ، د پلې غوښتنې خلاصول ، بیاکتنې ته انتظار کول ، او بیا ځای په ځای کول. برخه 2: د سکیما لخوا پرمخ وړل شوی (سرویJS) اوس راځئ چې د سکیما په کارولو سره ورته جریان رامینځته کړو. نصب کول npm د سروې-کور سروې-react-ui @tanstack/react-query نصب کړئ
سروې-کور د MIT- جواز لرونکی پلیټ فارم - خپلواک رن ټایم انجن چې د SurveyJS فارم رینډر کولو ځواک ورکوي - هغه برخه چې موږ یې دلته پاملرنه کوو. دا د JSON سکیما اخلي، له دې څخه یو داخلي ماډل جوړوي، او هر هغه څه اداره کوي چې بل ډول ستاسو د عکس العمل برخې کې ژوند کوي: د لید څرګندونه ارزول، د ترلاسه شوي ارزښتونو محاسبه، د پاڼې حالت اداره کول، د اعتبار تعقیب کول، او پریکړه کول چې "بشپړ" معنی لري چې کوم پاڼې واقعیا ښودل شوي. Survey-react-uiThe UI / رینډرینګ پرت چې دا ماډل د عکس العمل سره نښلوي. دا په اصل کې د <سروې ماډل={موډل} /> برخه ده چې هرکله چې د انجن حالت بدل شي بیا وړاندې کیږي. د SurveyJS UI کتابتونونه د Angular، Vue3، او ډیری نورو چوکاټونو لپاره هم شتون لري.
په ګډه، دوی تاسو ته د کنټرول جریان یوه کرښه لیکلو پرته په بشپړ ډول فعال، څو پاڼې فورمه د وخت وخت درکوي. د سکیما بڼه پخپله ده، لکه څنګه چې مخکې وویل، یوازې یو JSON - هیڅ DSL یا هیڅ شی ملکیت نلري. تاسو کولی شئ دا انلاین کړئ ، له فایل څخه یې وارد کړئ ، له API څخه یې راوړئ ، یا یې په ډیټابیس کالم کې ذخیره کړئ او د چلولو وخت کې یې هایډریټ کړئ. ورته فورمه، د معلوماتو په څیر دلته ورته بڼه ده، دا ځل د JSON اعتراض په توګه څرګند شوی. سکیما هر څه تعریفوي: جوړښت، اعتبار، د لید قواعد، اخیستل شوي محاسبې، د پاڼې نیویګیشن - او دا یو ماډل ته وسپاري چې دا د چلولو په وخت کې ارزوي. دلته هغه څه دي چې په بشپړ ډول ښکاري:
export const surveySchema = { سرلیک: "آرډر فلو"، showProgressBar: "top"، مخونه: [ { name: "تفصیلات"، عناصر: [ { type: "text"، name: "firstName" isRequired: true }, { type: "text", name: "email", inputType: "email", is Required: "required: idval text"، "Required: idval text" }] } ] }، { نوم: "حکم"، عناصر: [ { ډول: "متن"، نوم: "قیمت"، د انپټ ډول: "شمیر"، ډیفالټ ویلیو: 0 }، { ډول: "متن"، نوم: "مقدار"، د انپټ ډول: "شمیر"، ډیفالټ ارزښت: 1 }، { ډول: "ډراپډاون"،نوم: "د مالیې نرخ"، اصلي ارزښت: 0.1، انتخابونه: [ { ارزښت: 0.05، متن: "5٪" }، { ارزښت: 0.1، متن: "10٪" }، { ارزښت: 0.15، متن: "15٪" } ] }، { ډول: "اظهار"، نوم: "سپریم: {سبټو}}، "ایکسپریس:" {سبټو}} ډول: "اظهار"، نوم: "مالیه"، بیان: "{فرعي مجموعه} {taxRate}" }، { ډول: "اظهار"، نوم: "ټول"، بیان: "{فرعي مجموعه} + {مالیه}" } ] }، {نوم: "حساب"، عناصر: [ { ډول: "راډیو ګروپ"، نوم: "حساب:"، "انتخابات:" {YANC}، "انتخاب:" ډول: "متن"، نوم: "کارن نوم"، visibleIf: "{hasAccount} = 'هو'", isRequired: true }, { type: "text", name: "Password", inputType: "Password"، visibleIf: "{hasAccount} = 'هو'"، د اړتیا وړ: ریښتیني: 6 متن، متن، ټیکټ: 6، متن "لږ تر لږه 6 حروف" }] }، { ډول: "درجه"، نوم: "اطمینان"، شرح: 1، شرح اعظمي: 5 }، { ډول: "تبصره"، نوم: "مثبت فیډبیک"، visibleIf: "{اطمینان} >= 4" }، {ډول: "تبصره"، نوم: "تصدیق وړ"، "مطالعې وړ" <= 2" } ] }، { نوم: "بیاکتنه"، لیدل کیږي که: "{ټول}>= 100"، عناصر: [] } ]};
دا د یوې شیبې لپاره د RHF نسخه سره پرتله کړئ.
سوپر ریفین بلاک چې په مشروط ډول اړین کارن نوم او پټنوم ورک شوی دی. visibleIf: "{hasAccount} = 'هو'" د isRequired سره یوځای شوی: ریښتیا دواړه اندیښنې په ګډه اداره کوي، پخپله په ساحه کې، چیرته چې تاسو د موندلو تمه لرئ. د UseWatch + useMemo سلسله چې فرعي مجموعه، مالیه او مجموعه محاسبه کوي د دریو بیانونو ساحو لخوا ځای په ځای شوي چې د نوم په واسطه یو بل ته اشاره کوي. د بیاکتنې پاڼې حالت، کوم چې په RHF نسخه کې یوازې د showSubmit له لارې د بیارغونې وړ و، د 3 مرحلې رینڈر څانګه. او په نهایت کې، د nav تڼۍ منطق یو واحد لیدل کیږي که ملکیت په پاڼه اعتراض کې وي.
همدا منطق دی. دا یوازې دا دی چې سکیما دې ته د ژوند کولو ځای ورکوي چیرې چې دا په انزوا کې لیدل کیږي ، د برخې په اوږدو کې د خپریدو پرځای. همدارنګه، په یاد ولرئ چې سکیما ډول کاروي: 'اظهار' د فرعي مجموعې، مالیې، او مجموعي لپاره. بیان یوازې د لوستلو وړ دی او په عمده توګه د محاسبې ارزښتونو ښودلو لپاره کارول کیږي. SurveyJS د جامد منځپانګې لپاره د ډول: 'html' ملاتړ هم کوي، مګر د محاسبې ارزښتونو لپاره، بیان سم انتخاب دی. اوس د عکس العمل اړخ لپاره. وړاندې کول او سپارل ډیر ساده. خپل API ته په ورته ډول وائر کړئ - د میوټیشن یا ساده راوړلو له لارې:
وارد کړئ { useState, useEffect, useRef } له "react" څخه؛ وارد کړئ { useMutation } له "@tanstack/react-query" څخه؛ وارد کړئ {موډل } له "سروې-core" څخه وارد کړئ {سروې } له "سروې-react-ui" وارد کړئ؛ وارد کړئ "سروې-core.core/survey"؛ وارد کړئ
Export function SurveyForm() { const [model] = useState(() => نوی ماډل(سروی سکیما))؛
const mutation = استعمال تغیر ({ mutationFn: async (data) => { const res = د راوړلو انتظار وکړئ("/api/orders"، { طریقه: "POST" سرلیکونه: { "د منځپانګې ډول": "application/json" }, بدن: JSON.stringify(ډاټا)، }); که (!res.ok) نوې تېروتنه وغورځوي("په سپارلو کې پاتې راغلی")؛ بیرته راګرځئ res.json(); }، });
const mutationRef = useRef(mutation); mutationRef.current = بدلون useEffect(() => { const handler = (lender) => mutationRef.current.mutate(sender.data)؛ model.onComplete.add(handler)؛ بیرته () => model.onComplete.remove(handler)؛ }, [model]); // ref د هر رینډر هینډلر د بیا راجستر کولو څخه ډډه کوي (د بدلون څیز پیژندنه بدلون)
راستنېدل( <> د سروې ماډل={موډل} /> {mutation.isError &&
د قلم سروېJS-03-SurveyJS [فورک شوی] د شپږم ختمیدو په واسطه وګورئ.
په بشپړ ډول ډزې کوي کله چې کاروونکي د وروستي لیدل شوي پاڼې پای ته ورسیږي. نو که چیرې مجموعه هیڅکله له 100 څخه تجاوز ونه کړي او د بیاکتنې پاڼه پریښودل شي، دا لاهم په سمه توګه سوځي ځکه چې SurveyJS د "وروستي پاڼې" معنی د پریکړې کولو دمخه د لید ارزونه کوي. بیا، sender.data ټول ځوابونه د محاسبې ارزښتونو (فرعي مجموعه، مالیه، ټول) سره د لومړۍ درجې ساحې په توګه لري، نو د API تادیه د هغه څه سره ورته ده چې د RHF نسخه په لاسي ډول په onSubmit کې راټول شوي. دد mutationRef نمونه ورته ده چې تاسو به هر هغه ځای ته ورسیږئ چې تاسو د داسې ارزښت په اړه مستحکم پیښې اداره کونکي ته اړتیا لرئ چې په هر رینډر کې بدلیږي - د دې په اړه د سروېJS ځانګړي هیڅ ندي.
د عکس العمل برخه نور په هیڅ ډول د سوداګرۍ منطق نلري. دلته هیڅ کار نشته واچ ، نه مشروط JSX ، هیڅ ګام کاونټر نشته ، د میمو زنځیر نه کارول کیږي ، هیڅ سوپر ریفین نشته. عکس العمل هغه څه کوي چې واقعیا یې ښه دي: د یوې برخې وړاندې کول او د API کال ته یې تار کول. څه شی د عکس العمل څخه وتلی؟
اندیښنه د RHF سټیک SurveyJS لید د JSX څانګې ښکاره که ترلاسه شوي ارزښتونه useWatch / useMemo بیان د کراس فیلډ قواعد super Refine د سکیما شرایط نیویګیشن ګام حالت پاڼه لیدل کیږي که د حاکمیت ځای په فایلونو ویشل شوي په سکیما کې مرکزي شوی
هغه څه چې په عکس العمل کې پاتې کیږي د ترتیب ، سټایل کولو ، سپارلو تارونو ، او د اپلیکیشن ادغام دی ، کوم چې ویل کیږي ، هغه شیان چې عکس العمل واقعیا لپاره ډیزاین شوی. نور هرڅه سکیما ته لیږدول شوي ، او ځکه چې سکیما یوازې د JSON څیز دی ، دا په ډیټابیس کې زیرمه کیدی شي ، ستاسو د غوښتنلیک کوډ څخه په خپلواکه توګه نسخه شوی ، یا د ځای پرځای کولو اړتیا پرته د داخلي وسیلې له لارې ترمیم کیدی شي. د محصول مدیر چې اړتیا لري هغه حد بدل کړي چې د بیاکتنې پا pageه رامینځته کوي کولی شي دا د برخې لمس کولو پرته ترسره کړي. دا د ټیمونو لپاره معنی لرونکي عملیاتي توپیر دی چیرې چې د فارم چلند په مکرر ډول وده کوي او تل د انجینرانو لخوا نه پرمخ وړل کیږي. کله چې هره طریقه وکاروئ؟ دلته د ګوتو یو ښه قاعده ده چې زما لپاره کار کوي: په بشپړ ډول د فارم حذف کولو تصور وکړئ. تاسو به څه له لاسه ورکړي؟
که دا سکرینونه وي، تاسو د اجزاو لخوا پرمخ وړل شوي فارمونه غواړئ. که دا د سوداګرۍ منطق وي، لکه حد، د شاخ کولو قواعد، او شرطي اړتیاوې چې اصلي پریکړې کوډ کوي، تاسو د سکیما انجن غواړئ.
په ورته ډول، که ستاسو په لاره کې بدلونونه اکثرا د لیبلونو، ساحو او ترتیب په اړه وي، RHF به تاسو ته ښه خدمت وکړي. که دوی د شرایطو ، پایلو او مقرراتو په اړه وي چې ستاسو عملیات یا قانوني ټیم ممکن د سه شنبې په ماسپښین کې د ټکټ ډکولو پرته تنظیم کولو ته اړتیا ولري ، د SurveyJS سره د سکیما ماډل خورا صادق دی. دا دوه لارې په حقیقت کې د یو بل سره سیالي نه کوي. دوی د مختلفو طبقو ستونزو ته ګوته نیسي، او د مخنیوي وړ غلطی د منطق وزن سره د خلاصون سره سمون نه لري - د یوې برخې په څیر د قواعدو سیسټم درملنه ځکه چې دا پیژندل شوې وسیله ده، یا د پالیسۍ انجن ته رسیدل ځکه چې یوه فورمه درې مرحلو ته وده ورکړه او مشروط ساحه یې ترلاسه کړه. هغه فورمه چې موږ دلته جوړه کړې په قصدي ډول حد ته نږدې ناست دی، دومره پیچلی دی چې توپیر ښکاره کړي مګر دومره سخت نه وي چې پرتله کول د درغلیو احساس کوي. ډیری اصلي بڼې چې ستاسو په کوډبیس کې ناپاک شوي وي شاید ورته حد ته نږدې ناست وي، او پوښتنه معمولا یوازې دا ده چې ایا چا نوم ورکړی چې دوی واقعیا دي. د عکس العمل هوک فارم + زوډ وکاروئ کله چې:
فورمې د CRUD پر بنسټ دي؛ منطق کم دی او د UI لخوا پرمخ وړل کیږي؛ انجینران ټول چلند لري؛ شاته د حقیقت سرچینه پاتې ده.
SurveJS وکاروئ کله چې:
فورمې د سوداګرۍ پریکړې کوډ کوي؛ قواعد په خپلواکه توګه د UI څخه وده کوي؛ منطق باید ښکاره، د پلټنې وړ، یا نسخه وي؛ غیر انجینران په چلند اغیزه کوي؛ ورته فورمه باید په څو مخونو کې وګرځي.