ይህ መጣጥፍ በ SurveyJS የተደገፈ ነው። ጮክ ብለው ሳይወያዩበት አብዛኞቹ React ገንቢዎች የሚያጋሩት የአእምሮ ሞዴል አለ። ያ ቅጾች ሁል ጊዜ አካላት መሆን አለባቸው። ይህ ማለት እንደዚህ ያለ ቁልል ማለት ነው።

ምላሽ መንጠቆ ቅጽ ለአካባቢው ግዛት (አነስተኛ ድጋሚ ሰሪዎች፣ ergonomic መስክ ምዝገባ፣ አስፈላጊ መስተጋብር)። ዞድ ለማረጋገጫ (የግቤት ትክክለኛነት ፣ የወሰን ማረጋገጫ ፣ ዓይነት-አስተማማኝ ትንተና)። ለድጋፍ ጥያቄ ምላሽ ይስጡ፡ ማስገባት፣ እንደገና መሞከር፣ መሸጎጫ፣ የአገልጋይ ማመሳሰል እና የመሳሰሉት።

እና ለአብዛኛዎቹ ቅጾች - የመግቢያ ማያ ገጾችዎ ፣ የቅንጅቶችዎ ገጾች ፣ የእርስዎ CRUD ሞዴሎች - ይህ በትክክል በጥሩ ሁኔታ ይሰራል። እያንዳንዱ ቁራጭ ስራውን ያከናውናል፣ በንጽህና ያዘጋጃሉ፣ እና ምርትዎን በትክክል ወደሚለዩት የመተግበሪያዎ ክፍሎች መሄድ ይችላሉ። ነገር ግን አልፎ አልፎ፣ አንድ ቅጽ ቀደም ባሉት መልሶች ላይ የሚመሰረቱ የታይነት ህጎች፣ ወይም በሦስት መስኮች ውስጥ የሚንሸራተቱ እሴቶች ያሉ ነገሮችን ማሰባሰብ ይጀምራል። ምናልባት በጠቅላላ ሩጫ ላይ ተመስርተው ሊዘለሉ ወይም ሊታዩ የሚገባቸው ሙሉ ገጾች። የመጀመሪያውን ሁኔታዊ በአጠቃቀም ዋች እና በውስጥ መስመር ቅርንጫፍ ታስተናግዳለህ፣ ይህም ጥሩ ነው። ከዚያም ሌላ. ከዚያ የዞድ ንድፍዎ በተለመደው መንገድ መግለጽ የማይችለውን የመስክ አቋራጭ ህጎችን ለመመስረት ለ superRefine እየደረሱ ነው። ከዚያ የደረጃ አሰሳ የንግድ ሎጂክን ማፍሰስ ይጀምራል። የሆነ ጊዜ፣ የገነቡትን ይመለከታሉ እና ቅጹ ከአሁን በኋላ በትክክል UI አለመሆኑን ይገነዘባሉ። እሱ የበለጠ የውሳኔ ሂደት ነው ፣ እና ዛፉ እርስዎ ያከማቹት ቦታ ብቻ ነው። እኔ እንደማስበው በReact ውስጥ የአዕምሮ ሞዴል የሚፈርስበት ነው፣ እና በእውነቱ የማንም ስህተት አይደለም። የRHF + Zod ቁልል ለተሰራለት ነገር በጣም ጥሩ ነው። ጉዳዩ ከችግሩ ጋር የሚጣጣሙበትን ነጥብ አልፈን መጠቀሙን እንቀጥላለን ምክንያቱም አማራጩ ስለ ቅጾች ሙሉ በሙሉ የተለየ አስተሳሰብ ይፈልጋል። ይህ ጽሑፍ ስለዚያ አማራጭ ነው. ይህንን ለማሳየት፣ ትክክለኛውን ባለብዙ ደረጃ ቅጽ ሁለት ጊዜ እንገነባለን፡

ለምላሽ ጥያቄ ምላሽ ለመስጠት በReact Hook ቅጽ + ዞድ በገመድ ቅጽን እንደ ዳታ ከሚመለከተው SurveyJS ጋር - ቀላል JSON schema - ከመለዋወጫ ዛፍ ይልቅ።

ተመሳሳይ መስፈርቶች፣ ተመሳሳይ ሁኔታዊ አመክንዮ፣ መጨረሻ ላይ ተመሳሳይ የኤፒአይ ጥሪ። ከዚያ ምን እንደተንቀሳቀሰ እና ምን እንደቀረ በትክክል እናስቀምጣለን እና የትኛውን ሞዴል እና መቼ መጠቀም እንዳለቦት ለመወሰን ተግባራዊ ዘዴን እንዘረጋለን። የምንገነባው ቅጽ:

ይህ ቅጽ ባለ 4-ደረጃ ፍሰት ይጠቀማል፡- ደረጃ 1: ዝርዝሮች

የመጀመሪያ ስም (አስፈላጊ) ፣ ኢሜይል (የሚያስፈልግ፣ የሚሰራ ቅርጸት)።

ደረጃ 2፡ እዘዝ

የአንድ ክፍል ዋጋ ፣ ብዛት፣ የግብር መጠን፣ የተገኘ፡ አጠቃላይ፣ ግብር፣ ጠቅላላ።

ደረጃ 3፡ መለያ እና ግብረመልስ

መለያ አለህ? (አዎ/አይ) አዎ ከሆነ → የተጠቃሚ ስም + ይለፍ ቃል፣ ሁለቱም ያስፈልጋል። አይ ከሆነ → ኢሜይል በደረጃ 1 ተሰብስቧል።

የእርካታ ደረጃ (1-5) ከሆነ ≥ 4 → "ምን ወደዳችሁ?" ≤ 2 → “ምን ማሻሻል እንችላለን?” ብለው ከጠየቁ።

ደረጃ 4፡ ይገምግሙ

ጠቅላላ >= 100 ከሆነ ብቻ ነው የሚታየው የመጨረሻ ማስረከብ።

ይህ ጽንፍ አይደለም። ግን የስነ-ህንፃ ልዩነቶችን ማጋለጥ በቂ ነው. ክፍል 1፡ በንጥል የሚነዳ (React Hook Form + Zod) መጫን npm install react-hook-form zod @hookform/resoluvers @tanstack/react-query

Zod Schema በ Zod schema እንጀምር, ምክንያቱም ብዙውን ጊዜ የቅጹ ቅርጽ የሚመሰረትበት ነው. ለመጀመሪያዎቹ ሁለት ደረጃዎች - የግል ዝርዝሮች እና ግብዓቶች ቅደም ተከተል - ሁሉም ነገር ቀጥተኛ ነው: አስፈላጊ ሕብረቁምፊዎች, አነስተኛ ቁጥሮች እና ቁጥሮች. ሁኔታዊ ደንቦችን ለመግለጽ ሲሞክሩ አስደሳችው ክፍል ይጀምራል.

አስመጣ {z } ከ "zod";

ኤክስፖርት const formSchema = z.object({የመጀመሪያ ስም፡ z.string() z.string () አማራጭ () የይለፍ ቃል: z.string () አማራጭ (), እርካታ: z.ቁጥር ().ደቂቃ (1).ከፍተኛ (5), positiveFeedback: z.string ().አማራጭ (), ማሻሻያ ግብረመልስ: z.string ().አማራጭ (),}).SuperRefine ((ዳታ, ctx) => { ከሆነ (ዳታ. አካውንት ያለው") {ስም ከሆነ. ctx.addIssue ({ ኮድ: "ብጁ", ዱካ: ["የተጠቃሚ ስም"], መልእክት: "የሚያስፈልግ" });

ከሆነ (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;

የተጠቃሚ ስም እና የይለፍ ቃል እንደ አማራጭ () መተየባቸውን አስተውል ምንም እንኳን በቅድመ ሁኔታ የሚፈለጉ ቢሆኑም የዞድ ዓይነት-ደረጃ ንድፍ የሚገልጸው የነገሩን ቅርጽ እንጂ መስኮች በሚወስኑበት ጊዜ የሚገዙትን ህጎች አይደለም። ሁኔታዊ መስፈርቱ በሱፐርሪፊን ውስጥ መኖር አለበት፣ እሱም ቅርጹ ከተረጋገጠ በኋላ የሚሰራ እና ወደ ሙሉ እቃው መድረስ ይችላል። ያ መለያየት ጉድለት አይደለም; መሣሪያው የተነደፈው ብቻ ነው፡ ሱፐርሪፊን የመስክ አቋራጭ አመክንዮ የሚሄድበት በእቅድ አወቃቀሩ ውስጥ ሊገለጽ በማይችልበት ጊዜ ነው። እዚህ ላይ የሚታወቀው ይህ እቅድ የማይገልጸው ነው. የገጾች ፅንሰ-ሀሳብ የለውም፣ የትኛዎቹ መስኮች በየትኛው ነጥብ ላይ እንደሚታዩ እና የአሰሳ ጽንሰ-ሀሳብ የለውም። ይህ ሁሉ ሌላ ቦታ ይኖራል. የቅጽ አካል

አስመጣ { useForm, useWatch } ከ "react-hook-form" አስመጣ፤ { zodResolver } ከ"@hookform/resolvers/zod" አስመጣ፤ አስመጣ {useMutation } ከ"@tanstack/react-query"፤ አስመጣ {useState፣ useMemo } ከ"react"፤ አስመጣ {formSchema፣ አይነት}

const STEPS = ["ዝርዝሮች", "ትዕዛዝ", "መለያ", "ግምገማ"];

ዓይነት OrderPayload = FormData & {ንዑስ ድምር፡ ቁጥር; ግብር፡ ቁጥር; ድምር፡ ቁጥር};

የኤክስፖርት ተግባር RHFMultiStepForm () {const [ደረጃ, setStep] = useState (0);

const ሚውቴሽን = ሚውቴሽን አጠቃቀም ({ ሚውቴሽንFn: async (ክፍያ: OrderPayload) => { const res = ለማምጣት ይጠብቁ("/api/orders", { ዘዴ: "POST", ራስጌዎች፡ {"የይዘት አይነት"፡ "application/json" }፣ አካል፡ JSON.stringify(የክፍያ)፣ }); ከሆነ (!res.ok) አዲስ ስህተት ከጣለ ("ማስረከብ አልተሳካም"); መመለስ res.json (); } });

const { ይመዝገቡ ፣ ይቆጣጠሩ ፣ ያቅርቡ ፣ formState: {ስህተት} ፣ } = useForm({ ፈታሽ፡ zodResolver(formSchema)፣ defaultValues: {ዋጋ፡ 0፣ ብዛት፡ 1፣ የግብር ተመን፡ 0.1፣ እርካታ፡ 3፣ ያለው መለያ፡ "አይ");} const price = useWatch ({ቁጥጥር, ስም: "ዋጋ"}); const quantity = useWatch ({ቁጥጥር, ስም: "ብዛት"}); const taxRate = useWatch ({ቁጥጥር, ስም: "የግብር ተመን"}); const hasAccount = useWatch ({ቁጥጥር, ስም: "hasAccount"}); const እርካታ = useWatch ({ቁጥጥር, ስም: "እርካታ"}); const subtotal = useMemo(() => (ዋጋ ?? 0) * (ብዛት ?? 1)፣ [ዋጋ፣ ብዛት]); const tax = useMemo(() => ንዑስ ድምር * (የግብር ተመን ?? 0)፣ [ንዑስ ጠቅላላ፣ የግብር ተመን]); const total = useMemo(() => ንዑስ ድምር + ታክስ፣ [ንዑስ ጠቅላላ፣ ታክስ]); const onSubmit = (ውሂብ፡ FormData) => ሚውቴሽን.mutate({...ዳታ፣ ንዑስ ድምር፣ ታክስ፣ ጠቅላላ}); const show አስረክብ = (ደረጃ === 2 && ድምር < 100) || (ደረጃ === 3 && ድምር >= 100)

መመለስ (

{ደረጃ === 0 && ( <> <ግቤት {... register("የመጀመሪያ ስም")} placeholder = "የመጀመሪያ ስም" /> <ግቤት {...መመዝገቢያ("ኢሜል")} ቦታ ያዥ === 0 እና &

{step === 1 && ( <> <የግብአት አይነት === 1 value = " 0.05 " >5% < አማራጭ እሴት = " 0.1 " >10% < አማራጭ እሴት = " 0.15 " >15%

ንዑስ ድምር፡ {subtotal}
ግብር፡ {ታክስ}
ጠቅላላ፡ {ጠቅላላ}
)}

{ደረጃ === 2 && ( <> <ይምረጥ

{hasAccount === "አዎ" && ( <> <ግቤት {...ይመዝገቡ("የተጠቃሚ ስም")} placeholder = "የተጠቃሚ ስም" /> <ግቤት {...መመዝገብ("የይለፍ ቃል")} placeholder = "የይለፍ ቃል" /> )}

{እርካታ >= 4 && (