O lenei tusiga o loʻo lagolagoina e SurveyJS O loʻo i ai se faʻataʻitaʻiga o le mafaufau e faʻasoa e le au atinaʻe React e aunoa ma le talanoaina leotele. O ia fomu e tatau ona avea ma vaega. O lona uiga o se faaputuga e pei o:
React Hook Form mo le setete fa'apitonu'u (la'ititi toe fa'afoliga, ergonomic fanua resitalaina, fegalegaleaiga taua). Zod mo le faʻamaonia (saʻo saʻo, faʻamaonia tuaoi, faʻavasega-saogalemu faʻasalalauga). React Query mo le pito i tua: tuʻuina atu, toe faʻataʻitaʻi, faʻapipiʻi, sync server, ma isi.
Ma mo le tele o fomu - o lau login screens, lau itulau faʻatulagaina, lau CRUD modals - e aoga tele. O vaega taʻitasi e fai lana galuega, latou te fatuina mama, ma e mafai ona e agai i luga i vaega o lau talosaga e faʻaeseese moni ai lau oloa. Ae o taimi uma lava, e amata ai ona fa'aputuina e se fomu mea e pei o tulafono va'aia e fa'alagolago i tali muamua, po'o fa'atauga e maua mai e fa'asolo atu i vaega e tolu. Atonu e o'o lava i itulau atoa e tatau ona fa'ase'e pe fa'aalia e fa'atatau i le aofa'i atoa. E te taulimaina le tulaga muamua ma se useWatch ma se lala i totonu, e lelei. Ona sosoo ai lea ma le isi. Ona e aapa lea mo le superRefine e faʻapipiʻi tulafono faʻasalalau e le mafai e lau Zod schema ona faʻaalia i le auala masani. Ona, amata lea e le fa'aogaina o le la'asaga le fa'aogaina o manatu pisinisi. I se taimi, e te vaʻavaʻai i mea na e fausia ma iloa ai o le fomu e le o toe UI. E sili atu i se faiga fa'ai'uga, ma o le vaega la'au o lo'o na'o le mea na e teuina ai. O le mea lea ou te manatu o le mafaufau faʻataʻitaʻiga mo fomu i React e malepe, ma e leai se tasi e sese. O le RHF + Zod stack e sili ona lelei i le mea na fuafuaina mo. O le fa'afitauli o lo'o tatou fa'aauau pea ona fa'aoga i tua atu o le tulaga e fetaui lelei ai ona fa'amatalaga ma le fa'afitauli ona o le isi itu e mana'omia ai se isi auala e mafaufau ai i fomu atoa. O lenei tusiga e uiga i lena filifiliga. Ina ia faʻaalia lenei mea, o le a matou fausia le faʻailoga tutusa faʻasolosolo faʻalua faalua:
Faatasi ai ma React Hook Form + Zod uaea e React Query mo le tuuina atu, Faʻatasi ai ma le SurveyJS, lea e faʻaogaina se fomu e fai ma faʻamaumauga - o se JSON schema faigofie - nai lo se vaega o laʻau.
Tutusa manaʻoga, tutusa tulaga faʻapitoa, tutusa API valaau ile pito. Ona matou faʻafanua tonu lea o le mea na faʻagaoioia ma le mea na tumau, ma tuʻuina atu se auala aoga e filifili ai poʻo fea faʻataʻitaʻiga e tatau ona e faʻaogaina, ma afea. Le fomu o loʻo matou fausiaina:
O lenei fomu o le a fa'aogaina se fa'asologa e 4-laasaga: Laasaga 1: Fa'amatalaga
Igoa muamua (manaomia), Imeli (mana'omia, fa'atulagaina fa'amaonia).
Laasaga 2: Poloaiga
Tau o le iunite, Tele, fua faatatau o lafoga, Afua mai: La'ititi atoa, lafoga, Aofa'iga.
Laasaga 3: Fa'amatalaga & Manatu
E iai sau tala? (Ioe/Leai) Afai Ioe → username + password, e mana'omia uma. Afai Leai → imeli ua uma ona aoina i le Laasaga 1.
Fa'amalieina (1–5) Afai ≥ 4 → fesili “O le a le mea na e fiafia i ai?” Afai ≤ 2 → fesili “O le a se mea e mafai ona tatou faaleleia?”
Laasaga 4: Toe iloilo
Fa'atoa aliali mai pe a atoa >= 100 Fa'ai'uga tu'uina atu.
E le soonafai lea. Ae ua lava lea e faʻaalia ai le eseesega o fausaga. Vaega 1: Fa'aaufa'atasiga (React Hook Form + Zod) Fa'apipi'i npm faʻapipiʻi react-hook-form zod @hookform/resolvers @tanstack/react-query
Zod Schema Sei o tatou amata i le Zod schema, aua e masani lava o le mea lea e faʻavae ai foliga o le fomu. Mo laʻasaga muamua e lua - faʻamatalaga patino ma faʻatonu mea faʻapipiʻi - o mea uma e saʻo: manaʻomia manoa, numera ma laʻititi, ma se enum. O le vaega manaia e amata pe a e taumafai e faʻaalia tulafono faʻavae.
faaulufale mai {z} mai le "zod";
export const formSchema = z.object({ firstName: z.string().min(1, "Manaomia"), imeli: z.string().imeli("Invalid email"), tau: z.number().min(0), quantity: z.number().min(1), taxRate: z.number(), hasAccount:z.enum upu faataga: z.string().filifiliga(), faamalieina: z.number().min(1).max(5), positiveFeedback: z.string().optional(), improvementFeedback: z.string().optional(),}).superRefine((data, ctx) => { pe afai (data.hasAccount === "Ioe") { pe a (!data.username) {scode(!data.username) {s. ["igoa fa'aoga"], fe'au: "Mana'omia" }); } pe afai (!data.password || data.password.length <6) { ctx.addIssue({ code: "custom", path: ["password"], message: "Min 6 characters" } }
afai (data.satisfaction >= 4 && !data.positiveFeedback) {ctx.addIssue({ code: "custom", ala: ["positiveFeedback"], feʻau: "Faamolemole faasoa mea e te fiafia i ai"}); }
pe afai (data.satisfaction <= 2 && !data.improvementFeedback) {ctx.addIssue({ code: "custom", ala:["improvementFeedback"], feʻau: "Faʻamolemole taʻu mai mea e faʻaleleia"}); }});
ituaiga auina atu i fafo FormData = z.infer
Matauina o le igoa ole igoa ma le uputatala e lolomi e fai ma filifiliga () e ui lava e manaʻomia ona e faʻamatalaina e le Zod's type-level schema le foliga o le mea, ae le o tulafono e pulea pe a afaina fanua. O le mana'oga e tatau ona ola i totonu o le superRefine, lea e alu pe a uma ona fa'amaonia le foliga ma maua le mea atoa. O lena valavala e le o se faaletonu; e na'o le mea lava e fa'atulagaina ai le meafaigaluega: superRefine o le mea lea e alu i ai manatu fa'asaga i le fanua pe a le mafai ona fa'aalia i totonu o le fa'atulagaina o fuafuaga. O le mea foi e iloga ai iinei o le mea e le o faʻaalia e lenei faʻataʻitaʻiga. E leai se manatu o itulau, leai se manatu o fea fanua e iloa i le fea itu, ma leai se manatu o le folauga. O na mea uma o le a ola i se isi mea. Vaega Fa'ailoga
faaulufale { useForm, useWatch } mai le "react-hook-form";import {zodResolver} from "@hookform/resolvers/zod";import {useMutation} from "@tanstack/react-query";import {useState, useMemo } from "react";import {formSchema, type .formSchema}"
const STEPS = ["details", "order", "account", "review"];
type OrderPayload = FormData & { la'ititi: numera; lafoga: numera; aofa'i: numera};
galuega auina atu i fafo RHFMultiStepForm() {const [laasaga, setiStep] = useState(0);
const mutation = fa'aogaSuiga({ mutationFn: async (totogi: OrderPayload) => { const res = faatali fetch("/api/orders", { auala: "POST", ulutala: { "Content-Type": "application/json"}, tino: JSON.stringify(totogi), }); pe afai (!res.ok) lafo fou Sese("Ua le mafai ona tuuina atu"); toe faafoi res.json(); }, });
const {resitala, pulea, handleSubmit, formState: {sese}, } = useForm
toe faafoi (
);}Va'ai le Pen SurveyJS-03-RHF [forked] by sixthextinction. E tele naua mea o loʻo tupu iinei, ma e aoga le faʻagesegese e vaʻai i le mea na iʻu ai.
O tau na maua mai - la'ititi, lafoga, aofa'i - o lo'o fa'atulagaina i le vaega e ala ile useWatch ma useMemo aua e fa'alagolago i tau o fanua ola ma e leai se isi nofoaga fa'anatura mo i latou. O tulafono va'aia mo le igoa ole igoa, fa'aupuga, positiveFeedback, ma le fa'aleleiaFeedback o lo'o ola ile JSX e pei o tu'utu'uga i totonu. O le manatu fa'ase'e - o le itulau o iloiloga e na'o le fa'aalia pe a atoa >= 100 - o lo'o fa'apipi'i i totonu o le fa'aaligaSubmit fesuia'i ma le tu'uina atu i le Laasaga 3. Navigation lava ia ua na'o se fa'aoga a le Setete o lo'o matou fa'aopoopoina ma le lima. O le React Query e fa'atautaia le toe taumafai, fa'asao, ma le fa'aleaogaina. O le fomu e na'o le ta'ua o le mutation.mutate ma fa'amaumauga fa'amaonia.
E leai se tasi o nei mea e sese. O loʻo faʻaalia pea le React, ma o le vaega e matua faʻaalia le faʻafetai i le faʻaogaina o le RHF faʻaesea. Ae afai e te tuʻuina atu lenei mea i se tasi e leʻi tusiaina ma fai atu ia i latou e faʻamatala i lalo o le a le tulaga o loʻo aliali mai ai le itulau iloiloga, e tatau ona latou suʻeina e ala i le showSubmit, le laasaga 3 faʻaalia tulaga, ma le nav button logic - tolu nofoaga eseese - e toe fausia ai se tulafono e mafai ona taʻua i le laina e tasi. E galue le fomu, ioe, ae o le amio e le mafai ona asiasia o se faiga. E tatau ona faatino i le mafaufau. Ae sili atu le taua, o le suia e manaʻomia ai le faʻainisinia. E oo lava i se tamai tweak, e pei o le fetuutuunai pe a faʻaalia le laasaga o le iloiloga, o lona uiga o le faʻasaʻoina o le vaega, faʻafouina le faʻamaonia, tatalaina se talosaga toso, faʻatali mo le toe iloiloga, ma toe faʻapipiʻi. Vaega 2: Fuafuaga-Ta'ita'i (SurveyJS) Se'i o tatou fausia le tafe tutusa e fa'aaoga ai se fuafuaga. Fa'apipi'i npm faʻapipiʻi suʻesuʻega-matua suʻesuʻega-react-ui @tanstack/react-query
su'esu'ega-matuaO le MIT-laisene tulaga-tuto'atasi ta'avale afi afi lea e fa'amalosia ai le fa'aliliuina o foliga a le SurveyJS - o le vaega tatou te popole i ai iinei. E manaʻomia se JSON schema, fausia se faʻataʻitaʻiga mai totonu, ma faʻatautaia mea uma e ono ola i lau vaega React: iloilo faʻaaliga vaʻaia, faʻavasegaina o mea taua, faʻatautaia tulaga o itulau, faʻamaonia le siakiina, ma filifili pe o le a le uiga o le "atoa" e tuʻuina atu po o fea itulau na faʻaalia moni.
su'esu'ega-react-uiO le UI / rendering layer e fa'afeso'ota'i lea fa'ata'ita'iga ile React. O le mea moni o se vaega
Faʻatasi, latou te tuʻuina atu ia te oe se taimi faʻaoga atoatoa, tele-itulau fomu e aunoa ma le tusiaina o se laina e tasi o le faʻatonutonuina o le tafe. O le schema format lava ia, e pei ona taʻua muamua, naʻo se JSON - leai se DSL poʻo soʻo se mea faʻapitoa. E mafai ona e fa'aigoaina, fa'aulufale mai mai se faila, aumai mai se API, pe teu i totonu o se koluma fa'amaumauga ma fa'asusu i le taimi fa'agasolo. Le Pepa Tutusa, As Data Ole foliga tutusa lea, ole taimi lea ua faʻaalia o se mea JSON. O le siata e faʻamatalaina mea uma: fausaga, faʻamaonia, tulafono vaʻaia, faʻatatauga na maua, faʻatautaia itulau - ma tuʻuina atu i se Faʻataʻitaʻiga e iloilo ai i le taimi o le taʻavale. O lona uiga atoa lenei:
export const surveySchema = { title: "Order Flow", showProgressBar: "pito i luga", itulau: [ {igoa: "auiliiliga", elemene: [ { type: "text", igoa: "firstName", isRequired: true }, {type: "text", name: "imeli", inputType: "imeli", isRequired: [{type: "text", name: "firstName", isRequired: true }, {type: "text", name: "imeli", inputType: "imeli", isRequire: [{text: validators" }] } ] }, {igoa: "poloaiga", elemene: [ { type: "text", igoa: "tau", inputType: "numera", defaultValue: 0 }, { type: "text", igoa: "quantity", inputType: "numera", defaultValue: 1 }, { type: "dropdown",igoa: "TaxRate", defaultValue: 0.1, filifiliga: [ {valu: 0.05, text: "5%" }, {value: 0.1, text: "10%" }, {value: 0.15, text: "15%" } ] }, { type: "expression", name: "{price}": expression "fa'amatalaga", igoa: "lafoga", fa'amatalaga: "{total} {taxRate}" }, { type: "expression", igoa: "total", expression: "{subtotal} + {tax}" } ] }, {name: "account", elemene: [ {user: "radiogroup", igoa: "has]Account", filifiliga: "Ioe}", "Leai se igoa" Afai "Ioe}", "Leai se igoa" "{hasAccount} = 'Ioe'", isRequired: moni }, {ituaiga: "tusitusi", igoa: "password", inputType: "password", visibleIf: "{hasAccount} = 'Ioe'", isRequired: moni, validators: [{ type: "text", minLength: 6, text: "Min 6 characters", {type}: "fa'ailoga igoa", {type}: "fa'ailo fa'atatau", {ituaiga: fa'aigoa fa'ailo" }] . ]};
Faatusatusa lenei mea i le RHF version mo sina taimi.
O le poloka superRefine lea e mana'omia ai le igoa ole igoa ma upu fa'aulu ua leai. visibleIf: "{hasAccount} = 'Ioe'" fa'atasi ma le isRequired: fa'amaoni e taulimaina uma atugaluga e lua, i luga o le fanua lava ia, i le mea e te fa'amoemoe e maua ai. O le useWatch + useMemo filifili e fa'atatau i le aofa'iga la'ititi, lafoga, ma le aofa'i ua suia i fa'amatalaga fa'aaliga se tolu e fa'asino e le tasi le isi i le igoa. O le tulaga o le itulau iloiloga, lea i le RHF version sa na'o le su'eina o le showSubmit, le la'asaga 3 render lala. Ma le mea mulimuli, o le nav button logic o se mea e tasi visibleIf i luga o le mea itulau.
O le manatu lava lea e tasi. E na'o le fa'ata'ita'iga e tu'uina atu i ai se nofoaga e nofo ai i le mea e va'aia fa'atasi, nai lo le fa'asalalauina i le vaega. Fa'apena fo'i, ia maitauina o lo'o fa'aogaina e le si'itia le ituaiga: 'fa'amatalaga' mo le aofa'i la'ititi, lafoga, ma le aofa'i. O fa'amatalaga e na'o le faitau ma fa'aaoga e fa'aalia ai tau fa'atatau. E lagolagoina foi e le SurveyJS le ituaiga: 'html' mo mea faʻapitoa, ae mo tau faʻatatau, faʻamatalaga o le filifiliga saʻo. Ia mo le itu React. Tuuina Atu Ma Tuuina Atu Faigofie tele. Uaea i le Fa'auma i lau API i le auala lava e tasi - e ala i le fa'aogaMutation po'o le fetch manino:
faaulufale { useState, useEffect, useRef } mai le "react";import {useMutation } from "@tanstack/react-query";import { Model } from "survey-core";import { Survey } from "survey-react-ui";import "survey-core/survey-core.css";
galuega auina atu i fafo SurveyForm() {const [fa'ata'ita'iga] = useState(() => Fa'ata'ita'iga fou(surveySchema));
const mutation = fa'aogaSuiga({ mutationFn: async (fa'amatalaga) => { const res = faatali fetch("/api/orders", { auala: "POST", ulutala: { "Content-Type": "application/json"}, tino: JSON.stringify(faamatalaga), }); pe afai (!res.ok) lafo fou Sese("Ua le mafai ona tuuina atu"); toe faafoi res.json(); }, });
const mutationRef = useRef(suiga); mutationRef.current = mutation; useEffect(() => { const handler = (sender) => mutationRef.current.mutate(sender.data);model.onComplete.add(handler);return () => model.onComplete.remove(handler);}, [model]); // ref aloese mai le toe resitalaina o le tagata e faʻaaogaina mea uma e faʻaalia (suiga mea e iloagofie ai suiga)
toe fo'i (
<>
Va'ai le Pen SurveyJS-03-SurveyJS [forked] by sixthextinction.
onComplete afi pe a oʻo le tagata faʻaoga i le pito o le itulau vaaia mulimuli. Afai la e le sopoia le 100 atoa ma ua misia le itulau o le iloiloga, e sa'o lava le mu ona e iloilo e le SurveyJS le va'aiga a'o le'i faia le filifiliga o le uiga o le "itulau mulimuli". Ona, sender.data o loʻo i ai tali uma faʻatasi ai ma tau faʻatatau (tootoga laʻititi, lafoga, aofaʻi) e pei o fanua vasega muamua, o le mea lea o le totogi API e tutusa ma le mea na faʻapipiʻi lima e le RHF version onSubmit. O lemutationRef mamanu o le mea lava lea e tasi e te aapa i ai mo soʻo se mea e te manaʻomia ai se faʻatonuga faʻapitoa i luga o se tau e suia i luga o faʻaaliga uma - leai se SurveyJS-faʻapitoa e uiga i ai.
O le vaega React e le o toe iai so'o se manatu fa'apisinisi. E leai se fa'aogaMata'ai, leai se JSX fa'aituau, leai se fa'ailoga la'asaga, leai se filifili fa'aogaMemo, leai se superRefine. React o loʻo faia le mea e sili ona lelei: tuʻuina atu se vaega ma faʻapipiʻi i se API telefoni. O le a le mea na siitia ese mai le tali atu?
popolega RHF faaputuga SurveyJS Va'aiga JSX lala vaaiaAfai Tulaga taua fa'aaoga Matamata / fa'aogaMemo fa'aaliga Tulafono kolosi superRefine Tulaga fuafuaga Tautai tulaga laa Itulau visibleIf Tulafono nofoaga Fa'asoa i faila Fa'atotonugalemu i totonu ole fuafuaga
O le mea e tumau i le React o le faʻatulagaina, sitaili, tuʻuina atu o fesoʻotaʻiga, ma le tuʻufaʻatasia o le app, o lona uiga, o mea React ua mamanuina moni mo. O isi mea uma na siitia i totonu o le schema, ma talu ai o le schema ua naʻo se mea JSON, e mafai ona teuina i totonu o se faʻamaumauga, faʻapipiʻi tutoʻatasi mai lau numera o talosaga, pe faʻasaʻo e ala i meafaigaluega i totonu e aunoa ma le manaʻomia o se faʻapipiʻi. O se pule o oloa e manaʻomia le suia o le faʻailoga e faʻaosoina ai le itulau iloiloga e mafai ona faia lena mea e aunoa ma le paʻi i le vaega. Ole ese'esega anoa lea ole fa'agaioiga mo 'au o lo'o fa'atupu soo ai amio ma e le fa'atonuina e inisinia. O le a le taimi e faʻaaogaina ai auala taʻitasi? O le tulafono lelei lenei o le lima matua e aoga mo aʻu: mafaufau e tape atoa le fomu. O le a se mea e te leiloa?
Afai o lau, e te manaʻo e faʻapipiʻi vaega. Afai e fa'atatau i pisinisi, e pei o faitoto'a, tulafono fa'alāpotopotoga, ma mana'oga tu'utu'uga e fa'asolo ai fa'ai'uga moni, e te mana'o i se masini sikola.
E fa'apena fo'i, afai o suiga e o'o mai i lou ala e tele lava e uiga i fa'ailoga, fanua, ma le fa'atulagaina, o le RHF o le a aoga ia te oe. Afai latou te faʻatatau i tulaga, taunuʻuga, ma tulafono e ono manaʻomia e lau au faʻatonu poʻo le au faʻaloia ona fetuunai i le aoauli o le Aso Lua e aunoa ma le failaina o se tiketi, o le faʻataʻitaʻiga faʻataʻitaʻiga ma SurveyJS e sili atu ona faʻamaoni. O nei auala e lua e le matua tauva le tasi i le isi. Latou te faʻatalanoaina vasega eseese o faʻafitauli, ma o le mea sese e tatau ona aloese mai ai o le le fetaui lea o le faʻaogaina i le mamafa o le mafaufau - togafitia o se faiga faʻavae e pei o se vaega aua o le meafaigaluega masani lea, poʻo le aapa atu mo se afi faʻavae ona o se fomu na faʻatupulaia i laasaga e tolu ma maua ai se fanua faʻapitoa. O le fomu na matou fausia iinei o loʻo nofo latalata i le tuaoi ma le loto i ai, e lavelave e faʻaalia ai le eseesega ae e le o se mea e sili ona leaga e lagona ai le faʻatusatusaga. O le tele o fa'ailoga moni ua fa'aletonu i lau codebase atonu o lo'o nofo latalata i le tuaoi lava lea e tasi, ma o le fesili e masani lava pe na ta'u mai e se tasi le mea moni. Fa'aaoga le React Hook Form + Zod pe a:
O fomu e fa'atatau ile CRUD; E papa'u le fa'aa'oa'oga ma fa'a-UI; O inisinia e ana amio uma; O le pito i tua e tumau pea le puna o le upumoni.
Fa'aaoga le SurveyJS pe a:
Pepa fa'amaufa'ailoga fa'ai'uga pisinisi; O tulafono e tula'i ese mai UI; E tatau ona va'aia, su'eina, po'o fa'aliliuga le fa'atatau; O tagata e le o ni inisinia e fa'aaafia amioga; O le fomu lava e tasi e tatau ona fa'asaga i le tele o pito i luma.