SurveyJS na-akwado edemede a Enwere ụdị echiche ọtụtụ ndị mmepe React na-ekekọrịta n'ekwughị ya n'olu dara ụda. Ụdị ndị ahụ kwesịrị ka ọ bụrụ akụkụ. Nke a pụtara nchịkọta dị ka:
Mpempe nkogharị mmeghachi omume maka steeti ime obodo (obere ntụgharị, ndebanye aha ubi ergonomic, mmekọrịta dị mkpa). Zod maka nkwado (ntinye ntinye, nkwado oke, ụdị-ntụgharị). Zaghachi ajụjụ maka nkwụghachi azụ: nrubeisi, nyochagharị, caching, mmekọrịta nkesa, na ihe ndị ọzọ.
Na maka ọtụtụ ụdị - ihuenyo nbanye gị, ibe ntọala gị, ụdị CRUD gị - nke a na-arụ ọrụ nke ọma. Ibe ọ bụla na-arụ ọrụ ya, ha na-edepụta nke ọma, ma ị nwere ike ịga n'ihu na akụkụ nke ngwa gị nke na-ekewa ngwaahịa gị n'ezie. Mana otu oge n'otu oge, ụdị na-amalite ịchịkọta ihe dị ka iwu visibiliti nke dabere na azịza mbụ, ma ọ bụ ụkpụrụ ewepụtara na-adaba na mpaghara atọ. Eleghị anya ọbụlagodi ibe niile kwesịrị ịwụpụ ma ọ bụ gosi dabere na mkpokọta na-agba ọsọ. Ị na-ejikwa ojijiWatch na ngalaba inline na-ejikwa ọnọdụ mbụ, nke dị mma. Mgbe ahụ ọzọ. Mgbe ahụ, ị na-eru maka superRefine ka itinye koodu n'ofe mpaghara nke atụmatụ Zod gị enweghị ike igosipụta n'ụzọ nkịtị. Mgbe ahụ, nzọụkwụ nzọụkwụ na-amalite na-agbapụta mgbagha azụmahịa. N'oge ụfọdụ, ị na-eleba anya n'ihe ị wulitere wee ghọta na ụdị ahụ abụghịzi UI n'ezie. Ọ bụ usoro mkpebi karịa, na osisi akụrụngwa bụ naanị ebe ị mere ịchekwa ya. Nke a bụ ebe m chere na ụdị echiche maka ụdị React na-akụda, na ọ bụghị onye ọ bụla kpatara ya. Nchịkọta RHF + Zod mara mma n'ihe emere ya. Ihe iseokwu a bụ na anyị na-anọgide na-eji ya gafee ebe abstractions ya dabara na nsogbu ahụ n'ihi na nhọrọ ọzọ chọrọ ụzọ dị iche iche iche echiche banyere ụdị kpamkpam. Edemede a gbasara ihe ọzọ. Iji gosi nke a, anyị ga-ewu otu ụdị usoro ọtụtụ ugboro ugboro abụọ:
Na React Hook form + Zod wired ka ọ zaa ajụjụ maka nrubeisi, Site na SurveyJS, nke na-ewere ụdị dị ka data - atụmatụ JSON dị mfe - karịa osisi akụrụngwa.
Otu ihe achọrọ, otu mgbagha ọnọdụ, otu oku API na njedebe. Mgbe ahụ, anyị ga-akọwapụta kpọmkwem ihe kwagara na ihe fọdụrụ, wee wepụta ụzọ bara uru iji kpebie ụdị ị ga-eji, na mgbe. Form anyị na-ewu:
Ụdị a ga-eji usoro ụzọ anọ: Nzọụkwụ 1: Nkọwa
Aha mbụ (chọrọ), Email (chọrọ, ụdị dị irè).
Nzọụkwụ 2: Nye iwu
Ọnụ ego otu, Ọnụọgụ, Ọnụ ego ụtụ, Ewepụtara: Nchịkọta, Ụtụ isi, Mkpokọta.
Kwụpụ 3: Akaụntụ & Nzaghachi
Ị nwere akaụntụ? (Ee/Ee e) Ọ bụrụ Ee → aha njirimara + paswọọdụ, ha abụọ chọrọ. Ọ bụrụ Mba → anakọtara email na nzọụkwụ 1.
Ogo afọ ojuju (1–5) Ọ bụrụ ≥ 4 → jụọ "Gịnị masịrị gị?" Ọ bụrụ ≤ 2 → jụọ "Gịnị ka anyị nwere ike imeziwanye?"
Nzọụkwụ 4: Nyochaa
Na-egosi naanị ma ọ bụrụ mkpokọta> = 100 Nrubeisi ikpeazụ.
Nke a abụghị oke oke. Ma o zuru ezu ikpughe ọdịiche nke ụkpụrụ ụlọ. Nkebi 1: Akụkụ-Mkpụrụ Akpụ (Fọm nko na-emeghachi omume + Zod) Nwụnye npm tinye react-hook-form zod @hookform/resolvers @tanstack/react-query
Zod Schema Ka anyị malite na atụmatụ Zod, n'ihi na nke ahụ na-emekarị ka ọdịdị nke ụdị ahụ guzosie ike. Maka nzọụkwụ abụọ mbụ - nkọwa nkeonwe na ntinye iwu - ihe niile kwụ ọtọ: eriri achọrọ, ọnụọgụ nwere opekempe, na nọmba. Akụkụ na-adọrọ mmasị na-amalite mgbe ị na-agbalị ikwupụta iwu ọnọdụ.
mbubata {z} site na "zod";
mbupụ const formSchema = z.object ({ firstAha: z.string() .min(1, "Achọrọ"), email: z.string().email("email na-ezighi ezi"), ọnụ ahịa: z.number().min(0), quantity: z.number().min(1), taxRate: z.number(), hasAccount: z.enname: "["]), aha njirimara: z.enum ([") z.string ().nhọrọ (), okwuntughe: z.string ().nhọrọ (), afọ ojuju: z.number ().min (1).max (5), positiveFeedback: z.string () .nhọrọ (), mmeliteFeedback: z.string ().nhọrọ (),}).superRefine ((data, ctx) => {ma ọ bụrụ (data.hasAccount) {== "data. ctx.addIssue ({koodu: "omenala", ụzọ: ["aha njirimara"], ozi: "Achọrọ"}); } ma ọ bụrụ na (! data.password || data.password.length < 6) {ctx.addIssue
ọ bụrụ (data.satisfaction>= 4 && !data.positiveFeedback) {ctx.addIssue ({koodu: "custom", ụzọ: ["positiveFeedback"], ozi: "Biko kesaa ihe masịrị gị"}); }
ọ bụrụ (data.satisfaction <= 2 && !data.improvementFeedback) {ctx.addIssue({koodu: "omenala", ụzọ:["improvementFeedback"], ozi: "Biko gwa anyị ihe anyị ga-emeziwanye"}); }});
ụdị mbupụ FormData = z.infer<ụdị formSchema>;
Rịba ama na a na-ede aha njirimara na okwuntughe dị ka nhọrọ () n'agbanyeghị na achọrọ ha n'ọnọdụ n'ihi na ụdị ọkwa Zod na-akọwa ọdịdị nke ihe ahụ, ọ bụghị iwu na-achịkwa mgbe ubi dị mkpa. Ihe a chọrọ ka ọ dị ndụ ga-ebi n'ime superRefine, nke na-agba ọsọ mgbe ọdịdị ahụ kwadoro ma nwee ike ịnweta ihe zuru ezu. Nkewa ahụ abụghị ntụpọ; ọ bụ naanị ihe e mere maka ngwaọrụ ahụ: superRefine bụ ebe mgbagha mgbagha na-aga mgbe enweghị ike igosipụta ya na nhazi atụmatụ n'onwe ya. Ihe dị ịrịba ama ebe a bụ ihe atụmatụ a anaghị egosipụta. O nweghị echiche nke ibe, enweghị echiche nke mpaghara a na-ahụ anya n'oge, na enweghị echiche nke igodo. Ihe ndị ahụ niile ga-ebi n’ebe ọzọ. Ngwa Ngwa
mbubata {useForm, useWatch} site na "react-hook-form"; mbubata {zodResolver } site na "@hookform/resolvers/zod";import {useMutation } si "@tanstack/react-query"; mbubata {useState, jiriMemo } si"react"/bubata; ụdịdị FormSchetama,
const STEPS = ["nkọwa", "usoro", "akaụntụ", "nyocha"];
ụdị OrderPayload = FormData & {mkpokọta: nọmba; ụtụ: nọmba; mkpokọta: ọnụọgụ};
ọrụ mbupụ RHFMultiStepForm () {const [nzọụkwụ, setStep] = useState (0);
const mutation = iji Mutation ({ mutationFn: async (ụgwọ: OrderPayload) => { const res = chere weta ("/api/orders", { usoro: "POST", nkụnye eji isi mee: {"Ọdịnaya-Ụdị": "application/json"}, ahu: JSON.stringify(ibu), } ma ọ bụrụ na (!res.ok) tufuo Error ọhụrụ ("Enweghị n'okpuru"); laghachi res.json (); }, }
const {debanye aha, njikwa, handleSubmit, formState: { Error},} = useForm
nloghachi (
);}Hụ Pen SurveyJS-03-RHF [nke agbadoro] site na mkpochapụ. Enwere ọtụtụ ihe na-eme ebe a, ọ dịkwa mma ka ị were nwayọ chọpụta ebe ihe kwụsịrị.
A na-agbakọ ụkpụrụ ndị ewepụtara - obere mkpokọta, ụtụ isi, mkpokọta - n'ime akụrụngwa site na ijiWatch na jiriMemo n'ihi na ha dabere na ụkpụrụ ubi ndụ na enweghị ebe ọzọ eke maka ha. Iwu visibiliti maka aha njirimara, okwuntughe, nzaghachi ziri ezi na mmelite nzaghachi na-ebi na JSX dị ka ọnọdụ inline. Ihe mgbagha mgbagharị nzọụkwụ - ibe nyocha na-apụta naanị mgbe mkpokọta>= 100 - agbakwunyere n'ime ihe ngosi Nyefee agbanwe yana ọnọdụ inye ya na nzọụkwụ 3. Ntugharị n'onwe ya bụ naanị counter State nke anyị na-eji aka na-abawanye. Ajụjụ azaghachi na-edozi nyochagharị, caching, na mmebi iwu. Ụdị a na-akpọ mutation.mutate nwere data akwadoro.
Ọ dịghị nke ọ bụla n'ime ihe ndị a adịghị njọ, kwa otu. Nke a ka bụ ihe nleba anya React, akụkụ ahụ na-arụkwa ọrụ nke ọma n'ihi ka RHF si ekewapụta ndị na-emegharịgharị. Ma ọ bụrụ na ị ga-enyefe nke a n'aka onye na-edeghị ya ma gwa ha ka ha kọwaa n'okpuru ọnọdụ ihu akwụkwọ nyocha ahụ pụtara, ha ga-achọpụta site na showSubmit, nzọụkwụ 3 na-enye ọnọdụ, na mgbagha bọtịnụ nav - ebe atọ dị iche iche - iji wughachi iwu nke nwere ike ikwu n'otu ahịrị. Ụdị ahụ na-arụ ọrụ, ee, mana omume ahụ abụghị nke a na-enyocha n'ezie dị ka usoro. A ghaghị igbu ya n'uche. Nke kachasị mkpa, ịgbanwe ya chọrọ itinye aka na injinịa. Ọbụlagodi obere tweak, dị ka imezigharị mgbe nzọụkwụ nyocha gosipụtara, pụtara dezie akụrụngwa, imelite nkwado, imepe arịrịọ ịdọrọ, na-eche nyocha, na ibuga ọzọ. Nkebi 2: Nhazi-Nyocha (SurveyJS) Ugbu a, ka anyị jiri usoro nhazi rụọ otu usoro ahụ. Nwụnye npm wụnye Survey-core survey-react-ui @tanstack/react-query
nnyocha e mere-isi MIT nwere ikikere n'elu ikpo okwu na-adabere na ya na-agba ọsọ oge nke na-eme ka ụdị SurveyJS nwee ike - akụkụ anyị na-eche banyere ebe a. Ọ na-ewe schema JSON, wulite ihe nlere ime n'ime ya, wee na-ejikwa ihe niile ga-adị ndụ n'ime akụrụngwa React gị: nyochaa okwu nhụsianya, ịgbakọ ụkpụrụ ewepụtara, ijikwa steeti ibe, nkwado nsuso, na ikpebi ihe “zuru oke” pụtara inye ibe egosipụtara n'ezie.
Survey-react-uiThe UI / rendering oyi akwa na-ejikọta ihe nlereanya ahụ na React. Ọ bụ n'ezie ihe
Ọnụ, ha na-enye gị n'ụzọ zuru ezu na-arụ ọrụ, multi-page ụdị ojiri oge na-enweghị ide otu ahịrị nke njikwa eruba. Usoro nhazi n'onwe ya bụ, dị ka ekwuru na mbụ, naanị JSON - enweghị DSL ma ọ bụ ihe ọ bụla. Ị nwere ike tinye ya n'ahịrị, bubata ya na faịlụ, weta ya na API, ma ọ bụ chekwaa ya na kọlụm nchekwa data wee mee ka mmiri dị na ya n'oge ọsọ. Otu Ụdị ahụ, Dị ka Data Nke a bụ otu ụdị, oge a gosipụtara dị ka ihe JSON. Atụmatụ ahụ na-akọwapụta ihe niile: nhazi, nkwenye, iwu visibiliti, mgbako ewepụtara, igodo ibe - ma nyefee ya na Model nke na-enyocha ya n'oge ọ na-agba ọsọ. Nke a bụ ihe nke ahụ dị ka n'uju:
mbupụ const surveySchema = { aha: "Order Flow", showProgressBar: "n'elu", ibe: [ { aha: "nkọwa", ọcha: [ {ụdị: "text", aha: "firstAha", isRequired: true }, {ụdị: "ederede", aha: "email", ntinyeType: "email", a na-achọrọ: ezi, ndị na-arụ ọrụ email: [{} ụdị: "ederede] ] } , {aha: "usoro", ihe: [ {ụdị: "ederede", aha: "ọnụahịa", inputType: "nọmba", defaultValue: 0 }, {ụdị: "ederede", aha: "ọnụọgụ", ntinye Ụdị: "nọmba", ndabaraValue: 1 }, {ụdị:"dobe",aha: "ụtụ ụtụ", ndabaraValue: 0.1, nhọrọ: [ {uru: 0.05, ederede: "5%"}, {uru: 0.1, ederede: "10%" }, {uru: 0.15, ederede: "15%"} ] , {ụdị:" nkwupụta", aha: "subtotal} ụdị ", {price okwu": {price] "okwu", aha: "ụtụ isi", okwu: "{subtotal} {taxRate}"}, {ụdị: "expression", aha: "ngụkọta", okwu: "{subtotal} + {tax}" } ] }, {aha: "akaụntụ", ihe: [ {ụdị: "radiogroup", aha: "hasAccount",}t: [" aha] "username", visualỌ bụrụ: "{hasAccount} = 'Ee'", achọrọ: ezi }, {ụdị: "ederede", aha: "password", inputType: "password", visualIf: "{hasAccount} = 'Ee'", isRequired: true, validators: [{ type: "text", minLength: "ụdị 6}] ederede: "ụdị 6}] aha: "afọ ojuju", rateMin: 1, rateMax: 5 }, {ụdị:" ikwu", aha: "positiveFeedback", visualỌ bụrụ: "{satisfaction} >= 4" }, {ụdị: "okwu", aha: "improvementFeedback", a na-ahụ anya Ọ bụrụ: "{afọ ojuju aha} <= 2" }}], {ọ bụrụ na a na-ahụ anya, 100", ihe: []} ]};
Tulee nke a na ụdị RHF nwa oge.
Ihe mgbochi superRefine nke achọrọ aha njirimara na paswọọdụ akwụsịla. visualIf: "{hasAccount} = 'Ee'" jikọtara ya na isRequired: ezi na-edozi nchegbu abụọ ahụ ọnụ, n'ọhịa n'onwe ya, ebe ị ga-atụ anya ịchọta ha. A na-eji mpaghara okwu atọ na-ezo aka n'aha n'otu n'otu dochie eriri useWatch + na-eji Memo gbakọọ obere mkpokọta, ụtụ isi na mkpokọta. Ọnọdụ ihu akwụkwọ nyocha, nke dị na ụdị RHF bụ nke enwere ike ịrụgharị ya naanị site na ịchọgharị site na showSubmit, nzọụkwụ 3 na-enye alaka. N'ikpeazụ, mgbagha bọtịnụ nav bụ otu ihe a na-ahụ anyaỌ bụrụ ihe onwunwe dị na ibe ibe.
Otu mgbagha dị n'ebe ahụ. Ọ bụ naanị na atụmatụ ahụ na-enye ya ebe ọ ga-ebi ebe a na-ahụ ya na iche, kama ịgbasa na mpaghara ahụ. Ọzọkwa, mara na schema na-eji ụdị: 'nkwupụta' maka mkpokọta mkpokọta, ụtụ isi na mkpokọta. A na-agụ naanị nkwupụta ma jiri ya gosipụta ụkpụrụ agbakọrọ. SurveyJS na-akwadokwa ụdị: 'html' maka ọdịnaya kwụ ọtọ, mana maka ụkpụrụ agbakọrọ, okwu bụ nhọrọ ziri ezi. Ugbu a maka akụkụ React. Enyemaka na Nrubeisi Dị mfe. Waya zuru ezu na API gị n'otu ụzọ ahụ - site na ijiMutation ma ọ bụ weta larịị:
mbubata {useState, useEffect, useRef} site na "mmeghachi omume"; mbubata { useMutation } site na "@tanstack/react-query"; mbubata {Model } site na "survey-core"; mbubata { Survey } site na "survey-react-ui"; mbubata "survey-isi/survey-core."
ọrụ mbupụ SurveyForm () {const [model] = useState (() => ọhụrụ Model(surveySchema));
const mutation = iji Mutation ({ mutationFn: async (data) => { const res = chere weta ("/api/orders", { usoro: "POST", nkụnye eji isi mee: {"Ọdịnaya-Ụdị": "application/json"}, ahu: JSON.stringify(data), } ma ọ bụrụ na (!res.ok) tufuo Error ọhụrụ ("Enweghị n'okpuru"); laghachi res.json (); }, }
const mutationRef = useRef(mgbanwe); mutationRef.current = mmụpụta; useEffect (() => {const handler = (onye na-ezipụ) => mutationRef.current.mutate(sender.data); model.onComplete.add (handler); nloghachi () => model.onComplete.remove (onye njikwa); }, [ụdị]); // ref na-ezere ịdebanye aha onye njikwa ihe ọ bụla (mgbanwe njirimara ihe ngbanwe)
laghachi (
ihe
Hụ Pen SurveyJS-03-SurveyJS [nke agbadoro] site na mkpochapụ.
on Ọkụ zuru ezu mgbe onye ọrụ rutere na njedebe nke ibe ikpeazụ a na-ahụ anya. Ya mere, ọ bụrụ na ngụkọta agaghị agafe 100 na ibe nyocha na-awụpụ, ọ ka na-agba ọkụ nke ọma n'ihi na SurveyJS na-enyocha visibiliti tupu ekpebi ihe "ibe ikpeazụ" pụtara. Mgbe ahụ, sender.data nwere azịza niile yana ụkpụrụ a gbakọrọ (mkpokọta, ụtụ isi, mkpokọta) dị ka ubi klas nke mbụ, yabụ ugwo API yiri ihe ụdị RHF gbakọtara n'aka na onSubmit. Nkeụkpụrụ mutationRef bụ otu ihe ị ga-erute ebe ọ bụla ịchọrọ onye na-ahụ maka mmemme kwụsiri ike karịa uru na-agbanwe n'ụdị ọ bụla - ọ nweghị ihe SurveyJS akọwapụtara gbasara ya.
Akụkụ React enwekwaghị mgbagha azụmahịa ọ bụla ma ọlị. Enweghị useWatch, enweghị ọnọdụ JSX, enweghị akara nzọụkwụ, enweghị yinye Memo, enweghị superRefine. Mmeghachi omume na-eme ihe ọ dị mma n'ezie: inye akụrụngwa na ijikọ ya na oku API. Gịnị na-emeghachi omume?
Nchegbu Nchịkọta RHF NyochaaJS Nhụta JSX alaka anya Ọ bụrụ Ụkpụrụ ewepụtara jiriWatch / jiri Memo okwu Iwu nke ime obodo superRefine Ọnọdụ nhazi Nsoro ụzọ steeti steeti Ibe a na-ahụ anya Ọ bụrụ Ọnọdụ ọchịchị Kesara n'ofe faịlụ Centralized na schema
Ihe na-anọ na React bụ okirikiri nhọrọ ukwuu, styling, nrubeisi wiring, na ngwa mwekota, nke bụ na-ekwu, ihe React e mere n'ezie maka. Ihe ọ bụla ọzọ kwagara n'ime atụmatụ ahụ, yana n'ihi na atụmatụ ahụ bụ naanị ihe JSON, enwere ike ịchekwa ya na nchekwa data, depụta ya na koodu ngwa gị, ma ọ bụ dezie ya site na ngwa n'ime na-achọghị ibugharị. Onye njikwa ngwaahịa nke kwesịrị ịgbanwe ọnụ ụzọ nke na-eme ka ibe nyochaa nwere ike ime nke ahụ na-emetụghị akụkụ ahụ aka. Nke ahụ bụ ihe dị iche na arụmọrụ bara uru maka ndị otu ebe omume ụdị na-etolite ugboro ugboro na ọ bụghị ndị injinia na-eduzi ya mgbe niile. Mgbe Iji Ụzọ Ọ bụla? Nke a bụ ezigbo iwu isi mkpịsị aka na-arụ ọrụ nye m: were ya na-ehichapụ fọm ahụ kpamkpam. Kedu ihe ị ga-atụfu?
Ọ bụrụ na ọ bụ enyo enyo, ịchọrọ ụdị nke akụrụngwa na-eduzi. Ọ bụrụ na ọ bụ mgbagha azụmaahịa, dị ka ọnụ ụzọ, iwu ngalaba na ọnọdụ ọnọdụ nke na-etinye ezigbo mkpebi, ịchọrọ injin schema.
N'otu aka ahụ, ọ bụrụ na mgbanwe ndị na-abịa n'ụzọ gị na-abụkarị maka akara, mpaghara, na nhazi, RHF ga-enyere gị aka nke ọma. Ọ bụrụ na ha gbasara ọnọdụ, nsonaazụ, na iwu ndị ops gị ma ọ bụ ndị otu iwu nwere ike ịhazigharị n'ehihie Tuzdee na-etinyeghị akwụkwọ tiketi, ụdị schema na SurveyJS bụ ihe dabara adaba karịa. Ụzọ abụọ a abụghị n'ezie asọmpi n'etiti ibe ha. Ha na-ekwu okwu dị iche iche nke nsogbu, na mmejọ kwesịrị izere bụ mismatching abstraction na arọ nke mgbagha - na-emeso a iwu usoro dị ka a akụrụngwa n'ihi na nke ahụ bụ ihe a maara nke ọma ngwá ọrụ, ma ọ bụ iru maka a amụma engine n'ihi na ụdị toro na nzọụkwụ atọ wee nweta ọnọdụ ọnọdụ. Ụdị anyị wuru ebe a na-anọdụ ala n'akụkụ oke nke ụma, gbagwojuru anya iji kpughee ihe dị iche mana ọ bụghị nke ukwuu nke na ntụnyere ahụ na-eche na ọ dị njọ. Ọtụtụ ụdịdị adịchaghị mma na koodu koodu gị nwere ike ịnọdụ ala n'akụkụ otu oke ahụ, ajụjụ a na-abụkarị ma onye ọ bụla akpọpụtala aha ha bụ n'ezie. Jiri mpempe nzaghachi mmeghachi omume + Zod mgbe:
Ụdị na-adabere na CRUD; Logic bụ nke na-emighị emi na UI-chụpụrụ; Ndị injinia nwere omume niile; Azụ azụ ka bụ isi iyi nke eziokwu.
Jiri SurveyJS mgbe:
Ụdị na-ekpuchi mkpebi azụmahịa; Iwu na-etolite na-adabereghị na UI; Ezi uche ga-abụrịrị nke a na-ahụ anya, na-enyocha ma ọ bụ mbipute ya; Ndị na-abụghị injinia na-emetụta omume; Otu ụdị ahụ ga-agaferịrị n'ofe ihu.