Sengoliloeng sena se tšehelitsoe ke SurveyJS Ho na le mohlala oa kelello oo bahlahisi ba React ba o arolelanang ntle le ho bua ka eona ka lentsoe le phahameng. Liforomo tseo kamehla li lokela ho ba likarolo. Sena se bolela stack e kang:
React Hook Foromo bakeng sa naha ea lehae (li-renders tse nyane, ngoliso ea sebaka sa ergonomic, tšebelisano ea bohlokoa). Zod bakeng sa netefatso (ho nepahala ho kentsoeng, netefatso ea moeli, ho arola ka mokhoa o bolokehileng). React Query bakeng sa backend: tlhahiso, leka hape, caching, sync ea seva, joalo-joalo.
'Me bakeng sa mefuta e mengata - li-skrini tsa hau tsa ho kena, maqephe a litlhophiso tsa hau, mekhoa ea hau ea CRUD - sena se sebetsa hantle haholo. Sekhechana se seng le se seng se etsa mosebetsi oa sona, se qapa ka mokhoa o hloekileng, 'me u ka fetela likarolong tsa kopo ea hau tse hlileng li khethollang sehlahisoa sa hau. Empa nako le nako, foromo e qala ho bokella lintho tse kang melao ea ponahalo e itšetlehileng ka likarabo tsa pejana, kapa litekanyetso tse nkiloeng tse phunyeletsang likarolo tse tharo. Mohlomong le maqephe ohle a tlamehang ho tloloa kapa ho bonts'oa ho ipapisitsoe le kakaretso. U sebetsana le maemo a pele ka useWatch le lekala le inline, ho lokile. Ebe e mong. Ebe u hahamalla superRefine ho kenyelletsa melao ea maballo eo schema ea hau ea Zod e ke keng ea e hlalosa ka tsela e tloaelehileng. Joale, navigation ea mehato e qala ho sotha khoebo. Ka nako e 'ngoe, u sheba seo u se hahileng 'me ua hlokomela hore foromo ha e sa le UI. Ke ts'ebetso ea ho etsa liqeto, 'me sefate sa motsoako ke moo u ileng ua se boloka teng. Mona ke moo ke nahanang hore mohlala oa kelello oa liforomo ho React oa senyeha, 'me ha se phoso ea motho. RHF + Zod stack e ntle haholo ho seo e se etselitsoeng. Taba ke hore re tloaetse ho e sebelisa ho feta moo lintlha tsa eona li tsamaellanang le bothata hobane mokhoa o mong o hloka mokhoa o fapaneng oa ho nahana ka mefuta ka botlalo. Sengoliloeng sena se bua ka khetho eo. Ho bonts'a sena, re tla aha mokhoa o ts'oanang oa mehato e mengata habeli:
Ka React Hook Foromo + Zod e kentsoeng mohala ho React Query bakeng sa tlhahiso, Ka SurveyJS, e nkang foromo e le data - schema e bonolo ea JSON - ho fapana le sefate sa motsoako.
Litlhokahalo tse ts'oanang, mohopolo o ts'oanang oa maemo, mohala o tšoanang oa API qetellong. Ebe re tla etsa 'mapa hantle hore na ho fallisitsoe eng le hore na ho ile ha sala eng,' me re fane ka mokhoa o sebetsang oa ho etsa qeto ea hore na u lokela ho sebelisa mofuta ofe, le neng. Foromo eo re e etsang:
Foromo ena e tla sebelisa phallo ea mehato e 4: Mohato oa 1: Lintlha
Lebitso (ho hlokahala), Imeile (e hlokehang, sebopeho se nepahetseng).
Mohato oa 2: Odara
Theko ea yuniti, Bongata, Sekhahla sa lekhetho, E nkiloeng: Kakaretso, Lekhetho, Kakaretso.
Mohato oa 3: Account & Feedback
O na le ak'haonte? (Ee/Che) Haeba E → lebitso la mosebelisi + password, ka bobeli lia hlokahala. Haeba Che → lengolo-tsoibila le se le bokeletsoe mohatong oa 1.
Boemo ba khotsofalo (1–5) Haeba ≥ 4 → botsa "U ratile eng?" Haeba ≤ 2 → botsa “Re ka ntlafatsa eng?”
Mohato oa 4: Hlahloba
E hlaha feela haeba kakaretso >= 100 Tlhahiso ea ho qetela.
Sena ha se fetelletseng. Empa ho lekane ho pepesa liphapang tsa meralo. Karolo ea 1: E tsamaisoang ke Karolo (React Hook Form + Zod) Ho kenya npm kenya react-hook-form zod @hookform/resolvers @tanstack/react-query
Zod Schema Ha re qale ka schema ea Zod, hobane hangata ke moo sebopeho sa sebopeho se theoang teng. Bakeng sa mehato e 'meli ea pele - lintlha tsa botho le ho kenya taelo - ntho e' ngoe le e 'ngoe e otlolohile: likhoele tse hlokahalang, linomoro tse nang le bonyane, le enum. Karolo e thahasellisang e qala ha u leka ho hlalosa melao ea maemo.
kenya {z } ho "zod";
export const formSchema = z.object({ firstName: z.string().min(1, "Ea Hlokahala"), imeile: z.string().imeile("Imeile e sa sebetseng"), theko: z.number().min(0), palo: z.number().min(1), Lekhetho: z.number(), e na.(Yes) "Acnum" z.string().ka boikhethelo(), phasewete: z.string().khetho (), khotsofalo: z.number().min(1).max(5), positiveFeedback: z.string().optional(), improvementFeedback: z.string().optional(),}).superRefine((data, ctx) => {haeba (data.=Yes" => data. {ctx.addIssue({khoutu: "tloaelo", tsela: ["lebitso la mosebelisi"], molaetsa: "Ho hlokahala" }} } haeba (!data.password || data.password.length < 6) {ctx.addIssue({code: "custom", path: ["password"]); molaetsa: "}});
haeba (data.satisfaction >= 4 && !data.positiveFeedback) {ctx.addIssue({khoutu: "custom", tsela: ["positiveFeedback"], molaetsa: "Ka kopo, arolelana seo u se ratileng" }); }
haeba (data.satisfaction <= 2 && !data.improvementFeedback) {ctx.addIssue({khoutu: "custom", tsela:["improvementFeedback"], molaetsa: "Ka kopo, re bolelle seo re lokelang ho se ntlafatsa" }); }});
mofuta oa thomello ea thepa FormData = z.infer
Hlokomela hore lebitso la mosebelisi le password li ngotsoe joalo ka boikhethelo () leha li hlokahala ho latela maemo hobane schema ea mofuta oa Zod e hlalosa sebopeho sa ntho, eseng melao e laolang ha masimo a bohlokoa. Tlhokahalo ea maemo e tlameha ho phela ka har'a superRefine, e tsamaeang ka mor'a hore sebopeho se netefatsoe 'me se khone ho fumana ntho e feletseng. Karohano eo hase sekoli; ke sona seo sesebelisoa se etselitsoeng sona: superRefine ke moo logic ea cross-field e eang ha e ke ke ea hlahisoa ka sebopeho sa schema ka boeona. Se hlokomelehang hape ke seo schema sena se sa se hlaloseng. Ha e na maikutlo a maqephe, ha ho na maikutlo a hore na ke masimo afe a bonahalang ka nako efe, 'me ha ho na mohopolo oa ho tsamaea. Tseo tsohle di tla phela sebakeng se seng. Karolo ea Foromo
kenya {useForm, useWatch } ho tsoa ho "react-hook-form"; tlisa {zodResolver } ho tsoa ho "@hookform/resolvers/zod"; kenya {useMutation } ho tsoa ho "@tanstack/react-query"; tlisa {useState, useMemo } ho tsoa ho "react"; kenya {formSchema} ho tsoa ho "Daschema";
const STEPS = ["details", "order", "account", "review"];
thaepa OrderPayload = FormData & {subtotal: nomoro; lekhetho: nomoro; kakaretso: palo };
mosebetsi oa ho romela thepa ka ntle RHFMultiStepForm() { const [mohato, setStep] = useState(0);
const mutation = useMutation ({ phetohoFn: async (ho lefa: OrderPayload) => { const res = emela ho lata ("/api/oda", { mokhoa: "POST", lihlooho: {"Mofuta-Mofuta": "application/json" }, 'mele: JSON.stringify(payload), }); haeba (!res.ok) lahlela Phoso e ncha("E hlolehile ho fana"); khutla res.json(); }, });
const {rejista, taolo, handleSubmit, formState: { liphoso }, } = useForm
khutlisetsa (
);}Sheba Pen SurveyJS-03-RHF [e fereko] ke pheliso ea botšelela. Ho na le lintho tse ngata tse etsahalang mona, 'me ho bohlokoa ho fokotsa lebelo ho hlokomela hore na lintho li felile kae.
Litefiso tse nkiloeng - kakaretso, lekhetho, kakaretso - li baloa ka har'a karolo ka useWatch le useMemo hobane li itšetlehile ka boleng ba tšimo 'me ha ho sebaka se seng sa tlhaho bakeng sa tsona. Melao ea ponahalo ea lebitso la mosebelisi, phasewete, positiveFeedback, le ntlafatsoFeedback e phela ho JSX joalo ka lipehelo tsa inline. Mokhoa oa ho tlola mehato - leqephe la tlhahlobo le hlaha feela ha kakaretso >= 100 - e kentsoe ka har'a lenaneoSubmit variable le boemo ba tokiso mohatong oa 3. Navigation ka boeona ke k'haonte ea useState feela eo re e eketsang ka letsoho. React Query e sebetsana le liteko hape, caching, le ho se sebetse. Foromo e bitsa feela mutation.mutate ka data e netefalitsoeng.
Ha ho le e 'ngoe ea tsena e fosahetse, ka se. Ena e ntse e le idiomatic React, 'me karolo ea eona e sebetsa hantle ka lebaka la hore na RHF e arola phetolelo e ncha. Empa haeba u ne u ka nehelana ka sena ho motho ea sa e ngolang 'me u ba kope ho hlalosa hore na leqephe la tlhahlobo le hlaha tlas'a maemo afe, ba tla tlameha ho latela showSubmit, mohato oa 3 o fana ka boemo, le "nav button logic" - libaka tse tharo tse arohaneng - ho tsosolosa molao o ka beng o boletsoe moleng o le mong. Sebopeho se sebetsa, ee, empa boits'oaro ha bo hlahlojoe joalo ka sistimi. E tlameha ho phethoa ka kelello. Habohlokoa le ho feta, ho e fetola ho hloka ho kenya letsoho ha boenjiniere. Esita le tweak e nyenyane, joalo ka ho fetola ha mohato oa ho hlahloba o hlaha, ho bolela ho hlophisa karolo, ho ntlafatsa ho netefatsa, ho bula kopo ea ho hula, ho emela tlhahlobo, le ho romela hape. Karolo ea 2: Schema-Driven (SurveyJS) Joale ha re theheng phallo e tšoanang re sebelisa schema. Ho kenya npm kenya survey-core survey-react-ui @tanstack/react-query
survey-coreThe MIT-licensed platform-independent runtime enjene e matlafatsang tlhahiso ea mofuta oa SurveyJS - karolo eo re e tsotellang mona. E hloka schema ea JSON, e haha moetso oa ka hare ho eona, 'me e sebetsana le ntho e' ngoe le e 'ngoe e neng e ka phela karolong ea hau ea React: ho lekola lipolelo tsa ponahalo, ho kopanya litekanyetso tse nkiloeng, ho laola boemo ba leqephe, ho netefatsa ho latela, le ho etsa qeto ea hore na "feletseng" e bolela eng ho latela hore na ke maqephe afe a bontšitsoeng.
survey-react-uiThe UI / rendering layer e kopanyang mohlala oo ho React. Ha e le hantle ke karolo ea
Hammoho, li u fa nako ea ho sebetsa ka botlalo, e nang le maqephe a mangata ntle le ho ngola mola o le mong oa phallo ea taolo. Sebopeho sa schema ka boeona, joalo ka ha ho boletsoe pejana, ke JSON feela - ha ho na DSL kapa eng kapa eng e nang le thepa. U ka e kenya kahare, oa e kenya faeleng, oa e lata ho API, kapa oa e boloka ka har'a kholomo ea database ebe u e tšela ka nako ea nako. Foromo e Tšoanang, Joaloka Data Mona ke mofuta o tšoanang, lekhetlong lena o hlahisoa e le ntho ea JSON. schema e hlalosa ntho e 'ngoe le e' ngoe: sebopeho, netefatso, melao ea ponahalo, lipalo tse nkiloeng, ho tsamaisa maqephe - 'me e e fa Mohlala o e hlahlobang ka nako ea ho sebetsa. Mona ke hore na e shebahala joang ka botlalo:
export const surveySchema = { title: "Order Flow", showProgressBar: "top", pages: [ {lebitso: "details", elements: [ {type: "text", name: "firstName", isRequired: true }, {type: "text", name: "imeile", inputType: "imeile", isRequired: true, validators: [{ type : email] "In Email: "In Eval: }, {lebitso: "tatellano", likarolo: [ {mofuta: "mongolo", lebitso: "price", inputType: "nomoro", defaultValue: 0 }, {type: "text", lebitso: "quantity", inputType: "nomoro", defaultValue: 1 }, {type: "dropdown",lebitso: "taxRate", defaultValue: 0.1, likhetho: [ {boleng: 0.05, text: "5%" }, { boleng: 0.1, text: "10%" }, { value: 0.15, text: "15%" } ] }, {type: "expression", lebitso: "subtotal type}}}: "subtotal type"}}: "expression", name: "tax", polelo: "{subtotal} {taxRate}" }, {type: "expression", name: "total", polelo: "{subtotal} + {tax}" } ] }, {name: "account", elements: [ {type: "radiogroup", name: "hasAccount", dikgetho: ["": "username}", "Yes text: No" bonahalangHaeba: "{hasAccount} = 'Ee'", e ea Hlokahala: 'nete }, {type: "text", lebitso: "password", inputType: "password", ebonakalayoIf: "{hasAccount} = 'Ee'", e ea Hlokahala: 'nete, li-valdators: [{type: "text", minLength: 6, text: "Min :} } ratings characters" "satisfaction", rateMin: 1, rateMax: 5 }, {type: "comment", name: "positiveFeedback", visualIf: "{satisfaction} >= 4" }, {type: "comment", name: "improvementFeedback", visualIf: "{satisfaction} <= 2" } : ]: 1 leina {} :=0 , , , , , , , , , , , , , , , , , , , , , likarolo: [] } ]};
Bapisa sena le mofuta oa RHF nakoana.
SuperRefine block e neng e hloka lebitso la mosebelisi le password e felile. visualIf: "{hasAccount} = 'Ee'" e kopantswe le isRequired: true sebetsana le dingongoreho ka bobedi mmoho, lebaleng ka boyona, moo o neng o ka lebella ho di fumana. UseWatch + useMemo ketane e khomphuthang palo e nyane, lekhetho, le kakaretso e nkeloa sebaka ke likarolo tse tharo tsa polelo tse supanang ka mabitso. Boemo ba leqephe la tlhahlobo, boo mofuteng oa RHF bo neng bo ka hahuoa bocha feela ka ho latela showSubmit, mohato oa 3 o fana ka lekala. Qetellong, nav konopo logic ke ntho e le 'ngoe e bonahalangHaeba thepa e leqepheng la ntho.
Ho na le mabaka a tšoanang. Ke feela hore schema e e fa sebaka sa ho lula moo e bonahalang e le mong, ho e-na le ho hasana ho pholletsa le karolo. Hape, hlokomela hore schema e sebelisa mofuta: 'polelo' bakeng sa subtotal, lekhetho le kakaretso. Polelo e baloa feela 'me e sebelisoa haholo-holo ho bontša litekanyetso tse baloang. SurveyJS e boetse e ts'ehetsa mofuta: 'html' bakeng sa litaba tse sa fetoheng, empa bakeng sa litekanyetso tse baloang, polelo ke khetho e nepahetseng. Joale bakeng sa lehlakore la React. Ho Fana le ho Romela E bonolo haholo. Wire onComplete ho API ea hau ka mokhoa o ts'oanang - ka useMutation kapa thoto e hlakileng:
kenya {useState, useEffect, useRef } ho tsoa ho "react"; import {useMutation } ho tsoa ho "@tanstack/react-query"; import {Model } ho tsoa "survey-core"; import { Survey } from "survey-react-ui"; import "survey-core/survey-corecs".
Export function SurveyForm() { const [model] = useState(() => New Model(surveySchema));
const mutation = useMutation ({ phetohoFn: async (data) => { const res = emela ho lata ("/api/oda", { mokhoa: "POST", lihlooho: {"Mofuta-Mofuta": "application/json" }, 'mele: JSON.stringify(data), }); haeba (!res.ok) lahlela Phoso e ncha("E hlolehile ho fana"); khutla res.json(); }, });
const mutationRef = useRef(phetoho); mutationRef.current = phetoho; useEffect(() => { const handler = (moromelli) => mutationRef.current.mutate(sender.data); model.onComplete.add(motshwaro); kgutlisa () => model.onComplete.remove(motshwari); }, [mohlala]); // Ref e qoba ho ngolisa sebatli se seng le se seng (ho fetoha ha boitsebiso ba ntho e fetohang)
khutla (
<>
Sheba Pen SurveyJS-03-SurveyJS [e fereko] ka ho timela ha botšelela.
onComplete fire ha mosebelisi a fihla pheletsong ea leqephe la ho qetela le hlahang. Kahoo haeba kakaretso e sa fetele 100 mme leqephe la tlhahlobo le qhekelloa, le ntse le tuka ka nepo hobane SurveyJS e lekola ponahalo pele e etsa qeto ea hore na "leqephe la ho qetela" le bolela eng. Joale, sender.data e na le likarabo tsohle hammoho le lipalo tse baliloeng (subtotal, tax, total) joalo ka likarolo tsa boemo ba pele, kahoo moputso oa API o ts'oana le oo mofuta oa RHF o o kopantseng ka letsoho hoSubmit. Thepaterone ea mutationRef e tšoana le eo u ka e fihlelang kae kapa kae moo u hlokang mohlokomeli oa liketsahalo ea tsitsitseng holim'a boleng bo fetohang phetolelong e 'ngoe le e' ngoe - ha ho letho la SurveyJS-specific ka eona.
Karolo ea React ha e sa na mohopolo oa khoebo ho hang. Ha ho na useWatch, ha ho na JSX e nang le maemo, ha ho k'hamera ea mehato, ha ho na ketane ea useMemo, ha ho superRefine. React ke ho etsa seo e hlileng e leng sona: ho fana ka karolo le ho e kenya ka mohala oa API. Ke Eng e Ileng ea Tloha ho React?
Matšoenyeho Sekhahla sa RHF PatlisisoJS Ponahalo Makala a JSX bonahalangHaeba Litekanyetso tse nkiloeng useWatch / useMemo poleloana Melao e fapaneng superRefine Maemo a schema Navigation boemo ba mohato Leqephe le bonahalangHaeba Sebaka sa ho busa E ajoa ka har'a lifaele E bohareng ba schema
Se lulang ho React ke sebopeho, setaele, likhoele tsa ho fana, le kopanyo ea app, e leng ho re, lintho tsa React li hlile li etselitsoe. Ntho e 'ngoe le e' ngoe e kene ka har'a schema, 'me hobane schema ke ntho ea JSON feela, e ka bolokoa sebakeng sa polokelo ea litaba, ea fetoleloa ntle le khoutu ea hau ea kopo, kapa ea hlophisoa ka lisebelisoa tsa ka hare ntle le ho hloka ho romelloa. Mookameli oa lihlahisoa ea hlokang ho fetola moeli o hlahisang leqephe la tlhahlobo a ka etsa joalo ntle le ho ama karolo. Eo ke phapang e utloahalang ea ts'ebetso bakeng sa lihlopha moo boitšoaro ba sebopeho bo fetohang khafetsa 'me ha se kamehla bo tsamaisoang ke baenjiniere. Mokhoa o Mong le o Mong oa ho Sebelisa Neng? Mona ke molao o motle o sebetsang ho 'na: nahana ka ho hlakola foromo ka botlalo. U ka lahleheloa ke eng?
Haeba e le li-skrini, u batla liforomo tse tsamaisoang ke likarolo. Haeba e le mohopolo oa khoebo, joalo ka menyako, melao ea lekala, le litlhoko tse nang le maemo tse kenyelletsang liqeto tsa 'nete, o batla enjene ea schema.
Ka mokhoa o ts'oanang, haeba liphetoho tse tlang ho uena hangata li mabapi le lileibole, masimo le sebopeho, RHF e tla u sebeletsa hantle. Haeba li mabapi le maemo, liphetho, le melao eo sehlopha sa hau sa molao kapa sehlopha sa molao se ka hlokang ho se fetola ka Labobeli thapama ntle le ho kenya tekete, mohlala oa schema le SurveyJS ke ona o nepahetseng haholoanyane. Mekhoa ena e 'meli ha e hlile ha e hlōlisane. Ba sebetsana le lihlopha tse fapaneng tsa mathata, 'me phoso e lokelang ho qojoa ke ho se tsamaisane le boima ba mohopolo - ho tšoara tsamaiso ea molao joalo ka karolo hobane ke sesebelisoa se tsebahalang, kapa ho fihlela enjene ea pholisi hobane sebopeho se ile sa hola ho fihlela mehato e meraro mme sa fumana tšimo e nang le maemo. Sebopeho seo re se hahileng mona se lutse haufi le moeli ka boomo, se rarahane ka ho lekaneng ho pepesa phapang empa eseng e feteletseng hoo papiso e ikutloang e tsitsitse. Mefuta e mengata ea 'nete e sa utloahaleng ka har'a codebase ea hau e kanna ea lula haufi le moeli oo,' me hangata potso ke hore na ho na le motho ea boletseng seo e hlileng e leng sona. Sebelisa React Hook Foromo + Zod ha:
Foromo ba CRUD sekametseng; Logic ha e na botebo ebile e tsamaisoa ke UI; Baenjiniere ba na le boitšoaro bohle; Backend e ntse e le mohloli oa 'nete.
Sebelisa SurveyJS ha:
Liforomo li kenyelletsa liqeto tsa khoebo; Melao e iphetola ntle le UI; Maikutlo a tlameha ho bonahala, a hlahlojoe, kapa a fetoleloe; Batho bao e seng baenjiniere ba susumetsa boitšoaro; Sebopeho se ts'oanang se tlameha ho sebetsa ka mahlakoreng a mangata.