ဤဆောင်းပါးသည် SurveyJS မှပံ့ပိုးကူညီမှုတစ်ခုဖြစ်သည်။ React developer အများစုသည် ၎င်းကို ကျယ်လောင်စွာ မဆွေးနွေးဘဲ မျှဝေထားသော စိတ်ပိုင်းဆိုင်ရာ မော်ဒယ်တစ်ခု ရှိပါသည်။ ထိုပုံစံများသည် အမြဲတမ်း အစိတ်အပိုင်းများ ဖြစ်သင့်သည်။ ဆိုလိုသည်မှာ-

ဒေသဆိုင်ရာပြည်နယ်အတွက် React Hook ဖောင်ပုံစံ (အနည်းဆုံး ပြန်လည်တင်ဆက်မှုများ၊ သင့်လျော်သောအကွက်မှတ်ပုံတင်ခြင်း၊ မရှိမဖြစ်လိုအပ်သော အပြန်အလှန်တုံ့ပြန်မှု)။ အတည်ပြုခြင်းအတွက် Zod (ထည့်သွင်းမှုမှန်ကန်မှု၊ နယ်နိမိတ်အတည်ပြုမှု၊ အမျိုးအစား-ဘေးကင်းသော ပိုင်းခြားစိတ်ဖြာမှု)။ နောက်ခံလူအတွက် မေးခွန်းကို တုံ့ပြန်ပါ- တင်သွင်းမှု၊ ထပ်စမ်းခြင်း၊ ကက်ရှ်လုပ်ခြင်း၊ ဆာဗာစင့်ခ်လုပ်ခြင်း စသည်ဖြင့်။

ဖောင်အများစုအတွက် — သင့်အကောင့်ဝင်သည့်မျက်နှာပြင်များ၊ သင်၏ဆက်တင်စာမျက်နှာများ၊ သင်၏ CRUD ပုံစံများ — ၎င်းသည် အမှန်တကယ်အလုပ်လုပ်သည်။ အပိုင်းတစ်ခုစီသည် ၎င်း၏အလုပ်ဖြစ်ပြီး ၎င်းတို့သည် သန့်ရှင်းသပ်ရပ်စွာ ရေးဖွဲ့ကာ သင့်ထုတ်ကုန်ကို အမှန်တကယ် ကွဲပြားစေသည့် သင့်လျှောက်လွှာ၏ အစိတ်အပိုင်းများသို့ သင်ဆက်လက်လုပ်ဆောင်နိုင်သည်။ သို့သော် ခဏကြာတိုင်း၊ အစောပိုင်းအဖြေများအပေါ် မူတည်သော မြင်နိုင်စွမ်းဆိုင်ရာ စည်းမျဉ်းများကဲ့သို့သော အရာများကို ဖောင်တစ်ခုက စတင်စုဆောင်းသည်၊ သို့မဟုတ် အကွက်သုံးခုကို ဖြတ်၍ ဆင်းသက်လာခဲ့သည့် တန်ဖိုးများဖြစ်သည်။ လည်ပတ်နေသည့် စုစုပေါင်းအပေါ်အခြေခံ၍ ကျော်သွားသင့်သည် သို့မဟုတ် ပြသသင့်သည့် စာမျက်နှာတစ်ခုလုံးပင် ဖြစ်နိုင်သည်။ သင်သည် ပထမအခြေနေကို useWatch နှင့် inline ဌာနခွဲတစ်ခုဖြင့် ကိုင်တွယ်သည်၊ ကောင်းပါသည်။ နောက်တစ်ခု။ ထို့နောက် သင်၏ Zod schema သည် ပုံမှန်နည်းလမ်းဖြင့် မဖော်ပြနိုင်သော cross-field စည်းမျဉ်းများကို encode လုပ်ရန် superRefine ကို သင်ရောက်ရှိနေပါသည်။ ထို့နောက် ခြေလှမ်းလမ်းညွှန်မှုသည် လုပ်ငန်းဆိုင်ရာ ယုတ္တိဗေဒကို ပေါက်ကြားလာသည်။ တစ်ချိန်ချိန်တွင် သင်သည် သင်တည်ဆောက်ထားသည်ကို ကြည့်ရှုပြီး ဖောင်သည် အမှန်တကယ် UI မဟုတ်တော့ကြောင်း သဘောပေါက်လာသည်။ ၎င်းသည် ဆုံးဖြတ်ချက်ချခြင်းလုပ်ငန်းစဉ်ထက် ပိုမိုပြီး အစိတ်အပိုင်းသစ်ပင်သည် ၎င်းကိုသိမ်းဆည်းရန် သင်ဖြစ်ပျက်ခဲ့သည့်နေရာဖြစ်သည်။ ဒါက React မှာရှိတဲ့ ပုံစံတွေအတွက် စိတ်ပိုင်းဆိုင်ရာ စံနမူနာကို ပျက်ပြားသွားစေပြီး ဒါဟာ ဘယ်သူမှ အပြစ်မရှိဘူးလို့ ကျွန်တော်ထင်ပါတယ်။ RHF + Zod stack သည် ၎င်းအတွက် ဒီဇိုင်းထုတ်ထားသည့်အတွက် အလွန်ကောင်းမွန်ပါသည်။ ပြဿနာက ကျွန်ုပ်တို့သည် ၎င်းကို ၎င်း၏ abstraction များ ပြဿနာနှင့် ကိုက်ညီသည့် နေရာကို ကျော်လွန်၍ သုံးစွဲလေ့ရှိသောကြောင့် အခြားရွေးချယ်စရာသည် ပုံစံများအကြောင်း လုံးဝကွဲပြားစွာ တွေးတောပုံမျိုး လိုအပ်သောကြောင့် ဖြစ်သည်။ ဤဆောင်းပါးသည် ထိုရွေးချယ်စရာအကြောင်းဖြစ်သည်။ ၎င်းကိုပြသရန်၊ ကျွန်ုပ်တို့သည် အတိအကျတူညီသော အဆင့်များစွာပုံစံကို နှစ်ကြိမ်တည်ဆောက်ပါမည်-

တင်သွင်းမှုအတွက် React Hook Form + Zod ကြိုးဖြင့် တုံ့ပြန်ခြင်း၊ ဖောင်တစ်ခုအား ဒေတာ—ရိုးရှင်းသော JSON schema — အစိတ်အပိုင်းသစ်တစ်ခုထက်မဟုတ်ဘဲ ဖောင်တစ်ခုအား ဒေတာအဖြစ် သတ်မှတ်သည့် SurveyJS ဖြင့်။

တူညီသောလိုအပ်ချက်များ၊ တူညီသောအခြေအနေဆိုင်ရာယုတ္တိဗေဒ၊ အဆုံးတွင်တူညီသော API ခေါ်ဆိုမှု။ ထို့နောက် ကျွန်ုပ်တို့သည် မည်သည့်ရွေ့လျားမှုနှင့် ကျန်ရစ်ခဲ့သည်ကို အတိအကျ မြေပုံဆွဲပြီး မည်သည့်မော်ဒယ်လ်ကို အသုံးပြုသင့်သည်၊ မည်သည့်အချိန်တွင် အသုံးပြုသင့်သည်ကို ဆုံးဖြတ်ရန် လက်တွေ့ကျသောနည်းလမ်းကို ရေးဆွဲပါမည်။ ကျွန်ုပ်တို့တည်ဆောက်နေသည့်ပုံစံ

ဤဖောင်တွင် အဆင့် 4 ဆင့်စီးဆင်းမှုကို အသုံးပြုပါမည်- အဆင့် 1- အသေးစိတ်

ပထမအမည် (လိုအပ်သည်)၊ အီးမေးလ် (လိုအပ်သည်၊ မှန်ကန်သောဖော်မတ်)။

အဆင့် 2: အမိန့်

ယူနစ်စျေးနှုန်း၊ ပမာဏ၊ အခွန်နှုန်း၊ ဆင်းသက်လာသည်- စုစုပေါင်း၊ ခွန်၊ စုစုပေါင်း။

အဆင့် 3- အကောင့်နှင့် တုံ့ပြန်ချက်

သင့်တွင်အကောင့်ရှိပါသလား။ (ဟုတ်/မဟုတ်) Yes → username + password နှစ်ခုစလုံး လိုအပ်ပါသည်။ အကယ်၍ No → အီးမေးလ်ကို အဆင့် ၁ တွင် စုဆောင်းထားပြီးဖြစ်သည်။

ကျေနပ်မှု အဆင့်သတ်မှတ်ချက် (၁-၅) ≥ 4 → "ဘာကြိုက်လဲ" မေးရင် အကယ်၍ ≤ 2 → “ကျွန်ုပ်တို့ ဘာတိုးတက်နိုင်မလဲ” လို့ မေးပါ။

အဆင့် 4- ပြန်လည်သုံးသပ်ပါ။

စုစုပေါင်း >= 100 သာ ပေါ်လာသည်။ နောက်ဆုံးတင်ပြချက်။

ဒါက အစွန်းမရောက်ဘူး။ ဒါပေမယ့် ဗိသုကာ ကွဲပြားမှုတွေကို ဖော်ထုတ်ဖို့ လုံလောက်ပါတယ်။ အပိုင်း 1- အစိတ်အပိုင်း-မောင်းနှင်ခြင်း (React Hook Form + Zod) တပ်ဆင်ခြင်း။ npm react-hook-form zod @hookform/resolvers @tanstack/react-query ကို ထည့်သွင်းပါ။

Zod Schema Zod schema ဖြင့်စကြပါစို့၊ အကြောင်းမှာ များသောအားဖြင့် ပုံစံ၏ပုံသဏ္ဍာန်သည် တည်ရှိရာနေရာဖြစ်သည်။ ပထမအဆင့်နှစ်ဆင့် — ကိုယ်ရေးကိုယ်တာအသေးစိတ်အချက်အလက်များနှင့် အမှာစာထည့်သွင်းမှုများ — အရာအားလုံးသည် ရိုးရိုးရှင်းရှင်းဖြစ်သည်- လိုအပ်သောစာကြောင်းများ၊ အနိမ့်ဆုံးနံပါတ်များနှင့် ကိန်းဂဏန်းတစ်ခု။ အခြေအနေဆိုင်ရာ စည်းမျဉ်းများကို ဖော်ပြရန် ကြိုးစားသောအခါ စိတ်ဝင်စားစရာကောင်းသည့် အပိုင်းသည် စတင်သည်။

"zod" မှ { z } တင်သွင်းပါ။

export const formSchema = z.object({ firstName: z.string().min(1, "Required"), email: z.string().email("Invalid email"), price: z.number().min(0), quantity: z.number().min(1), taxRate: z.number(), hasAccount: z.number(), hasAccount: z.enum", z.string().optional(), စကားဝှက်- z.string().optional(), ကျေနပ်မှု- z.number().min(1.max(5), positiveFeedback- z.string().optional(), improvementFeedback: z.string(.optional(),}).superRefine((data, ctx) {{if(data=hasAccount)="ifes"! ctx.addIssue({ ကုဒ်- "စိတ်ကြိုက်" လမ်းကြောင်း- ["အသုံးပြုသူအမည်"]၊ မက်ဆေ့ချ်- "လိုအပ်သည်" }); } if (!data.password || data.password.length < 6) { ctx.addIssue({ code: "စိတ်ကြိုက်", လမ်းကြောင်း: ["စကားဝှက်"], မက်ဆေ့ချ်- "Min } } );

if (data.satisfaction >= 4 && !data.positiveFeedback) { ctx.addIssue({ code: "custom", path: ["positiveFeedback"], message: "ကျေးဇူးပြု၍ share what you like" }); }

if (data.satisfaction <= 2 && !data.improvementFeedback) { ctx.addIssue({ ကုဒ်- "စိတ်ကြိုက်" လမ်းကြောင်း-["improvementFeedback"]၊ မက်ဆေ့ချ်- "တိုးတက်အောင်လုပ်ဆောင်ရမည့်အရာများကို ပြောပြပါ" }); }});

တင်ပို့မှုအမျိုးအစား FormData = z.infer;

Zod ၏ အမျိုးအစား-အဆင့် schema သည် အကွက်များအရေးပါသည့် စည်းမျဉ်းများမဟုတ်ဘဲ အရာဝတ္ထု၏ပုံသဏ္ဍာန်ကို ဖော်ပြသောကြောင့် အသုံးပြုသူအမည်နှင့် စကားဝှက်ကို စိတ်ကြိုက်ရွေးချယ်ခွင့်() အဖြစ် ရိုက်ထည့်ထားကြောင်း သတိပြုပါ။ ပုံသဏ္ဍာန်မှန်ကန်ကြောင်းအတည်ပြုပြီးသည့်နောက်တွင်လည်ပတ်သည့် superRefine တွင်အခြေအနေဆိုင်ရာလိုအပ်ချက်သည်နေထိုင်ရမည်ဖြစ်ပြီးအရာဝတ္ထုအပြည့်အစုံသို့ဝင်ရောက်နိုင်သည်။ ခွဲခွာခြင်းသည် အပြစ်အနာအဆာ မဟုတ်ပါ။ ၎င်းသည် ကိရိယာအတွက် ဒီဇိုင်းထုတ်ထားသည့်အရာသာဖြစ်သည်- superRefine သည် schema တည်ဆောက်ပုံကိုယ်နှိုက်တွင် မဖော်ပြနိုင်သည့်အခါ နယ်ပယ်စုံ ယုတ္တိဗေဒသည် သွားရာနေရာဖြစ်သည်။ ဤနေရာတွင် ထင်ရှားသောအချက်မှာ ဤအစီအစဉ်ကို မဖော်ပြခြင်းဖြစ်သည်။ ၎င်းတွင် စာမျက်နှာများ၏ အယူအဆမရှိ၊ မည်သည့်အကွက်များကို မြင်နိုင်သည်ဟူသော အယူအဆမရှိသလို၊ လမ်းညွှန်မှုဆိုင်ရာ အယူအဆလည်း မရှိပါ။ ဒါတွေအားလုံးက တခြားတစ်နေရာမှာ နေမယ်။ Form အစိတ်အပိုင်း

"react-hook-form" မှ { useForm ၊ useWatch } ကို တင်သွင်းပါ ၊ "@hookform/resolvers/zod" မှ { zodResolver } ကို တင်သွင်း ; "@tanstack/react-query" မှ { useMutation } မှ တင်သွင်း ; တင်သွင်း { useState ၊ useMemo } ထံမှ "react" } မှ "FormSchema; တင်သွင်းခြင်း" {form.D.Schema;

const STEPS = ["အသေးစိတ်", "အမိန့်", "အကောင့်", "သုံးသပ်ချက်"];

အမျိုးအစား OrderPayload = FormData & { subtotal: နံပါတ်; အခွန်: နံပါတ်; စုစုပေါင်း: နံပါတ် };

တင်ပို့သည့်လုပ်ဆောင်ချက် RHFMultiStepForm() { const [step, setStep] = useState(0);

const mutation = useMutation({ mutationFn: async (payload: OrderPayload) => { const res = wait fetch("/api/orders", { နည်းလမ်း- "POST", ခေါင်းစီးများ- { "Content-Type": "application/json" }၊ ကိုယ်ထည်- JSON.stringify(payload), }); အကယ်၍ (!res.ok) အမှားအသစ်ကို ပစ်ပါ("တင်သွင်းရန်မအောင်မြင်ပါ"); res.json(); }၊ });

const { မှတ်ပုံတင်ခြင်း၊ ထိန်းချုပ်ခြင်း၊ တင်သွင်းခြင်း၊ formState: { အမှားအယွင်းများ }, } = useForm({ ဖြေရှင်းသူ- zodResolver(formSchema), defaultValues- { price: 0, quantity: 1, taxRate: 0.1, ကျေနပ်မှု- 3", hasAccount: "No" } ); const price = useWatch({ ထိန်းချုပ်မှု၊ အမည်- "စျေးနှုန်း" }); const quantity = useWatch({ ထိန်းချုပ်မှု၊ အမည်- "အရေအတွက်" }); const taxRate = useWatch({ ထိန်းချုပ်မှု၊ အမည်- "taxRate" }); const hasAccount = useWatch({ ထိန်းချုပ်မှု၊ အမည်- "hasAccount" }); const satisfaction = useWatch({ ထိန်းချုပ်မှု၊ အမည်- "ကျေနပ်မှု" }); const subtotal = useMemo(() => (စျေးနှုန်း ?? 0) * (အရေအတွက် ?? 1), [price, quantity]); const tax = useMemo(() => စုစုပေါင်းအခွဲ * (taxRate ?? 0), [subtotal, taxRate]); const စုစုပေါင်း = useMemo(() => စုစုပေါင်း + အခွန်၊ [စုစုပေါင်း၊ အခွန်]); const onSubmit = (ဒေတာ- FormData) => mutation.mutate({ ...ဒေတာ၊ စုစုပေါင်း၊ အခွန်၊ စုစုပေါင်း }); const showSubmit = (အဆင့် === 2 && စုစုပေါင်း < 100) || (အဆင့် === 3 && စုစုပေါင်း >= 100)

return (

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

{step === 1 &&( <>

စုစုပေါင်း-စုစုပေါင်း- {subtotal}
အခွန်- {tax}
စုစုပေါင်း- {total}
)}

{step === 2 &&( <>

{hasAccount === "Yes" &&( <> <ထည့်သွင်း {...register("username")} placeholder="Username" /> )}

{ကျေနပ်မှု >= 4 && (