ಈ ಲೇಖನವು SurveyJS ನಿಂದ ಪ್ರಾಯೋಜಿತವಾಗಿದೆ ಹೆಚ್ಚಿನ ರಿಯಾಕ್ಟ್ ಡೆವಲಪರ್‌ಗಳು ಅದನ್ನು ಜೋರಾಗಿ ಚರ್ಚಿಸದೆ ಹಂಚಿಕೊಳ್ಳುವ ಮಾನಸಿಕ ಮಾದರಿಯಿದೆ. ಆ ರೂಪಗಳು ಯಾವಾಗಲೂ ಘಟಕಗಳಾಗಿರಬೇಕು. ಇದರರ್ಥ ಈ ರೀತಿಯ ಸ್ಟಾಕ್:

ಸ್ಥಳೀಯ ರಾಜ್ಯಕ್ಕಾಗಿ ಹುಕ್ ಫಾರ್ಮ್ ಅನ್ನು ಪ್ರತಿಕ್ರಿಯಿಸಿ (ಕನಿಷ್ಠ ಮರು-ರೆಂಡರ್‌ಗಳು, ದಕ್ಷತಾಶಾಸ್ತ್ರದ ಕ್ಷೇತ್ರ ನೋಂದಣಿ, ಕಡ್ಡಾಯ ಸಂವಹನ). ಮೌಲ್ಯೀಕರಣಕ್ಕಾಗಿ Zod (ಇನ್‌ಪುಟ್ ಸರಿಯಾಗಿರುವುದು, ಗಡಿ ಮೌಲ್ಯೀಕರಣ, ಪ್ರಕಾರ-ಸುರಕ್ಷಿತ ಪಾರ್ಸಿಂಗ್). ಬ್ಯಾಕೆಂಡ್‌ಗಾಗಿ ಪ್ರತಿಕ್ರಿಯೆ ಪ್ರಶ್ನೆ: ಸಲ್ಲಿಕೆ, ಮರುಪ್ರಯತ್ನಗಳು, ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳುವಿಕೆ, ಸರ್ವರ್ ಸಿಂಕ್, ಇತ್ಯಾದಿ.

ಮತ್ತು ಬಹುಪಾಲು ಫಾರ್ಮ್‌ಗಳಿಗೆ - ನಿಮ್ಮ ಲಾಗಿನ್ ಪರದೆಗಳು, ನಿಮ್ಮ ಸೆಟ್ಟಿಂಗ್‌ಗಳ ಪುಟಗಳು, ನಿಮ್ಮ CRUD ಮಾದರಿಗಳು - ಇದು ನಿಜವಾಗಿಯೂ ಉತ್ತಮವಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ. ಪ್ರತಿಯೊಂದು ತುಣುಕು ಅದರ ಕೆಲಸವನ್ನು ಮಾಡುತ್ತದೆ, ಅವುಗಳು ಸ್ವಚ್ಛವಾಗಿ ಸಂಯೋಜಿಸುತ್ತವೆ ಮತ್ತು ನಿಮ್ಮ ಉತ್ಪನ್ನವನ್ನು ವಾಸ್ತವವಾಗಿ ಪ್ರತ್ಯೇಕಿಸುವ ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್‌ನ ಭಾಗಗಳಿಗೆ ನೀವು ಹೋಗಬಹುದು. ಆದರೆ ಪ್ರತಿ ಬಾರಿಯೂ, ಒಂದು ಫಾರ್ಮ್ ಹಿಂದಿನ ಉತ್ತರಗಳನ್ನು ಅವಲಂಬಿಸಿರುವ ಗೋಚರತೆಯ ನಿಯಮಗಳು ಅಥವಾ ಮೂರು ಕ್ಷೇತ್ರಗಳ ಮೂಲಕ ಕ್ಯಾಸ್ಕೇಡ್ ಮಾಡುವ ಮೌಲ್ಯಗಳನ್ನು ಸಂಗ್ರಹಿಸಲು ಪ್ರಾರಂಭಿಸುತ್ತದೆ. ಬಹುಶಃ ಸಂಪೂರ್ಣ ಪುಟಗಳನ್ನು ಬಿಟ್ಟುಬಿಡಬೇಕು ಅಥವಾ ಚಾಲನೆಯಲ್ಲಿರುವ ಮೊತ್ತವನ್ನು ಆಧರಿಸಿ ತೋರಿಸಬೇಕು. ನೀವು ಯೂಸ್‌ವಾಚ್ ಮತ್ತು ಇನ್‌ಲೈನ್ ಶಾಖೆಯೊಂದಿಗೆ ಮೊದಲ ಷರತ್ತುಬದ್ಧತೆಯನ್ನು ನಿರ್ವಹಿಸುತ್ತೀರಿ, ಅದು ಉತ್ತಮವಾಗಿದೆ. ನಂತರ ಇನ್ನೊಂದು. ನಿಮ್ಮ Zod ಸ್ಕೀಮಾವು ಸಾಮಾನ್ಯ ರೀತಿಯಲ್ಲಿ ವ್ಯಕ್ತಪಡಿಸಲು ಸಾಧ್ಯವಾಗದ ಕ್ರಾಸ್-ಫೀಲ್ಡ್ ನಿಯಮಗಳನ್ನು ಎನ್ಕೋಡ್ ಮಾಡಲು ನೀವು ಸೂಪರ್ ರಿಫೈನ್ ಅನ್ನು ತಲುಪುತ್ತಿರುವಿರಿ. ನಂತರ, ಹಂತದ ನ್ಯಾವಿಗೇಷನ್ ವ್ಯವಹಾರ ತರ್ಕವನ್ನು ಸೋರಿಕೆ ಮಾಡಲು ಪ್ರಾರಂಭಿಸುತ್ತದೆ. ಕೆಲವು ಹಂತದಲ್ಲಿ, ನೀವು ನಿರ್ಮಿಸಿರುವುದನ್ನು ನೀವು ನೋಡುತ್ತೀರಿ ಮತ್ತು ಫಾರ್ಮ್ ಇನ್ನು ಮುಂದೆ ನಿಜವಾಗಿಯೂ UI ಅಲ್ಲ ಎಂದು ಅರಿತುಕೊಳ್ಳುತ್ತೀರಿ. ಇದು ಹೆಚ್ಚು ನಿರ್ಧಾರ ಪ್ರಕ್ರಿಯೆಯಾಗಿದೆ, ಮತ್ತು ಘಟಕ ಟ್ರೀ ನೀವು ಅದನ್ನು ಸಂಗ್ರಹಿಸಲು ಸಂಭವಿಸಿದ ಸ್ಥಳವಾಗಿದೆ. ಇಲ್ಲಿಯೇ ರಿಯಾಕ್ಟ್‌ನಲ್ಲಿನ ರೂಪಗಳ ಮಾನಸಿಕ ಮಾದರಿಯು ಒಡೆಯುತ್ತದೆ ಎಂದು ನಾನು ಭಾವಿಸುತ್ತೇನೆ ಮತ್ತು ಇದು ನಿಜವಾಗಿಯೂ ಯಾರ ತಪ್ಪೂ ಅಲ್ಲ. RHF + Zod ಸ್ಟಾಕ್ ಅನ್ನು ವಿನ್ಯಾಸಗೊಳಿಸಿದ್ದಕ್ಕಾಗಿ ಅತ್ಯುತ್ತಮವಾಗಿದೆ. ಸಮಸ್ಯೆಯೆಂದರೆ, ಅದರ ಅಮೂರ್ತತೆಗಳು ಸಮಸ್ಯೆಗೆ ಹೊಂದಿಕೆಯಾಗುವ ಹಂತದಿಂದ ನಾವು ಅದನ್ನು ಬಳಸುವುದನ್ನು ಮುಂದುವರಿಸುತ್ತೇವೆ ಏಕೆಂದರೆ ಪರ್ಯಾಯವು ರೂಪಗಳ ಬಗ್ಗೆ ಸಂಪೂರ್ಣವಾಗಿ ವಿಭಿನ್ನ ರೀತಿಯಲ್ಲಿ ಯೋಚಿಸುವ ಅಗತ್ಯವಿದೆ. ಈ ಲೇಖನವು ಆ ಪರ್ಯಾಯದ ಬಗ್ಗೆ. ಇದನ್ನು ತೋರಿಸಲು, ನಾವು ಒಂದೇ ಬಹು-ಹಂತದ ಫಾರ್ಮ್ ಅನ್ನು ಎರಡು ಬಾರಿ ನಿರ್ಮಿಸುತ್ತೇವೆ:

ಸಲ್ಲಿಕೆಗಾಗಿ ಪ್ರಶ್ನೆಗೆ ಪ್ರತಿಕ್ರಿಯಿಸಲು ರಿಯಾಕ್ಟ್ ಹುಕ್ ಫಾರ್ಮ್ + ಝೋಡ್ ತಂತಿಯೊಂದಿಗೆ, ಸರ್ವೆಜೆಎಸ್‌ನೊಂದಿಗೆ, ಒಂದು ಫಾರ್ಮ್ ಅನ್ನು ಡೇಟಾ ಎಂದು ಪರಿಗಣಿಸುತ್ತದೆ - ಒಂದು ಸರಳವಾದ JSON ಸ್ಕೀಮಾ - ಬದಲಿಗೆ ಕಾಂಪೊನೆಂಟ್ ಟ್ರೀ.

ಅದೇ ಅವಶ್ಯಕತೆಗಳು, ಅದೇ ಷರತ್ತುಬದ್ಧ ತರ್ಕ, ಕೊನೆಯಲ್ಲಿ ಅದೇ API ಕರೆ. ನಂತರ ನಾವು ನಿಖರವಾಗಿ ಏನನ್ನು ಸರಿಸಲಾಗಿದೆ ಮತ್ತು ಯಾವುದು ಉಳಿದಿದೆ ಎಂಬುದನ್ನು ನಾವು ಮ್ಯಾಪ್ ಮಾಡುತ್ತೇವೆ ಮತ್ತು ನೀವು ಯಾವ ಮಾದರಿಯನ್ನು ಮತ್ತು ಯಾವಾಗ ಬಳಸಬೇಕು ಎಂಬುದನ್ನು ನಿರ್ಧರಿಸಲು ಪ್ರಾಯೋಗಿಕ ಮಾರ್ಗವನ್ನು ರೂಪಿಸುತ್ತೇವೆ. ನಾವು ನಿರ್ಮಿಸುತ್ತಿರುವ ಫಾರ್ಮ್:

ಈ ಫಾರ್ಮ್ 4-ಹಂತದ ಹರಿವನ್ನು ಬಳಸುತ್ತದೆ: ಹಂತ 1: ವಿವರಗಳು

ಮೊದಲ ಹೆಸರು (ಅಗತ್ಯವಿದೆ), ಇಮೇಲ್ (ಅಗತ್ಯವಿದೆ, ಮಾನ್ಯ ಸ್ವರೂಪ).

ಹಂತ 2: ಆದೇಶ

ಘಟಕ ಬೆಲೆ, ಪ್ರಮಾಣ, ತೆರಿಗೆ ದರ, ಪಡೆದ: ಉಪಮೊತ್ತ, ತೆರಿಗೆ, ಒಟ್ಟು.

ಹಂತ 3: ಖಾತೆ ಮತ್ತು ಪ್ರತಿಕ್ರಿಯೆ

ನೀವು ಖಾತೆಯನ್ನು ಹೊಂದಿದ್ದೀರಾ? (ಹೌದು/ಇಲ್ಲ) ಹೌದು ಎಂದಾದರೆ → ಬಳಕೆದಾರಹೆಸರು + ಪಾಸ್‌ವರ್ಡ್, ಎರಡೂ ಅಗತ್ಯವಿದೆ. ಒಂದು ವೇಳೆ ಇಲ್ಲ → ಇಮೇಲ್ ಅನ್ನು ಈಗಾಗಲೇ ಹಂತ 1 ರಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗಿದೆ.

ತೃಪ್ತಿಯ ರೇಟಿಂಗ್ (1–5) ≥ 4 → "ನೀವು ಏನು ಇಷ್ಟಪಟ್ಟಿದ್ದೀರಿ?" ಎಂದು ಕೇಳಿದರೆ ≤ 2 → ಕೇಳಿದರೆ "ನಾವು ಏನನ್ನು ಸುಧಾರಿಸಬಹುದು?"

ಹಂತ 4: ವಿಮರ್ಶೆ

ಒಟ್ಟು >= 100 ಆಗಿದ್ದರೆ ಮಾತ್ರ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತದೆ ಅಂತಿಮ ಸಲ್ಲಿಕೆ.

ಇದು ವಿಪರೀತವಲ್ಲ. ಆದರೆ ವಾಸ್ತುಶಿಲ್ಪದ ವ್ಯತ್ಯಾಸಗಳನ್ನು ಬಹಿರಂಗಪಡಿಸಲು ಸಾಕು. ಭಾಗ 1: ಘಟಕ-ಚಾಲಿತ (ಪ್ರತಿಕ್ರಿಯಾತ್ಮಕ ಹುಕ್ ಫಾರ್ಮ್ + ಜೋಡ್) ಅನುಸ್ಥಾಪನೆ npm ಇನ್‌ಸ್ಟಾಲ್ ರಿಯಾಕ್ಟ್-ಹುಕ್-ಫಾರ್ಮ್ ಜೋಡ್ @ಹೂಕ್‌ಫಾರ್ಮ್/ರೆಸಾಲ್ವರ್ಸ್ @tanstack/react-query

ಜೋಡ್ ಸ್ಕೀಮಾ ಜೋಡ್ ಸ್ಕೀಮಾದೊಂದಿಗೆ ಪ್ರಾರಂಭಿಸೋಣ, ಏಕೆಂದರೆ ಅಲ್ಲಿ ಸಾಮಾನ್ಯವಾಗಿ ರೂಪದ ಆಕಾರವನ್ನು ಸ್ಥಾಪಿಸಲಾಗುತ್ತದೆ. ಮೊದಲ ಎರಡು ಹಂತಗಳಿಗೆ - ವೈಯಕ್ತಿಕ ವಿವರಗಳು ಮತ್ತು ಆರ್ಡರ್ ಇನ್‌ಪುಟ್‌ಗಳು - ಎಲ್ಲವೂ ನೇರವಾಗಿರುತ್ತದೆ: ಅಗತ್ಯವಿರುವ ತಂತಿಗಳು, ಕನಿಷ್ಠಗಳನ್ನು ಹೊಂದಿರುವ ಸಂಖ್ಯೆಗಳು ಮತ್ತು ಎನಮ್. ನೀವು ಷರತ್ತುಬದ್ಧ ನಿಯಮಗಳನ್ನು ವ್ಯಕ್ತಪಡಿಸಲು ಪ್ರಯತ್ನಿಸಿದಾಗ ಆಸಕ್ತಿದಾಯಕ ಭಾಗವು ಪ್ರಾರಂಭವಾಗುತ್ತದೆ.

"zod" ನಿಂದ {z } ಅನ್ನು ಆಮದು ಮಾಡಿಕೊಳ್ಳಿ;

ರಫ್ತು const formSchema = z.object({ firstName: z.string().min(1, "ಅಗತ್ಯವಿದೆ"), ಇಮೇಲ್: z.string().email("ಅಮಾನ್ಯ ಇಮೇಲ್"), ಬೆಲೆ: z.number().min(0), ಪ್ರಮಾಣ: z.number().min(1), ತೆರಿಗೆ ದರ: z.ncumber z.enum(["ಹೌದು", "ಇಲ್ಲ"]), ಬಳಕೆದಾರಹೆಸರು: z.string().ಐಚ್ಛಿಕ(), ಪಾಸ್‌ವರ್ಡ್: z.string().ಐಚ್ಛಿಕ(), ತೃಪ್ತಿ: z.number().min(1).max(5), ಧನಾತ್ಮಕ ಪ್ರತಿಕ್ರಿಯೆ: z.string().supptional(), ಸುಧಾರಣೆ(optional(optional),}). ctx) => {if (data.hasAccount === "ಹೌದು") {if (!data.username) {ctx.addIssue({ಕೋಡ್: "ಕಸ್ಟಮ್", ಮಾರ್ಗ: ["ಬಳಕೆದಾರರ ಹೆಸರು"], ಸಂದೇಶ: "ಅಗತ್ಯವಿದೆ" }); {!data.password. "ಕಸ್ಟಮ್", ಮಾರ್ಗ: ["ಪಾಸ್ವರ್ಡ್"], ಸಂದೇಶ: "ಕನಿಷ್ಟ 6 ಅಕ್ಷರಗಳು"} });

ವೇಳೆ (data.satisfaction >= 4 && !data.positiveFeedback) { ctx.addIssue({ ಕೋಡ್: "ಕಸ್ಟಮ್", ಮಾರ್ಗ: ["ಧನಾತ್ಮಕ ಪ್ರತಿಕ್ರಿಯೆ"], ಸಂದೇಶ: "ದಯವಿಟ್ಟು ನೀವು ಇಷ್ಟಪಟ್ಟಿದ್ದನ್ನು ಹಂಚಿಕೊಳ್ಳಿ" }); }

ವೇಳೆ (data.satisfaction <= 2 && !data.improvementFeedback) { ctx.addIssue({ ಕೋಡ್: "ಕಸ್ಟಮ್", ಮಾರ್ಗ:["ಸುಧಾರಣೆ ಪ್ರತಿಕ್ರಿಯೆ"], ಸಂದೇಶ: "ಏನು ಸುಧಾರಿಸಬೇಕೆಂದು ದಯವಿಟ್ಟು ನಮಗೆ ತಿಳಿಸಿ" }); }});

ರಫ್ತು ಪ್ರಕಾರ FormData = z.infer;

ಬಳಕೆದಾರಹೆಸರು ಮತ್ತು ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಐಚ್ಛಿಕ() ಎಂದು ಟೈಪ್ ಮಾಡಲಾಗಿದೆ ಎಂಬುದನ್ನು ಗಮನಿಸಿ, ಏಕೆಂದರೆ ಅವುಗಳು ಷರತ್ತುಬದ್ಧವಾಗಿ ಅಗತ್ಯವಿದ್ದರೂ ಸಹ Zod ನ ಟೈಪ್-ಲೆವೆಲ್ ಸ್ಕೀಮಾವು ವಸ್ತುವಿನ ಆಕಾರವನ್ನು ವಿವರಿಸುತ್ತದೆ, ಕ್ಷೇತ್ರಗಳು ಮುಖ್ಯವಾದಾಗ ನಿಯಮಗಳಲ್ಲ. ಷರತ್ತುಬದ್ಧ ಅವಶ್ಯಕತೆಯು ಸೂಪರ್‌ರಿಫೈನ್‌ನಲ್ಲಿ ವಾಸಿಸಬೇಕು, ಇದು ಆಕಾರವನ್ನು ಮೌಲ್ಯೀಕರಿಸಿದ ನಂತರ ಚಲಿಸುತ್ತದೆ ಮತ್ತು ಪೂರ್ಣ ವಸ್ತುವಿಗೆ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರುತ್ತದೆ. ಆ ಪ್ರತ್ಯೇಕತೆಯು ದೋಷವಲ್ಲ; ಇದು ಕೇವಲ ಸಾಧನವನ್ನು ವಿನ್ಯಾಸಗೊಳಿಸಲಾಗಿದೆ: ಸೂಪರ್‌ರಿಫೈನ್ ಎಂದರೆ ಸ್ಕೀಮಾ ರಚನೆಯಲ್ಲಿ ವ್ಯಕ್ತಪಡಿಸಲು ಸಾಧ್ಯವಾಗದಿದ್ದಾಗ ಕ್ರಾಸ್-ಫೀಲ್ಡ್ ಲಾಜಿಕ್ ಹೋಗುತ್ತದೆ. ಈ ಸ್ಕೀಮಾ ಏನು ವ್ಯಕ್ತಪಡಿಸುವುದಿಲ್ಲ ಎಂಬುದು ಇಲ್ಲಿ ಗಮನಾರ್ಹವಾಗಿದೆ. ಇದು ಪುಟಗಳ ಪರಿಕಲ್ಪನೆಯನ್ನು ಹೊಂದಿಲ್ಲ, ಯಾವ ಹಂತದಲ್ಲಿ ಯಾವ ಕ್ಷೇತ್ರಗಳು ಗೋಚರಿಸುತ್ತವೆ ಎಂಬ ಪರಿಕಲ್ಪನೆಯಿಲ್ಲ ಮತ್ತು ನ್ಯಾವಿಗೇಷನ್ ಪರಿಕಲ್ಪನೆಯಿಲ್ಲ. ಅದೆಲ್ಲ ಬೇರೆ ಕಡೆ ವಾಸವಾಗುತ್ತೆ. ಫಾರ್ಮ್ ಕಾಂಪೊನೆಂಟ್

"react-hook-form" ನಿಂದ {useForm, useWatch} ಅನ್ನು ಆಮದು ಮಾಡಿ; "@hookform/resolvers/zod" ನಿಂದ {zodResolver } ಆಮದು ಮಾಡಿ; "@tanstack/react-query" ನಿಂದ {useMutation} ಆಮದು ಮಾಡಿ;

const STEPS = ["ವಿವರಗಳು", "ಆದೇಶ", "ಖಾತೆ", "ವಿಮರ್ಶೆ"];

ಆರ್ಡರ್ ಪೇಲೋಡ್ ಅನ್ನು ಟೈಪ್ ಮಾಡಿ = ಫಾರ್ಮ್‌ಡೇಟಾ & { ಉಪಮೊತ್ತ: ಸಂಖ್ಯೆ; ತೆರಿಗೆ: ಸಂಖ್ಯೆ; ಒಟ್ಟು: ಸಂಖ್ಯೆ};

ರಫ್ತು ಕಾರ್ಯ RHFMultiStepForm() {const [ಹಂತ, ಸೆಟ್‌ಸ್ಟೆಪ್] = useState(0);

const mutation = ಬಳಕೆ ರೂಪಾಂತರ({ mutationFn: async (ಪೇಲೋಡ್: OrderPayload) => { const res = ಪಡೆದುಕೊಳ್ಳಲು ನಿರೀಕ್ಷಿಸಿ("/api/orders", { ವಿಧಾನ: "ಪೋಸ್ಟ್", ಹೆಡರ್‌ಗಳು: { "ಕಂಟೆಂಟ್-ಟೈಪ್": "ಅಪ್ಲಿಕೇಶನ್/ಜೆಸನ್" }, ದೇಹ: JSON.stringify(ಪೇಲೋಡ್), }); ಒಂದು ವೇಳೆ (!res.ok) ಹೊಸ ದೋಷ ("ಸಲ್ಲಿಸಲು ವಿಫಲವಾಗಿದೆ"); ರಿಟರ್ನ್ res.json(); }, });

const {ರಿಜಿಸ್ಟರ್, ಕಂಟ್ರೋಲ್, ಹ್ಯಾಂಡಲ್ ಸಲ್ಲಿಸಿ, ಫಾರ್ಮ್ ಸ್ಟೇಟ್: {ದೋಷಗಳು }, } = useForm({ಪರಿಹಾರ: zodResolver(formSchema), defaultValues: { price: 0, quantity: 1, taxRate: 0.1, satisfaction: 3, "No"ac,count: }}); const price = useWatch({ನಿಯಂತ್ರಣ, ಹೆಸರು: "ಬೆಲೆ"}); const quantity = useWatch({ನಿಯಂತ್ರಣ, ಹೆಸರು: "ಪ್ರಮಾಣ"}); const taxRate = useWatch({ನಿಯಂತ್ರಣ, ಹೆಸರು: "taxRate"}); const hasAccount = useWatch({ನಿಯಂತ್ರಣ, ಹೆಸರು: "hasAccount"}); const ತೃಪ್ತಿ = useWatch({ನಿಯಂತ್ರಣ, ಹೆಸರು: "ತೃಪ್ತಿ"}); const subtotal = useMemo(() => (ಬೆಲೆ ?? 0) * (ಪ್ರಮಾಣ ?? 1), [ಬೆಲೆ, ಪ್ರಮಾಣ]); const tax = useMemo(() => ಉಪಮೊತ್ತ * (ತೆರಿಗೆ ದರ ?? 0), [ಉಪಮೊತ್ತ, ತೆರಿಗೆ ದರ]); const ಒಟ್ಟು = useMemo(() => ಉಪಮೊತ್ತ + ತೆರಿಗೆ, [ಉಪಮೊತ್ತ, ತೆರಿಗೆ]); const onSubmit = (ಡೇಟಾ: FormData) => mutation.mutate({ ...ಡೇಟಾ, ಉಪಮೊತ್ತ, ತೆರಿಗೆ, ಒಟ್ಟು }); const showSubmit = (ಹಂತ === 2 && ಒಟ್ಟು < 100) || (ಹಂತ === 3 && ಒಟ್ಟು >= 100)

ಹಿಂತಿರುಗಿ (

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

{step === 1 && ( <> <ಆಯ್ಕೆ ಮಾಡಿ <...register ("taxRate}} ಮೌಲ್ಯ value="0.05">5%

ಉಪಮೊತ್ತ: {subtotal}
ತೆರಿಗೆ: {tax}
ಒಟ್ಟು: {ಒಟ್ಟು}
)}

{step === 2 && ( <>

{hasAccount === "ಹೌದು" && ( <> )}

<ಇನ್‌ಪುಟ್ ಪ್ರಕಾರ="ಸಂಖ್ಯೆ" {...ರಿಜಿಸ್ಟರ್("ತೃಪ್ತಿ", {valueAsNumber: true })} />

{ತೃಪ್ತಿ >= 4 && (