ଏହି ଆର୍ଟିକିଲ୍ ସର୍ଭେଜେଏସ୍ ଦ୍ୱାରା ପ୍ରାୟୋଜିତ | ସେଠାରେ ଏକ ମାନସିକ ମଡେଲ୍ ଅଛି ଯାହାକି ଅଧିକାଂଶ ପ୍ରତିକ୍ରିୟାଶୀଳ ବିକାଶକାରୀମାନେ ଏହାକୁ ଉଚ୍ଚ ସ୍ୱରରେ ଆଲୋଚନା ନକରି ଅଂଶୀଦାର କରନ୍ତି | ସେହି ଫର୍ମଗୁଡ଼ିକ ସର୍ବଦା ଉପାଦାନ ବୋଲି ଅନୁମାନ କରାଯାଏ | ଏହାର ଅର୍ଥ ହେଉଛି ଏକ ଷ୍ଟାକ:

ସ୍ଥାନୀୟ ରାଜ୍ୟ ପାଇଁ ହୁକ୍ ଫର୍ମକୁ ପ୍ରତିକ୍ରିୟା କରନ୍ତୁ (ସର୍ବନିମ୍ନ ପୁନ - ରେଣ୍ଡର୍, ଏର୍ଗୋନୋମିକ୍ ଫିଲ୍ଡ ପଞ୍ଜିକରଣ, ଅପରିହାର୍ଯ୍ୟ ପାରସ୍ପରିକ କ୍ରିୟା) | ବ valid ଧତା ପାଇଁ ଜୋଡ୍ (ଇନପୁଟ୍ ସଠିକତା, ସୀମା ବ valid ଧତା, ପ୍ରକାର-ନିରାପଦ ପାର୍ସିଂ) | ବ୍ୟାକେଣ୍ଡ ପାଇଁ ପ୍ରଶ୍ନର ପ୍ରତିକ୍ରିୟା: ଦାଖଲ, ପୁନ ries ଚେଷ୍ଟା, କ୍ୟାଚିଂ, ସର୍ଭର ସିଙ୍କ, ଇତ୍ୟାଦି |

ଏବଂ ଅଧିକାଂଶ ଫର୍ମ ପାଇଁ - ଆପଣଙ୍କର ଲଗଇନ୍ ସ୍କ୍ରିନ୍, ଆପଣଙ୍କର ସେଟିଙ୍ଗ୍ ପୃଷ୍ଠାଗୁଡ଼ିକ, ଆପଣଙ୍କର CRUD ମୋଡାଲ୍ - ଏହା ପ୍ରକୃତରେ ଭଲ କାମ କରେ | ପ୍ରତ୍ୟେକ ଖଣ୍ଡ ଏହାର କାର୍ଯ୍ୟ କରେ, ସେମାନେ ସ୍ୱଚ୍ଛ ଭାବରେ ରଚନା କରନ୍ତି, ଏବଂ ତୁମେ ତୁମର ଅନୁପ୍ରୟୋଗର ଅଂଶକୁ ଯାଇପାରିବ ଯାହା ପ୍ରକୃତରେ ତୁମର ଉତ୍ପାଦକୁ ଭିନ୍ନ କରେ | କିନ୍ତୁ ପ୍ରତିଥର ଥରେ, ଏକ ଫର୍ମ ଜିନିଷଗୁଡିକ ଜମା କରିବା ଆରମ୍ଭ କରେ ଯାହା ଭିଜିବିଲିଟି ନିୟମ ଯାହା ପୂର୍ବ ଉତ୍ତର ଉପରେ ନିର୍ଭର କରେ, କିମ୍ବା ଉତ୍ପନ୍ନ ମୂଲ୍ୟ ଯାହା ତିନୋଟି କ୍ଷେତ୍ର ଦେଇ କ୍ୟାସକେଡ୍ କରେ | ବୋଧହୁଏ ସମଗ୍ର ପୃଷ୍ଠାଗୁଡ଼ିକୁ ମଧ୍ୟ ଏଡ଼ାଇ ଦିଆଯିବା କିମ୍ବା ଚାଲୁଥିବା ସମୁଦାୟ ଉପରେ ଆଧାର କରି ଦେଖାଯିବା ଉଚିତ | ଆପଣ ପ୍ରଥମ କଣ୍ଡିଶନାଲ୍ ବ୍ୟବହାର ୱାଚ୍ ଏବଂ ଏକ ଇନଲାଇନ ଶାଖା ସହିତ ପରିଚାଳନା କରନ୍ତି, ଯାହା ଭଲ ଅଟେ | ତା’ପରେ ଆଉ ଏକ | ତାପରେ ଆପଣ କ୍ରସ୍ ଫିଲ୍ଡ ନିୟମକୁ ଏନକୋଡ୍ କରିବାକୁ ସୁପର ରିଫାଇନ୍ ପାଇଁ ପହଞ୍ଚୁଛନ୍ତି ଯାହା ଆପଣଙ୍କର ଜୋଡ୍ ସ୍କିମା ସାଧାରଣ ଉପାୟରେ ପ୍ରକାଶ କରିପାରିବ ନାହିଁ | ତା’ପରେ, ଷ୍ଟେପ୍ ନେଭିଗେସନ୍ ବ୍ୟବସାୟିକ ତର୍କ ଲିକ୍ କରିବା ଆରମ୍ଭ କରେ | କିଛି ସମୟରେ, ତୁମେ ଯାହା ନିର୍ମାଣ କରିଛ ତାହା ଦେଖ ଏବଂ ଅନୁଭବ କର ଯେ ଫର୍ମଟି ପ୍ରକୃତରେ UI ନୁହେଁ | ଏହା ଏକ ନିଷ୍ପତ୍ତି ପ୍ରକ୍ରିୟାର ଅଧିକ, ଏବଂ ଉପାଦାନ ଗଛ ହେଉଛି ଯେଉଁଠାରେ ଆପଣ ଏହାକୁ ସଂରକ୍ଷଣ କରିବା ପାଇଁ ଘଟିଛନ୍ତି | ଏହିଠାରେ ମୁଁ ଭାବୁଛି ରିଆକ୍ଟରେ ଫର୍ମଗୁଡିକ ପାଇଁ ମାନସିକ ମଡେଲ୍ ଭାଙ୍ଗିଯାଏ, ଏବଂ ଏହା ପ୍ରକୃତରେ କାହାର ଦୋଷ ନୁହେଁ | RHF + Zod ଷ୍ଟାକ ଯାହା ପାଇଁ ଡିଜାଇନ୍ କରାଯାଇଥିଲା ସେଥିରେ ଉତ୍କୃଷ୍ଟ | ପ୍ରସଙ୍ଗଟି ହେଉଛି ଯେ ଆମେ ଏହାକୁ ଅତୀତରେ ବ୍ୟବହାର କରିଚାଲିଛୁ ଯେଉଁଠାରେ ଏହାର ଅବକ୍ଷୟ ସମସ୍ୟା ସହିତ ମେଳ ଖାଉଛି କାରଣ ବିକଳ୍ପଟି ସମ୍ପୂର୍ଣ୍ଣ ରୂପେ ଫର୍ମ ବିଷୟରେ ଏକ ଭିନ୍ନ ଚିନ୍ତାଧାରା ଆବଶ୍ୟକ କରେ | ଏହି ବିକଳ୍ପଟି ସେହି ବିକଳ୍ପ ବିଷୟରେ | ଏହାକୁ ଦେଖାଇବାକୁ, ଆମେ ଦୁଇଥର ସମାନ ମଲ୍ଟି ଷ୍ଟେପ୍ ଫର୍ମ ନିର୍ମାଣ କରିବୁ:

ରିଆକ୍ଟ ହୁକ୍ ଫର୍ମ + ଜୋଡ୍ ଦାଖଲ ପାଇଁ ରିଆକ୍ଟ ଜିଜ୍ଞାସା ପାଇଁ ତାରଯୁକ୍ତ, ସର୍ଭେଜେଏସ୍ ସହିତ, ଯାହା ଏକ ଫର୍ମକୁ ଡାଟା ଭାବରେ ବ୍ୟବହାର କରେ - ଏକ ସରଳ JSON ସ୍କିମା - ଏକ ଉପାଦାନ ଗଛ ଅପେକ୍ଷା |

ସମାନ ଆବଶ୍ୟକତା, ସମାନ ସର୍ତ୍ତମୂଳକ ତର୍କ, ଶେଷରେ ସମାନ API କଲ୍ | ତା’ପରେ ଆମେ ସଠିକ୍ ଭାବରେ ମ୍ୟାପ୍ କରିବୁ ଯାହା ଘୁଞ୍ଚିଗଲା ଏବଂ କ’ଣ ରହିଲା, ଏବଂ ଆପଣ କେଉଁ ମଡେଲ୍ ବ୍ୟବହାର କରିବା ଉଚିତ୍ ଏବଂ କେବେ ସ୍ଥିର କରିବାକୁ ଏକ ବ୍ୟବହାରିକ ଉପାୟ ବାହାର କରିବୁ | ଆମେ ନିର୍ମାଣ କରୁଥିବା ଫର୍ମ:

ଏହି ଫର୍ମଟି 4-ସୋପାନ ପ୍ରବାହ ବ୍ୟବହାର କରିବ: ପଦାଙ୍କ 1: ବିବରଣୀଗୁଡିକ |

ପ୍ରଥମ ନାମ (ଆବଶ୍ୟକ), ଇମେଲ୍ (ଆବଶ୍ୟକ, ବ valid ଧ ଫର୍ମାଟ୍) |

ପଦାଙ୍କ 2: ଅର୍ଡର |

ୟୁନିଟ୍ ମୂଲ୍ୟ, ପରିମାଣ, ଟିକସ ହାର, ପ୍ରାପ୍ତ: ଉପଟୋଟାଲ୍, କର, ସମୁଦାୟ

ପଦାଙ୍କ 3: ଖାତା ଏବଂ ମତାମତ |

ଆପଣଙ୍କର ଏକ ଖାତା ଅଛି କି? (ହଁ / ନା) ଯଦି ହଁ → ଉପଯୋଗକର୍ତ୍ତା ନାମ + ପାସୱାର୍ଡ, ଉଭୟ ଆବଶ୍ୟକ | ଯଦି କ → ଣସି → ଇମେଲ୍ ଷ୍ଟେପ୍ 1 ରେ ସଂଗୃହିତ ହୋଇସାରିଛି |

ତୃପ୍ତି ମୂଲ୍ୟାୟନ (1-5) ଯଦି ≥ 4 → ପଚାର “ତୁମେ କ’ଣ ପସନ୍ଦ କଲ?” ଯଦି ≤ 2 → ପଚାର “ଆମେ କ’ଣ ଉନ୍ନତି କରିପାରିବା?”

ପଦାଙ୍କ 4: ସମୀକ୍ଷା କରନ୍ତୁ |

ସମୁଦାୟ> = 100 ହେଲେ କେବଳ ଦୃଶ୍ୟମାନ ହୁଏ | ଅନ୍ତିମ ଦାଖଲ |

ଏହା ଅତ୍ୟଧିକ ନୁହେଁ | କିନ୍ତୁ ସ୍ଥାପତ୍ୟ ପାର୍ଥକ୍ୟକୁ ପ୍ରକାଶ କରିବା ଯଥେଷ୍ଟ | ଭାଗ 1: ଉପାଦାନ-ଚାଳିତ (ହୁକ୍ ଫର୍ମ + ଜୋଡ୍) ସ୍ଥାପନ npm react-hook-form zod @ hookform / resolvers @ tanstack / react-query ସଂସ୍ଥାପନ କରନ୍ତୁ |

ଜୋଡ୍ ସ୍କିମା | ଜୋଡ୍ ସ୍କିମା ସହିତ ଆରମ୍ଭ କରିବା, କାରଣ ସେହିଠାରେ ସାଧାରଣତ the ଫର୍ମର ଆକୃତି ସ୍ଥାପିତ ହୁଏ | ପ୍ରଥମ ଦୁଇଟି ସୋପାନ ପାଇଁ - ବ୍ୟକ୍ତିଗତ ବିବରଣୀ ଏବଂ ଅର୍ଡର ଇନପୁଟ୍ - ସବୁକିଛି ସରଳ: ଆବଶ୍ୟକ ଷ୍ଟ୍ରିଙ୍ଗ୍, ସର୍ବନିମ୍ନ ସଂଖ୍ୟା ଏବଂ ଏକ ଏନ୍ମ୍ | ଯେତେବେଳେ ଆପଣ ସର୍ତ୍ତମୂଳକ ନିୟମ ପ୍ରକାଶ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତି, ସେତେବେଳେ ଆକର୍ଷଣୀୟ ଅଂଶ ଆରମ୍ଭ ହୁଏ |

"zod" ରୁ {z import ଆମଦାନି କରନ୍ତୁ;

ରପ୍ତାନି const formSchema = z.object ({firstName: z.string ()। ମିନିଟ୍ (1, "ଆବଶ୍ୟକ"), ଇମେଲ୍: z.string ()। ଇମେଲ୍ ("ଅବ val ଧ ଇମେଲ୍"), ମୂଲ୍ୟ: z.number () ମିନିଟ୍ (0), ପରିମାଣ: z.number ()। ମିନିଟ୍ (1), ଟ୍ୟାକ୍ସ ରେଟ୍: z.number () z.string ()। ଇଚ୍ଛାଧୀନ (), ପାସୱାର୍ଡ: z.string ()। ଇଚ୍ଛାଧୀନ (), ସନ୍ତୁଷ୍ଟ: z.number ()। ମିନିଟ୍ (1) .ମାକ୍ସ (5), ପଜିଟିଭ୍ ଫିଡବ୍ୟାକ୍: z.string ()। ଇଚ୍ଛାଧୀନ (), ଉନ୍ନତି ଫିଡବ୍ୟାକ୍: z.string ()। ଇଚ୍ଛାଧୀନ (),})। (! data.username) {ctx.addIssue ({କୋଡ୍: "କଷ୍ଟମ୍", ପଥ: ["ଉପଯୋଗକର୍ତ୍ତା ନାମ"], ବାର୍ତ୍ତା: "ଆବଶ୍ୟକ"});

if (data.satisfaction> = 4 &&! data.positiveFeedback) {ctx.addIssue ({କୋଡ୍: "କଷ୍ଟମ୍", ପଥ: }

if (data.satisfaction <= 2 &&! data.improvementFeedback) {ctx.addIssue ({କୋଡ୍: "କଷ୍ଟମ୍", ପଥ:["ଉନ୍ନତି ଫିଡବ୍ୟାକ୍"], ବାର୍ତ୍ତା: "ଉନ୍ନତି କରିବାକୁ ଦୟାକରି ଆମକୁ କୁହନ୍ତୁ"}); }});

ରପ୍ତାନି ପ୍ରକାର FormData = z.infer ;

ଧ୍ୟାନ ଦିଅନ୍ତୁ ଯେ ଚାଳକନାମ ଏବଂ ପାସୱାର୍ଡ ଇଚ୍ଛାଧୀନ () ଭାବରେ ଟାଇପ୍ ହୋଇଛି ଯଦିଓ ସେଗୁଡିକ ସର୍ତ୍ତମୂଳକ ଭାବରେ ଆବଶ୍ୟକ ହୁଏ କାରଣ ଜୋଡର ପ୍ରକାର-ସ୍ତରୀୟ ସ୍କିମ୍ ବସ୍ତୁର ଆକୃତି ବର୍ଣ୍ଣନା କରେ, କ୍ଷେତ୍ରଗୁଡ଼ିକ ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ହେଲେ ନିୟମ ନୁହେଁ | କଣ୍ଡିଶନାଲ୍ ଆବଶ୍ୟକତା ସୁପର ରେଫାଇନ୍ ଭିତରେ ରହିବାକୁ ପଡିବ, ଯାହା ଆକୃତି ବ valid ଧ ହେବା ପରେ ଚାଲିବ ଏବଂ ପୂର୍ଣ୍ଣ ବସ୍ତୁକୁ ପ୍ରବେଶ କରିପାରିବ | ସେହି ପୃଥକତା ଏକ ତ୍ରୁଟି ନୁହେଁ; ଟୁଲ୍ ପାଇଁ ଏହା କେବଳ ଡିଜାଇନ୍ ହୋଇଛି: ସୁପର ରିଫାଇନ୍ ହେଉଛି ଯେଉଁଠାରେ କ୍ରସ୍ ଫିଲ୍ଡ ଲଜିକ୍ ଯାଏ ଯେତେବେଳେ ଏହା ସ୍କିମା ସଂରଚନାରେ ପ୍ରକାଶ କରାଯାଇପାରିବ ନାହିଁ | ଏଠାରେ ମଧ୍ୟ ଉଲ୍ଲେଖନୀୟ ବିଷୟ ହେଉଛି ଏହି ସ୍କିମ୍ ଯାହା ପ୍ରକାଶ କରେ ନାହିଁ | ଏହାର ପୃଷ୍ଠାଗୁଡ଼ିକର କ concept ଣସି ଧାରଣା ନାହିଁ, କେଉଁ କ୍ଷେତ୍ରରେ କେଉଁ କ୍ଷେତ୍ର ଦୃଶ୍ୟମାନ ହୁଏ, ଏବଂ ନାଭିଗେସନ୍ ର କ concept ଣସି ଧାରଣା ନାହିଁ | ସେସବୁ ଅନ୍ୟ କେଉଁଠାରେ ବାସ କରିବ | ଫର୍ମ ଉପାଦାନ |

ଆମଦାନି {useForm, useWatch} "react-hook-form"; ଆମଦାନି {zodResolver} "@ hookform / resolvers / zod"; ଆମଦାନି {useMutation} "@ tanstack / react-query";

const STEPS = ["ବିବରଣୀ", "କ୍ରମ", "ଖାତା", "ସମୀକ୍ଷା"];

OrderPayload = FormData & {subtotal: ସଂଖ୍ୟା; କର: ସଂଖ୍ୟା; ସମୁଦାୟ: ସଂଖ୍ୟା};

ରପ୍ତାନି କାର୍ଯ୍ୟ RHFMultiStepForm () {const [step, setStep] = useState (0);

const mutation = useMutation ({ mutationFn: async (payload: OrderPayload) => { const res = ଆଣିବାକୁ ଅପେକ୍ଷା କର ("/ api / orders", { ପଦ୍ଧତି: "POST", ଶୀର୍ଷଲେଖ: {"ବିଷୟବସ୍ତୁ-ପ୍ରକାର": "ପ୍ରୟୋଗ / json"}, ଶରୀର: JSON.stringify (payload), }); ଯଦି (! res.ok) ନୂତନ ତ୍ରୁଟି ପକାନ୍ତୁ ("ଦାଖଲ କରିବାରେ ବିଫଳ"); ଫେରସ୍ତ res.json (); }, });

const {ପଞ୍ଜିକରଣ, ନିୟନ୍ତ୍ରଣ, ହ୍ୟାଣ୍ଡେଲ ସବମିଟ୍, ଫର୍ମ ଷ୍ଟେଟ୍: {ତ୍ରୁଟି},} = ବ୍ୟବହାର ଫର୍ମ <ଫର୍ମଡାଟା> ({ରିଜୋଲଭର: zodResolver (ଫର୍ମ ସ୍କେମା), ଡିଫଲ୍ଟ ମୂଲ୍ୟ: {ମୂଲ୍ୟ: 0, ପରିମାଣ: 1, ଟ୍ୟାକ୍ସ ରେଟ୍: 0.1, ସନ୍ତୁଷ୍ଟ: 3, hasAccount: "ନା",},}); const price = useWatch ({ନିୟନ୍ତ୍ରଣ, ନାମ: "ମୂଲ୍ୟ"}); const ପରିମାଣ = useWatch ({ନିୟନ୍ତ୍ରଣ, ନାମ: "ପରିମାଣ"}); const taxRate = useWatch ({ନିୟନ୍ତ୍ରଣ, ନାମ: "taxRate"}); const hasAccount = useWatch ({ନିୟନ୍ତ୍ରଣ, ନାମ: "hasAccount"}); const ସନ୍ତୁଷ୍ଟ = useWatch ({ନିୟନ୍ତ୍ରଣ, ନାମ: "ସନ୍ତୁଷ୍ଟ"}); const subtotal = useMemo (() => (ମୂଲ୍ୟ ?? 0) * (ପରିମାଣ ?? 1), [ମୂଲ୍ୟ, ପରିମାଣ]); const tax = useMemo (() => subtotal * (taxRate ?? 0), [subtotal, taxRate]); const total = useMemo (() => subtotal + tax, [subtotal, tax]); const onSubmit = (ଡାଟା: ଫର୍ମ ଡାଟା) => mutation.mutate ({... ଡାଟା, ସବଟୋଟାଲ୍, ଟ୍ୟାକ୍ସ, ମୋଟ}); const showSubmit = (step === 2 && total <100) || (ପଦାଙ୍କ === 3 && ସମୁଦାୟ> = 100)

ଫେରସ୍ତ

{step === 1 && (<>

ସବଟୋଟାଲ୍: {ସବଟୋଟାଲ୍}
ଟ୍ୟାକ୍ସ: {ଟ୍ୟାକ୍ସ}
ସମୁଦାୟ: {ସମୁଦାୟ}
)}

{ଷ୍ଟେପ୍ === 2 && (<> <ଚୟନ {... ପଞ୍ଜିକରଣ ("hasAccount")}> <ବିକଳ୍ପ ମୂଲ୍ୟ = "ହଁ"> ହଁ <ବିକଳ୍ପ ମୂଲ୍ୟ = "ନା"> ନା

{hasAccount === "ହଁ" && (<> <ଇନପୁଟ୍ {... ପଞ୍ଜିକରଣ ("ଚାଳକନାମ")} ସ୍ଥାନଧାରୀ = "ଉପଯୋଗକର୍ତ୍ତା ନାମ" /> <ଇନପୁଟ୍ {... ପଞ୍ଜିକରଣ ("ପାସୱାର୍ଡ")} ସ୍ଥାନଧାରୀ = "ପାସୱାର୍ଡ" /> )}

<ଇନପୁଟ୍ ପ୍ରକାର = "ସଂଖ୍ୟା" {... ପଞ୍ଜିକରଣ ("ସନ୍ତୋଷ", {ମୂଲ୍ୟ ଏସ୍ ନମ୍ବର: ସତ୍ୟ})} />

{ସନ୍ତୁଷ୍ଟ> = 4 && (<ଟେକ୍ସଟେରିଆ {... ପଞ୍ଜିକରଣ ("ପଜିଟିଭ୍ ଫିଡବ୍ୟାକ୍")} />)}

{ସନ୍ତୁଷ୍ଟ <= 2 && (