Nkhaniyi idathandizidwa ndi SurveyJS Pali mtundu wamaganizidwe omwe ambiri opanga React amagawana osakambirana nawo mokweza. Mafomu amenewo nthawi zonse amayenera kukhala zigawo. Izi zikutanthauza stack monga:
React Hook Form ya dera lanulo (zongobwereza zochepa, kulembetsa kwa ergonomic field, kuyanjana kofunikira). Zod yotsimikizira (kulondola kwa zolowetsa, kutsimikizira malire, kuyika motetezeka). React Query for backend: kugonjera, kuyesanso, caching, kulunzanitsa kwa seva, ndi zina zotero.
Ndipo pamitundu yambiri - zowonetsera zanu zolowera, masamba anu okhazikitsira, ma mods anu a CRUD - izi zimagwira ntchito bwino. Chigawo chilichonse chimagwira ntchito yake, amalemba mwaukhondo, ndipo mutha kupita ku magawo a pulogalamu yanu yomwe imasiyanitsa malonda anu. Koma nthawi ndi nthawi, mawonekedwe amayamba kudziunjikira zinthu monga malamulo owonekera omwe amadalira mayankho am'mbuyomu, kapena zikhalidwe zomwe zimachokera zomwe zimadutsa magawo atatu. Mwinanso masamba onse omwe akuyenera kudumphidwa kapena kuwonetsedwa kutengera kuchuluka kwazomwe zikuchitika. Mumayendetsa zoyambira ndi useWatch ndi nthambi yamkati, zomwe zili bwino. Kenako wina. Kenako mukufika ku superRefine kuti muyike malamulo ophatikizika omwe schema yanu ya Zod singathe kufotokoza mwachizolowezi. Kenako, kuyenda pang'onopang'ono kumayamba kutulutsa malingaliro abizinesi. Nthawi ina, mumayang'ana zomwe mwamanga ndikuzindikira kuti mawonekedwewo salinso UI. Ndi zambiri mwachisankho, ndipo mtengo wachigawo ndi pomwe mudasunga. Apa ndipamene ndikuganiza kuti mtundu wamaganizidwe amitundu mu React umasokonekera, ndipo palibe vuto lililonse. RHF + Zod stack ndiyabwino kwambiri pazomwe idapangidwira. Vuto ndiloti timakonda kupitiliza kuzigwiritsa ntchito mpaka pomwe zotsalira zake zimafanana ndi vutoli chifukwa njira ina imafuna njira yosiyana yoganizira mafomu kwathunthu. Nkhaniyi ikunena za njira ina. Kuti tiwonetse izi, tipanga mawonekedwe ofanana ndendende kawiri:
Ndi React Hook Fomu + Zod yolumikizidwa kuti Muyankhe Mafunso kuti mupereke, Ndi SurveyJS, yomwe imagwiritsa ntchito mawonekedwe ngati deta - schema yosavuta ya JSON - osati mtengo wachigawo.
Zofunikira zomwezo, malingaliro ofanana, kuyimba komweko kwa API kumapeto. Kenako tidzalemba ndendende zomwe zidasuntha ndi zomwe zidatsalira, ndikuyika njira yothandiza yosankha mtundu womwe muyenera kugwiritsa ntchito, komanso liti. Fomu yomwe timapanga:
Fomu iyi igwiritsa ntchito masitepe anayi: Gawo 1: Tsatanetsatane
Dzina loyamba (lofunikira), Imelo (yofunikira, mtundu wovomerezeka).
Gawo 2: Kuyitanitsa
Mtengo wa unit, kuchuluka, Mtengo wa msonkho, Zochokera: Pafupifupi, Tax, Zonse.
Gawo 3: Akaunti & Ndemanga
Kodi muli ndi akaunti? (Inde/Ayi) Ngati inde → lolowera + mawu achinsinsi, onse amafunikira. Ngati Ayi → imelo yotengedwa kale mu gawo 1.
Kukhutitsidwa (1-5) Ngati ≥ 4 → funsani "Munakonda chiyani?" Ngati ≤ 2 → funsani “Kodi tingawongolere chiyani?”
Gawo 4: Unikaninso
Zimangowoneka ngati zonse >= 100 Kupereka komaliza.
Izi sizonyanyira. Koma ndizokwanira kuwulula kusiyana kwa zomangamanga. Gawo 1: Chigawo Choyendetsedwa (React Hook Form + Zod) Kuyika npm ikani react-hook-form zod @hookform/resolvers @tanstack/react-query
Zokonda Schema Tiyeni tiyambe ndi Zod schema, chifukwa nthawi zambiri ndipamene mawonekedwe a mawonekedwe amakhazikitsidwa. Pazigawo ziwiri zoyambirira - zambiri zaumwini ndi zolowetsa - zonse ndi zowongoka: zingwe zofunika, manambala okhala ndi zochepa, ndi enum. Gawo losangalatsa limayamba pamene mukuyesera kufotokoza malamulo ovomerezeka.
lowetsani {z} kuchokera ku "zod";
export const formSchema = z.object({ firstName: z.string().min(1, "Zofunika"), imelo: z.string().email("Imelo yosalondola"), mtengo: z.number().min(0), kuchuluka: z.number().min(1), taxRate: z.number(),z.Nocount:Yescount:Nocount:Yes"Acnum" z.string().mwasankha(), mawu achinsinsi: z.string().mwasankha(), kukhutitsidwa: z.number().min(1).max(5), positiveFeedback: z.string().optional(), improvementFeedback: z.string().optional(),}).superRefine((deta, ctx) => {if (data.=Year) =Yes. {ctx.addIssue({code: "custom", path: ["username"], message: "Required" }} ngati (!data.password || data.password.length < 6) {ctx.addIssue({code: "custom", path: ["password"]); uthenga: "}}
ngati (data.satisfaction >= 4 && !data.positiveFeedback) {ctx.addIssue({code: "custom", path: ["positiveFeedback"], uthenga: "Chonde gawani zomwe mumakonda"}); }
ngati (data.satisfaction <= 2 && !data.improvementFeedback) {ctx.addIssue({code: "custom", njira:["improvementFeedback"], uthenga: "Chonde tiuzeni zomwe tikuyenera kukonza" }); }});
mtundu wa kunja FormData = z.infer
Zindikirani kuti dzina lolowera ndi mawu achinsinsi amalembedwa ngati zosankha () ngakhale zimafunikira chifukwa schema yamtundu wa Zod imalongosola mawonekedwe a chinthucho, osati malamulo omwe amalamulira minda ikafunikira. Chofunikira chokhazikika chiyenera kukhala mkati mwa superRefine, yomwe imayenda pambuyo poti mawonekedwewo atsimikiziridwa ndipo amatha kupeza chinthu chonsecho. Kulekana kumeneko sikuli chilema; ndizomwe chidacho chidapangidwira: superRefine ndipamene malingaliro apakati amapita pomwe sangathe kufotokozedwa mu schema dongosolo lokha. Chodziwikanso apa ndi chomwe schema iyi sichikuwonetsa. Ilibe lingaliro lamasamba, palibe lingaliro la magawo omwe akuwoneka panthawi yomwe, ndipo palibe lingaliro lakuyenda. Zonsezo zidzakhala kwinakwake. Chigawo cha Fomu
lowetsani {useForm, useWatch } kuchokera ku "react-hook-form"; lowetsani {zodResolver } kuchokera ku "@hookform/resolvers/zod"; lowetsani {useMutation } kuchokera ku "@tanstack/react-query"; lowetsani {useState, useMemo } kuchokera ku "react"; lowetsani {formSchema} kuchokera ku "Daschema";
const STEPS = ["details", "order", "account", "review"];
lembani OrderPayload = FormData & {subtotal: nambala; msonkho: nambala; chiwerengero };
ntchito yotumiza kunja RHFMultiStepForm() {const [site, setStep] = useState(0);
const mutation = useMutation ({ mutationFn: async (payload: OrderPayload) => { const res = ait fetch("/api/oda", { njira: "POST", mitu: {"Content-Type": "application/json" }, thupi: JSON.stringify(payload), }); ngati (!res.ok) aponyerani Cholakwika chatsopano("Yalephera kugonjera"); kubwerera res.json (); }, });
const {rejista, control, handleSubmit, formState: {zolakwika}, } = useForm
bwezerani (
);}Onani Pen SurveyJS-03-RHF [yafole] ndi kutha kwachisanu ndi chimodzi. Pali zambiri zomwe zikuchitika pano, ndipo ndikofunikira kuchedwetsa kuti muwone komwe zinthu zidathera.
Miyezo yotengedwa - yaing'ono, msonkho, yonse - imawerengedwa m'chigawochi kudzera pa useWatch ndi useMemo chifukwa zimadalira zomwe zikuchitika ndipo palibe malo ena achilengedwe. Malamulo amawonekedwe a dzina lolowera, mawu achinsinsi, positiveFeedback, ndi kusinthaFeedback amakhala mu JSX ngati zokhazikika. Mfundo yodumphadumpha - tsamba lowunikira limangowoneka ngati zonse >= 100 - zalowetsedwa muwonetseroSubmit variable ndi momwe mungachitire pa sitepe 3. Navigation palokha ndi kauntala ya useState yomwe tikuwonjezera pamanja. React Query imagwira ntchito zoyesanso, kusungitsa, ndi kuletsa. Fomuyi imangoyitana mutation.mutate ndi deta yovomerezeka.
Palibe cholakwika chilichonse mwa izi. Iyi ikadali idiomatic React, ndipo chigawocho chimagwira ntchito bwino chifukwa cha momwe RHF imadzipatula kuperekeranso. Koma ngati mutapereka izi kwa wina yemwe sanalembepo ndikumufunsa kuti afotokoze zomwe tsamba lowunikira likuwonekera, akuyenera kufufuza kudzera pa ShowSubmit, sitepe 3 perekani chikhalidwe, ndi malingaliro a batani la nav - malo atatu osiyana - kuti apangenso lamulo lomwe likadanenedwa pamzere umodzi. Fomuyi imagwira ntchito, inde, koma khalidwe silikuwoneka ngati dongosolo. Iyenera kuchitidwa mwamaganizo. Chofunika kwambiri, kusintha kumafuna kutengapo gawo kwa uinjiniya. Ngakhale kusintha kwakung'ono, monga kusintha pamene sitepe yowunikira ikuwonekera, imatanthauza kusintha chigawocho, kukonzanso kutsimikizira, kutsegula pempho lachikoka, kuyembekezera kubwereza, ndi kutumizanso. Gawo 2: Schema-Driven (SurveyJS) Tsopano tiyeni tipange kuyenda komweko pogwiritsa ntchito schema. Kuyika npm ikani kafukufuku-core survey-react-ui @tanstack/react-query
SurveyJS's SurveyJS's SurveyJS - gawo lomwe timakonda pano. Zimatengera schema ya JSON, imapanga mtundu wamkati kuchokera pamenepo, ndikusamalira chilichonse chomwe chingakhale mu gawo lanu la React: kuwunika mawonekedwe, kuwerengera zomwe zimachokera, kuyang'anira tsamba, kutsimikizira kutsata, ndikusankha kuti "kukwanira" kumatanthauza chiyani kupatsidwa masamba omwe adawonetsedwa.
kafukufuku-react-uiThe UI / rendering layer yomwe imalumikiza mtunduwo ku React. Kwenikweni ndi
Pamodzi, amakupatsirani nthawi yogwira ntchito, yamasamba ambiri osalemba mzere umodzi wowongolera. Mtundu wa schema womwewo, monga tanenera kale, ndi JSON - palibe DSL kapena chilichonse. Mutha kuyiyika pamzere, kuyitanitsa kuchokera pafayilo, kuitenga ku API, kapena kuisunga pagawo la database ndikuyiyika pa nthawi yothamanga. Fomu Yomweyo, Monga Data Nayi mawonekedwe omwewo, nthawi ino akuwonetsedwa ngati chinthu cha JSON. Dongosolo limatanthawuza chilichonse: kapangidwe kake, kutsimikizira, malamulo owoneka, kuwerengera kochokera, kusaka masamba - ndikuchipereka ku Model yomwe imawuyesa panthawi yothamanga. Izi ndi zomwe zikuwoneka kwathunthu:
export const surveySchema = {mutu: "Order Flow", showProgressBar: "top", pages: [ {name: "details", elements: [ {type: "text", name: "firstName", isRequired: true }, {mtundu: "text", dzina: "imelo", inputType: "imelo", isRequired: true, validators: [{imelo id] "Inbox: "Imelo id:} }, {dzina: "dongosolo", zinthu: [ {mtundu: "text", dzina: "price", inputType: "nambala", defaultValue: 0 }, {mtundu: "text", dzina: "quantity", inputType: "nambala", defaultValue: 1}, {mtundu: "dropdown",dzina: "taxRate", defaultValue: 0.1, zosankha: [ {mtengo: 0.05, text: "5%" }, {mtengo: 0.1, text: "10%" }, { value: 0.15, text: "15%" } ] }, {type: "expression", dzina: "{subtotal}" mawu: {quantity:}: "expression", name: "tax", mawu: "{subtotal} {taxRate}"}, {mtundu: "expression", name: "total", mawu: "{subtotal} + {tax}" } ] }, {nambala: "akaunti", zinthu: [ {mtundu: "radiogroup", dzina: "hasAccount", zosankha: [": "Ithu dzina}", {Noname: "Inde" dzina}, {No. visualIf: "{hasAccount} = 'Inde'", isRequired: true }, {type: "text", name: "password", inputType: "password", appearanceIf: "{hasAccount} = 'Yes'", isRequired: true, validators: [{ type: "text", minLength: 6, text: "Min: "type : 6} zilembo" {Min:}] "satisfaction", rateMin: 1, rateMax: 5 }, {mtundu: "comment", dzina: "positiveFeedback", visualIf: "{satisfaction} >= 4" }, {type: "comment", name: "improvementFeedback", obviousIf: "{satisfaction} <= 2" } : : "[[,] , {0} view, {0} view, {0} , > zinthu: [] }]};
Fananizani izi ndi mtundu wa RHF kwakanthawi.
Chotchinga cha superRefine chomwe chimafunikira dzina lolowera ndi mawu achinsinsi chapita. visualIf: "{hasAccount} = 'Inde'" pamodzi ndi isRequired: zoona amasamalira nkhawa zonse pamodzi, pamunda womwewo, kumene mungayembekezere kuwapeza. UseWatch + useMemo unyolo womwe unawerengera kuchuluka, msonkho, ndi chiwonkhetso chasinthidwa ndi magawo atatu ofotokozera omwe amatchula dzina. Tsamba lowunikiranso, lomwe mu mtundu wa RHF limatha kumangidwanso potsata showSubmit, sitepe 3 ikupereka nthambi. Ndipo pamapeto pake, malingaliro a batani la nav ndi chinthu chimodzi chowoneka Ngati katundu patsambalo.
Kulingalira komweko kulipo. Kungoti schema imamupatsa malo okhala komwe amawonekera payekhapayekha, m'malo mofalitsa gawo lonselo. Komanso, zindikirani kuti schema imagwiritsa ntchito mtundu: 'mawu' a subtotal, tax, and total. Mawu amangowerengedwa kokha ndipo amagwiritsidwa ntchito makamaka kusonyeza ziwerengero zowerengeka. SurveyJS imathandiziranso mtundu: 'html' pazokhazikika, koma pamitengo yowerengeka, mawu ndi chisankho choyenera. Tsopano ku mbali ya React. Kupereka Ndi Kugonjera Zosavuta kwambiri. Waya onComplete ku API yanu momwemonso - pogwiritsa ntchitoMutation kapena kungolanda:
lowetsani {useState, useEffect, useRef } kuchokera ku "react"; lowetsani {useMutation } kuchokera ku "@tanstack/react-query"; lowetsani {Model } kuchokera ku "survey-core"; import { Survey } kuchokera ku "survey-react-ui"; itanitsani "survey-core/survey-cores".
ntchito yotumiza kunja SurveyForm () {const [model] = useState(() => Model yatsopano(surveySchema));
const mutation = useMutation ({ mutationFn: async (data) => { const res = ait fetch("/api/oda", { njira: "POST", mitu: {"Content-Type": "application/json" }, thupi: JSON.stringify(data), }); ngati (!res.ok) aponyerani Cholakwika chatsopano("Yalephera kugonjera"); kubwerera res.json (); }, });
const mutationRef = useRef(mutation); mutationRef.current = kusintha; useEffect(() => {const handler = (sender) => mutationRef.current.mutate(sender.data); model.onComplete.add(handler); bwerera () => model.onComplete.remove(chogwira); }, [chitsanzo]); // ref imapewa kulembetsanso chothandizira chilichonse (kusintha kwachidziwitso cha chinthu)
kubwerera (
<>
Onani Pen SurveyJS-03-SurveyJS [yafoloko] ndi kutha kwachisanu ndi chimodzi.
onComplete moto pamene wosuta afika kumapeto kwa tsamba lomaliza lowoneka. Chifukwa chake ngati chiwopsezo sichidzawoloka 100 ndipo tsamba lowunikira lidumphidwa, limayakabe molondola chifukwa SurveyJS imawunika mawonekedwe asanasankhe kuti "tsamba lomaliza" limatanthauza chiyani. Kenako, sender.data ili ndi mayankho onse pamodzi ndi ziwerengero zowerengeka (zocheperako, msonkho, zonse) monga magawo oyamba, kotero kuti malipiro a API ndi ofanana ndi omwe mtundu wa RHF unasonkhanitsidwa pamanja paSubmit. Themtundu wa mutationRef ndi womwewo womwe mungafikire kulikonse komwe mungafune wowongolera zochitika pamtengo womwe umasintha pamtundu uliwonse - palibe chomwe SurveyJS chikukhudza.
Gawo la React silikhalanso ndi malingaliro aliwonse abizinesi. Palibe useWatch, palibe JSX yokhazikika, palibe chowerengera, palibe useMemo unyolo, palibe superRefine. React ikuchita zomwe ili bwino: kupereka gawo ndikuyiyika ku foni ya API. Nchiyani Chinachoka pa Kuchitapo?
Nkhawa Mtengo wa RHF Kafukufuku JS Kuwoneka Zithunzi za JSX zowoneka Ngati Makhalidwe otengedwa useWatch / useMemo mawu Malamulo osiyanasiyana wapamwambaRefine Mikhalidwe ya schema Navigation sitepe state Tsamba likuwonekaNgati Kulamulira malo Kugawidwa pamafayilo Centralized mu schema
Zomwe zimakhala mu React ndi masanjidwe, masitayelo, waya wotumizira, ndi kuphatikiza kwa pulogalamu, zomwe zikutanthauza kuti, zinthu React zimapangidwira. Chilichonse chinasunthidwa mu schema, ndipo chifukwa schema ndi chinthu cha JSON, imatha kusungidwa m'nkhokwe, kumasuliridwa mopanda code yanu yogwiritsira ntchito, kapena kusinthidwa pogwiritsa ntchito zida zamkati osafuna kutumizidwa. Woyang'anira katundu yemwe akufunika kusintha chigawo chomwe chimayambitsa tsamba la ndemanga akhoza kuchita zimenezo popanda kukhudza gawolo. Ndiko kusiyana kofunikira kwa magulu omwe machitidwe amachitidwe amasintha pafupipafupi ndipo samayendetsedwa ndi mainjiniya. Nthawi Yomwe Mungagwiritsire Ntchito Njira Iliyonse? Nayi lamulo labwino lomwe limandigwirira ntchito: lingalirani kuchotsa fomuyo kwathunthu. Kodi mungataye chiyani?
Ngati ndi zowonera, mukufuna mafomu oyendetsedwa ndi gawo. Ngati ndimalingaliro abizinesi, monga malire, malamulo a nthambi, ndi zofunikira zomwe zimakhazikitsa zisankho zenizeni, mukufuna injini ya schema.
Mofananamo, ngati zosintha zomwe zikubwera makamaka zokhudzana ndi zilembo, magawo, ndi masanjidwe, RHF ikuthandizani. Ngati ali okhudza mikhalidwe, zotsatira, ndi malamulo omwe ops kapena gulu lazamalamulo lingafunike kusintha Lachiwiri masana osalemba tikiti, schema model ndi SurveyJS ndiyoyenerana moona mtima. Njira ziwirizi sizimapikisana kwenikweni. Amathetsa mavuto osiyanasiyana, ndipo kulakwitsa koyenera kupeŵa ndikusokoneza kusagwirizana ndi kulemera kwa malingaliro - kuchitira dongosolo laulamuliro ngati gawo chifukwa ndicho chida chodziwika bwino, kapena kufikira injini yamalamulo chifukwa mawonekedwe adakula mpaka masitepe atatu ndikupeza gawo lokhazikika. Mawonekedwe omwe tidapanga pano amakhala pafupi ndi malire mwadala, ovuta kwambiri kuti awonetse kusiyana kwake koma osati mopambanitsa kotero kuti kufananitsako kumamveka ngati kolakwika. Mitundu yeniyeni yambiri yomwe yasokonekera mu codebase yanu mwina imakhala pafupi ndi malire omwewo, ndipo funso nthawi zambiri limakhala ngati wina watchula zomwe ali. Gwiritsani ntchito React Hook Form + Zod pamene:
Mafomu ndi CRUD-zokhazikika; Zomveka ndizozama komanso zoyendetsedwa ndi UI; Mainjiniya ali ndi machitidwe onse; Backend imakhalabe gwero la chowonadi.
Gwiritsani ntchito SurveyJS pamene:
Mafomu amaphatikiza zisankho zamabizinesi; Malamulo amasintha mosadalira UI; Logic iyenera kuwoneka, yowerengeka, kapena yosinthidwa; Osakhala mainjiniya amakhudza khalidwe; Fomu yofananayo iyenera kudutsa pamakona angapo.