ဤဆောင်းပါးသည် 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
return (
);}Pen SurveyJS-03-RHF [forked] ကို ဆဌမသွန်းခြင်းဖြင့် ကြည့်ပါ။ ဤနေရာတွင် များစွာဖြစ်ပျက်နေပြီး အရာများ ပြီးဆုံးသွားသည်ကို သတိပြုမိရန် နှောင့်နှေးသင့်သည်။
ရရှိလာသောတန်ဖိုးများ — စုစုပေါင်းအခွဲ၊ အခွန်၊ စုစုပေါင်း — ကို useWatch နှင့် useMemo မှတဆင့် အစိတ်အပိုင်းတွင် တွက်ချက်ထားသောကြောင့် ၎င်းတို့သည် တိုက်ရိုက်အကွက်တန်ဖိုးများပေါ်တွင် မူတည်ပြီး ၎င်းတို့အတွက် အခြားသဘာဝနေရာမရှိသောကြောင့်ဖြစ်သည်။ အသုံးပြုသူအမည်၊ စကားဝှက်၊ အပြုသဘောဆောင်သော တုံ့ပြန်ချက်နှင့် တိုးတက်မှုဆိုင်ရာ တုံ့ပြန်ချက်များအတွက် မြင်နိုင်မှုစည်းမျဉ်းများသည် JSX တွင် လိုင်းအခြေအနေသတ်မှတ်ချက်များအဖြစ် နေထိုင်ပါသည်။ အဆင့်-ကျော်သွားသော ယုတ္တိဗေဒ — စုစုပေါင်း >= 100 — ပြန်လည်သုံးသပ်သည့်စာမျက်နှာတွင်သာ ပေါ်လာသောအခါတွင် — showSubmit variable နှင့် အဆင့် 3 ရှိ တင်ဆက်မှုအခြေအနေတို့ကို ထည့်သွင်းထားသည်။ Navigation ကိုယ်တိုင်က ကျွန်ုပ်တို့ကိုယ်တိုင် တိုးနေသော useState တန်ပြန်တစ်ခုမျှသာဖြစ်သည်။ React Query သည် ပြန်လည်ကြိုးစားခြင်း၊ ကက်ရှ်ချခြင်းနှင့် တရားမဝင်ခြင်းတို့ကို ကိုင်တွယ်သည်။ ဖောင်တွင် အတည်ပြုထားသော အချက်အလက်ဖြင့် mutation.mutate ဟုသာခေါ်ဆိုပါသည်။
တစ်ခုမှမမှားပါဘူး။ ၎င်းသည် idiomatic React ဖြစ်နေဆဲဖြစ်ပြီး RHF isolated re-renders ကြောင့် အစိတ်အပိုင်းသည် အတော်လေး ကောင်းမွန်ပါသည်။ ဒါပေမယ့် သင်က ဒါကို မရေးထားတဲ့သူဆီ လွှဲပေးပြီး သုံးသပ်ချက်စာမျက်နှာမှာ ပေါ်လာတဲ့ အခြေအနေအောက်မှာ သူတို့ကို ရှင်းပြခိုင်းမယ်ဆိုရင်၊ သူတို့က showSubmit၊ အဆင့် 3 render condition နဲ့ nav button logic — သီးခြားနေရာသုံးခု— — တစ်ကြောင်းတည်းမှာဖော်ပြထားတဲ့ စည်းကမ်းချက်ကို ပြန်လည်တည်ဆောက်ဖို့အတွက် သူတို့ကို ခြေရာခံရပါမယ်။ ဖောင်သည် အလုပ်ဖြစ်သည်၊ သို့သော် အပြုအမူသည် စနစ်တစ်ခုအနေဖြင့် အမှန်တကယ် စစ်ဆေး၍မရပါ။ ဉာဏ်ဖြင့် စီရင်ရမည်။ ထို့ထက်အရေးကြီးသည်မှာ ၎င်းကိုပြောင်းလဲရာတွင် အင်ဂျင်နီယာပါဝင်မှု လိုအပ်ပါသည်။ ပြန်လည်သုံးသပ်မှုအဆင့် ပေါ်လာသည့်အခါ ချိန်ညှိခြင်းကဲ့သို့ သေးငယ်သော tweak သည် အစိတ်အပိုင်းကို တည်းဖြတ်ခြင်း၊ တရားဝင်မှုကို အပ်ဒိတ်လုပ်ခြင်း၊ ဆွဲထုတ်ခြင်းတောင်းဆိုချက်ကို ဖွင့်ခြင်း၊ ပြန်လည်သုံးသပ်ခြင်းကို စောင့်ဆိုင်းခြင်းနှင့် ထပ်မံအသုံးပြုခြင်းတို့ကို ဆိုလိုသည်။ အပိုင်း 2- Schema-Driven (SurveyJS) အခု schema ကိုသုံးပြီး တူညီတဲ့ flow ကို တည်ဆောက်ကြည့်ရအောင်။ တပ်ဆင်ခြင်း။ npm စစ်တမ်း-core survey-react-ui @tanstack/react-query ကို ထည့်သွင်းပါ။
survey-coreThe MIT-လိုင်စင်ရ ပလပ်ဖောင်း-အမှီအခိုကင်းသော runtime engine သည် SurveyJS ၏ပုံစံတင်ဆက်မှုကို အားကောင်းစေသည် — ဤနေရာတွင် ကျွန်ုပ်တို့အလေးထားသောအပိုင်း။ ၎င်းသည် JSON schema ကိုယူသည်၊ ၎င်းမှအတွင်းပိုင်းပုံစံတစ်ခုကိုတည်ဆောက်ကာ၊ သင်၏ React အစိတ်အပိုင်းတွင် အခြားမဟုတ်သည့်အရာအားလုံးကို ကိုင်တွယ်သည်- မြင်နိုင်မှုအသုံးအနှုန်းများကို အကဲဖြတ်ခြင်း၊ ဆင်းသက်လာသောတန်ဖိုးများကိုတွက်ချက်ခြင်း၊ စာမျက်နှာအခြေအနေအား စီမံခန့်ခွဲခြင်း၊ အတည်ပြုခြင်းအား ခြေရာခံခြင်းနှင့် မည်သည့်စာမျက်နှာများကို အမှန်တကယ်ပြသထားသည်ကို "ပြီးပြည့်စုံသည်" ဟူသည် အဘယ်အရာကိုဆိုလိုသည်များကို ဆုံးဖြတ်ခြင်း။
survey-react-uiThe model ကို React နဲ့ ချိတ်ဆက်ပေးတဲ့ UI/rendering layer ၎င်းသည် မရှိမဖြစ်လိုအပ်သော
၎င်းတို့သည် သင့်အား ထိန်းချုပ်စီးဆင်းမှုမျဉ်းတစ်ကြောင်းတည်းမရေးဘဲ အပြည့်အဝလုပ်ဆောင်နိုင်သော၊ စာမျက်နှာပေါင်းစုံပုံစံ runtime ကို ပေးပါသည်။ schema ဖော်မတ်ကိုယ်တိုင်က ယခင်ကပြောခဲ့သည့်အတိုင်း JSON တစ်ခုသာဖြစ်သည် — DSL သို့မဟုတ် မူပိုင်ခွင့်တစ်စုံတစ်ရာမရှိပါ။ ၎င်းကို လိုင်းသွင်းခြင်း၊ ဖိုင်တစ်ခုမှ တင်သွင်းခြင်း၊ API တစ်ခုမှ ရယူခြင်း သို့မဟုတ် ဒေတာဘေ့စ်ကော်လံတွင် သိမ်းဆည်းနိုင်ပြီး runtime တွင် ၎င်းကို ရေဓာတ်ဖြည့်ပေးနိုင်ပါသည်။ တူညီသောပုံစံ၊ ဒေတာအဖြစ် ဤသည်မှာ တူညီသောပုံစံဖြစ်သည်၊ ဤတစ်ကြိမ်တွင် JSON အရာဝတ္ထုအဖြစ် ဖော်ပြသည်။ schema သည် အရာအားလုံးကို သတ်မှတ်သည်- ဖွဲ့စည်းပုံ၊ အတည်ပြုချက်၊ မြင်နိုင်မှု စည်းမျဉ်းများ၊ တွက်ချက်မှုများ၊ စာမျက်နှာလမ်းညွှန်ခြင်း — နှင့် ၎င်းကို runtime တွင် အကဲဖြတ်သည့် Model တစ်ခုထံသို့ ပေးသည်။ အပြည့်အစုံမှာ အောက်ပါအတိုင်းဖြစ်သည်-
export const surveySchema = { title: "Order Flow", showProgressBar: "top", စာမျက်နှာများ- [ { name: "details", element: [ { type: "text", name: "firstName", isRequired: true }, { type: "text", name: "email", inputType: "email", is Required: [email, type: validators] } ] }, { အမည်- "မှာယူမှု", အစိတ်အပိုင်းများ- [ { အမျိုးအစား- "စာသား", အမည်- "စျေးနှုန်း", ထည့်သွင်းမှုအမျိုးအစား- "နံပါတ်", defaultValue: 0 }, { အမျိုးအစား- "စာသား", အမည်- "အရေအတွက်", ထည့်သွင်းမှုအမျိုးအစား: "နံပါတ်", ပုံသေတန်ဖိုး- 1 }, { အမျိုးအစား- "dropdown",အမည်- "taxRate", defaultValue: 0.1, ရွေးချယ်မှုများ- [ { value: 0.05, text: "5%" }, { value: 0.1, text: "10%" }, { value: 0.15, text: "15%" } ] }, { type: "expression", name: "subtotal", expression: "subtotal" } "expression", အမည်- "tax", expression- "{subtotal} {taxRate}" }, { type: "expression", name: "total", expression: "{subtotal} + {tax}" } ] }, { name: "account", elements: [ { type: "radiogroup", name: "hasAccount,} }, choices ", type:"Yes] "username", visibleIf: "{hasAccount} = 'Yes'", isRequired: true }, { type: "text", name: "password", inputType: "password", visibleIf: "{hasAccount} = 'Yes'", isRequired: true, validators: [{ type: "text", name: "password", inputType: "password", visibleIf: "{hasAccount} = 'Yes'", isRequired: true, validators: [{ type: "text: 6] } type, "inLength:" 6 "rating", name: "satisfaction", rateMin: 1, rateMax: 5 }, { type: "comment", name: "positiveFeedback", visibleIf: "{satisfaction} >= 4" }, { type: "comment", name: "improvementFeedback", visibleIf: "{satisfaction} <= 2" } "=viewto}", {0} [] } ]};
ဒါကို RHF ဗားရှင်းနဲ့ ခဏလောက် နှိုင်းယှဉ်ကြည့်ပါ။
အခြေအနေအရ လိုအပ်သော အသုံးပြုသူအမည်နှင့် စကားဝှက်ကို superRefine ပိတ်ဆို့ခြင်း မရှိတော့ပါ။ visibleIf: "{hasAccount} = 'Yes'" isRequired နှင့် ပေါင်းစပ်သည်- စစ်မှန်သော စိုးရိမ်ပူပန်မှုနှစ်ခုလုံးကို သင်ရှာဖွေရန် မျှော်လင့်ထားသည့် နယ်ပယ်တွင် ၎င်းတို့ကို အတူတကွ ကိုင်တွယ်သည်။ စုစုပေါင်းခွဲ၊ အခွန်နှင့် စုစုပေါင်းကို တွက်ချက်သော useWatch + useMemo ကွင်းဆက်ကို အမည်ဖြင့် ကိုးကားသော စကားရပ်သုံးရပ်ဖြင့် အစားထိုးထားသည်။ RHF ဗားရှင်းရှိ showSubmit၊ အဆင့် 3 တင်ဆက်မှုဌာနခွဲကို ခြေရာခံခြင်းဖြင့်သာ ပြန်လည်တည်ဆောက်နိုင်သည့် စာမျက်နှာအခြေအနေ။ နောက်ဆုံးအနေနှင့်၊ nav ခလုတ် logic သည် စာမျက်နှာအရာဝတ္တုပေါ်ရှိ visibleIf ပိုင်ဆိုင်မှုတစ်ခုဖြစ်သည်။
တူညီသောယုတ္တိရှိပါသည်။ ၎င်းသည် အစိတ်အပိုင်းအနှံ့ပျံ့နှံ့မည့်အစား အထီးကျန်စွာမြင်နေရသည့်နေရာတွင် နေထိုင်ရန် schema က ၎င်းအား ပေးရုံသာဖြစ်သည်။ ထို့အပြင်၊ schema သည် စုစုပေါင်းအခွဲ၊ အခွန်နှင့် စုစုပေါင်းအတွက် အမျိုးအစား- 'ဖော်ပြချက်' ကို အသုံးပြုကြောင်း သတိပြုပါ။ Expression သည် ဖတ်ရန်သာဖြစ်ပြီး တွက်ချက်ထားသောတန်ဖိုးများကိုပြသရန် အဓိကအားဖြင့်အသုံးပြုပါသည်။ SurveyJS သည် static content အတွက် အမျိုးအစား- 'html' ကို ပံ့ပိုးပေးသော်လည်း တွက်ချက်ထားသော တန်ဖိုးများအတွက်၊ expression သည် မှန်ကန်သော ရွေးချယ်မှုဖြစ်သည်။ အခု React ဘက်ကို။ တင်ဆက်ခြင်းနှင့် တင်ပြခြင်း။ အလွန်ရိုးရှင်းပါသည်။ တူညီသောနည်းလမ်းအတိုင်း သင်၏ API သို့ Wire onComplete — useMutation သို့မဟုတ် plain fetch-
"react" မှ တင်သွင်းခြင်း { useState, useEffect, useRef }; Import { useMutation } ထံမှ "@tanstack/react-query"; "survey-core" မှ { Model }; "survey-react-ui" မှ တင်သွင်း { Survey }; "survey-core/survey"-core;
တင်ပို့သည့်လုပ်ဆောင်ချက် SurveyForm() { const [model] = useState(() => new Model(surveySchema));
const mutation = useMutation({ mutationFn: async (ဒေတာ) => { const res = wait fetch("/api/orders", { နည်းလမ်း- "POST", ခေါင်းစီးများ- { "Content-Type": "application/json" }၊ စာကိုယ်- JSON.stringify(ဒေတာ)၊ }); အကယ်၍ (!res.ok) အမှားအသစ်ကို ပစ်ပါ("တင်သွင်းရန်မအောင်မြင်ပါ"); res.json(); }၊ });
const mutationRef = useRef(mutation); mutationRef.current = ဗီဇပြောင်းလဲခြင်း၊ useEffect(() => { const handler = (sender) => mutationRef.current.mutate(sender.data); model.onComplete.add(ကိုင်တွယ်သူ); return () => model.onComplete.remove( handler); }, [model]); // ref သည် render တိုင်းတွင် re-registering handler ကိုရှောင်ကြဉ်သည် (mutation object အထောက်အထားပြောင်းလဲမှုများ)
ပြန်လာ (
<>
Pen SurveyJS-03-SurveyJS [forked] ကို ဆဌမသွန်းခြင်းဖြင့် ကြည့်ပါ။
သုံးစွဲသူသည် နောက်ဆုံးမြင်ရသည့် စာမျက်နှာ၏အဆုံးသို့ ရောက်သောအခါတွင် ပြီးပြည့်စုံမှု ပျက်သွားပါသည်။ ထို့ကြောင့် စုစုပေါင်း 100 ကို ဘယ်တော့မှ မကျော်ဘဲ သုံးသပ်ချက် စာမျက်နှာကို ကျော်သွားပါက၊ SurveyJS သည် “နောက်ဆုံးစာမျက်နှာ” ဟူသည်ကို မဆုံးဖြတ်မီ မြင်နိုင်စွမ်းကို အကဲဖြတ်ပေးသောကြောင့် ၎င်းသည် မှန်ကန်နေသေးသည်။ ထို့နောက်၊ sender.data တွင် ပထမတန်းစားအကွက်များအဖြစ် တွက်ချက်ထားသော တန်ဖိုးများ (စုစုပေါင်း၊ အခွန်၊ စုစုပေါင်း) နှင့်အတူ အဖြေအားလုံးပါဝင်သည်၊ ထို့ကြောင့် API payload သည် onSubmit တွင် ကိုယ်တိုင်ထည့်သွင်းထားသည့် RHF ဗားရှင်းနှင့် တူညီပါသည်။ ဟိmutationRef ပုံစံသည် render တိုင်းတွင် ပြောင်းလဲသည့် တန်ဖိုးတစ်ခုထက် တည်ငြိမ်သော ဖြစ်ရပ်ကိုင်တွယ်သူ လိုအပ်သည့် နေရာတိုင်းအတွက် သင်ရောက်ရှိမည့် အတူတူပင်ဖြစ်သည် — ၎င်းနှင့်ပတ်သက်ပြီး SurveyJS အတိအကျမရှိပါ။
React အစိတ်အပိုင်းတွင် မည်သည့်လုပ်ငန်းဆိုင်ရာ ယုတ္တိမျှမပါဝင်တော့ပါ။ အသုံးပြုမှုမရှိသောနာရီ၊ သတ်မှတ်ချက် JSX မရှိ၊ ခြေလှမ်းကောင်တာမရှိ၊ အသုံးပြုမှု Memo ကွင်းဆက်မရှိ၊ superRefine မရှိပါ။ React သည် ၎င်းအတွက် အမှန်တကယ် ကောင်းမွန်သောအရာကို လုပ်ဆောင်နေသည်- အစိတ်အပိုင်းတစ်ခုကို တင်ဆက်ခြင်းနှင့် API ခေါ်ဆိုမှုတစ်ခုသို့ ကြိုးသွယ်ပေးခြင်း။ ဘယ်အရာက တုံ့ပြန်မှုကနေ ရုန်းထွက်ခဲ့လဲ။
စိုးရိမ်စရာ RHF Stack စစ်တမ်း JS မြင်နိုင်စွမ်း JSX အကိုင်းအခက် မြင်နိုင်ရင် တန်ဖိုးများ ဆင်းသက်လာသည်။ useWatch / useMemo အသုံးအနှုန်း နယ်ပယ်စုံစည်းမျဥ်းများ superRefin Schema အခြေအနေများ ညွှန်း အဆင့်ပြည်နယ် စာမျက်နှာ visibleIf စည်းကမ်းတည်နေရာ ဖိုင်များအနှံ့ ဖြန့်ဝေထားသည်။ schema တွင်ဗဟိုချုပ်ကိုင်ထားသည်။
React တွင်ကျန်ရှိနေသောအရာမှာ layout၊ styling၊ submission wiring နှင့် app ပေါင်းစည်းခြင်းဖြစ်သည်၊ ဆိုလိုသည်မှာ React သည် အမှန်တကယ်ပြုလုပ်ထားသည့်အရာများဖြစ်သည်။ အခြားအရာအားလုံးကို schema သို့ပြောင်းသွားသည်၊ နှင့် schema သည် JSON အရာဝတ္ထုတစ်ခုသာဖြစ်သောကြောင့်၊ ၎င်းကို ဒေတာဘေ့စ်တစ်ခုတွင် သိမ်းဆည်းထားနိုင်သည်၊ သင်၏အပလီကေးရှင်းကုဒ်၏ သီးခြားဗားရှင်းဖြင့် ပြုလုပ်နိုင်သည်၊ သို့မဟုတ် အသုံးပြုရန်မလိုအပ်ဘဲ စက်တွင်းတူးလ်ဖြင့် တည်းဖြတ်နိုင်သည်။ သုံးသပ်ချက်စာမျက်နှာကို အစပျိုးသည့် အတိုင်းအတာကို ပြောင်းလဲရန် လိုအပ်သော ထုတ်ကုန်မန်နေဂျာသည် အစိတ်အပိုင်းကို မထိဘဲ ၎င်းကို လုပ်ဆောင်နိုင်သည်။ ၎င်းသည် ပုံစံအမူအကျင့်များ မကြာခဏ ပြောင်းလဲနေပြီး အင်ဂျင်နီယာများက အမြဲတမ်း မောင်းနှင်ခြင်းမရှိသည့် အသင်းများအတွက် အဓိပ္ပါယ်ရှိသော လုပ်ငန်းဆောင်ရွက်မှု ကွာခြားချက်ဖြစ်သည်။ ချဉ်းကပ်မှုတစ်ခုစီကို ဘယ်အချိန်မှာ သုံးမလဲ။ ဤသည်မှာ ကျွန်ုပ်အတွက် အဆင်ပြေစေမည့် ကောင်းသောလက်မ၏ စည်းမျဉ်းဖြစ်ပါသည်- ဖောင်ကို လုံးဝဖျက်ပစ်ရန် စိတ်ကူးပါ။ သင်ဘာဆုံးရှုံးမှာလဲ။
၎င်းသည် ဖန်သားပြင်များဖြစ်ပါက သင်သည် အစိတ်အပိုင်းများမောင်းနှင်သည့် ပုံစံများကို လိုချင်သည်။ အကယ်၍ ၎င်းသည် သတ်မှတ်ချက်များ၊ အကိုင်းအခက်စည်းမျဉ်းများနှင့် စစ်မှန်သောဆုံးဖြတ်ချက်များကို ကုဒ်လုပ်သည့် အခြေအနေဆိုင်ရာ လိုအပ်ချက်များကဲ့သို့ လုပ်ငန်းယုတ္တိအရဆိုလျှင် သင်သည် schema အင်ဂျင်ကို လိုချင်ပါသည်။
အလားတူ၊ သင့်သွားရာလမ်းတွင် လာမည့်ပြောင်းလဲမှုများသည် အများအားဖြင့် အညွှန်းများ၊ အကွက်များနှင့် အပြင်အဆင်များအကြောင်းဖြစ်ပါက RHF သည် သင့်အား ကောင်းမွန်စွာဝန်ဆောင်မှုပေးပါသည်။ လက်မှတ်မတင်ဘဲ အင်္ဂါနေ့မွန်းလွဲပိုင်းတွင် သင့် ops သို့မဟုတ် ဥပဒေရေးရာအဖွဲ့မှ ပြင်ဆင်ရန်လိုအပ်သည့် အခြေအနေများ၊ ရလဒ်များနှင့် စည်းမျဉ်းများနှင့်ပတ်သက်ပါက၊ SurveyJS ပါသော schema model သည် ပိုမိုရိုးသားသင့်လျော်ပါသည်။ ဒီနည်းလမ်းနှစ်ခုဟာ တစ်ခုနဲ့တစ်ခု ပြိုင်ဆိုင်မှု မရှိပါဘူး။ ၎င်းတို့သည် မတူညီသောပြဿနာများကို ကိုင်တွယ်ဖြေရှင်းပေးကြပြီး ရှောင်ရှားထိုက်သည့်အမှားမှာ ယုတ္တိဗေဒ၏အလေးချိန်နှင့် မကိုက်ညီခြင်းဖြစ်သည် — ၎င်းသည် အကျွမ်းတဝင်ရှိသောကိရိယာဖြစ်သောကြောင့် စည်းမျဉ်းစနစ်အား အစိတ်အပိုင်းတစ်ခုကဲ့သို့ ဆက်ဆံခြင်း သို့မဟုတ် ပုံစံတစ်ခုသည် အဆင့်သုံးဆင့်အထိ ကြီးထွားလာပြီး အခြေအနေအရ နယ်ပယ်တစ်ခုကို ရယူထားသောကြောင့် မူဝါဒဆိုင်ရာအင်ဂျင်သို့ရောက်ရှိခြင်းဖြစ်သည်။ ဤနေရာတွင် ကျွန်ုပ်တို့တည်ဆောက်ထားသောပုံစံသည် နယ်နိမိတ်အနီးတွင် ခြားနားချက်ကို ဖော်ထုတ်နိုင်လောက်အောင် ရှုပ်ထွေးသော်လည်း နှိုင်းယှဥ်မှုသည် ကြမ်းတမ်းသည်ဟု ခံစားရလောက်အောင် ရှုပ်ထွေးမှုမရှိပါ။ သင့်ကုဒ်ဘေ့စ်တွင် မလှုပ်မယှက်ဖြစ်နေသော အစစ်အမှန်ပုံစံအများစုသည် ထိုတူညီသောနယ်နိမိတ်အနီးတွင် ရှိနေနိုင်ပြီး မေးခွန်းမှာ များသောအားဖြင့် ၎င်းတို့ကို မည်သူတစ်ဦးတစ်ယောက်မှ အမည်ပေးထားခြင်းရှိမရှိ မေးခွန်းပင်ဖြစ်သည်။ React Hook Form + Zod ကိုသုံးပါ-
ဖောင်များသည် CRUD ကို ဦးတည်သည်။ လော့ဂျစ်သည် တိမ်မြုပ်ပြီး UI ဖြင့် မောင်းနှင်သည်။ အင်ဂျင်နီယာများသည် အပြုအမူအားလုံးကို ပိုင်ဆိုင်သည်။ Backend သည် အမှန်တရား၏အရင်းအမြစ်ဖြစ်နေဆဲဖြစ်သည်။
SurveyJS ကို အသုံးပြုသည့်အခါ-
လုပ်ငန်းဆုံးဖြတ်ချက်များကို ကုဒ်နံပါတ်ပုံစံများ၊ စည်းမျဥ်းများသည် UI နှင့် အမှီအခိုကင်းစွာ ဖြစ်ထွန်းလာသည်၊ ယုတ္တိဗေဒသည် မြင်နိုင်၊ စစ်ဆေးနိုင်သော၊ သို့မဟုတ် ပုံစံကွဲဖြစ်ရမည်။ အင်ဂျင်နီယာမဟုတ်သော အပြုအမူအပေါ် လွှမ်းမိုးမှု၊ တူညီသောပုံစံသည် ရှေ့တန်းများစွာကိုဖြတ်၍ လုပ်ဆောင်ရပါမည်။