Iyi ngingo yatewe inkunga na SurveyJS Hano hari icyitegererezo cyo mumutwe benshi bateza imbere reaction basangiye batigeze babiganiraho hejuru. Iyo miterere igomba guhora igomba kuba ibice. Ibi bivuze igipande nka:
Kora Ifishi ya Hook kuri leta yaho (re-renders ntoya, kwandikisha umurima wa ergonomic, imikoranire ya ngombwa). Zod yo kwemeza (kwinjiza neza, kwemeza imipaka, ubwoko-bwizewe). Reba Ikibazo cyinyuma: gutanga, gusubiramo, kubika, guhuza seriveri, nibindi.
Kandi kubwinshi bwinshi bwimiterere - kwinjira kwa ecran, urupapuro rwimiterere, uburyo bwa CRUD - ibi bikora neza. Igice cyose gikora akazi kacyo, gihimba neza, kandi urashobora kwimukira mubice bya porogaramu yawe itandukanya ibicuruzwa byawe. Ariko burigihe, burigihe, ifishi itangira kwegeranya ibintu nkamategeko agaragara ashingiye kubisubizo byabanje, cyangwa indangagaciro zikomoka kumasaka atatu. Ahari nimpapuro zose zigomba gusimbuka cyangwa kwerekanwa ukurikije igiteranyo cyuzuye. Ukemura ikibazo cya mbere hamwe nogukoresha Isaha hamwe nishami ryumurongo, nibyiza. Hanyuma undi. Noneho uragera kuri superRefine kugirango ushireho amategeko yambukiranya imipaka gahunda yawe ya Zod idashobora kwerekana muburyo busanzwe. Noneho, kugendana intambwe bitangira kumeneka mubucuruzi. Igihe kimwe, urareba ibyo wubatse ukamenya ko form itakiri UI rwose. Nibindi byinshi byo gufata ibyemezo, kandi igiti cyibigize niho wabaye kugirango ubibike. Aha niho nibaza ko moderi yo mumutwe kumiterere muri Reaction isenyuka, kandi mubyukuri ntamakosa yabantu. Ikibaho cya RHF + Zod nicyiza kubyo cyagenewe. Ikibazo nuko dukunda gukomeza kuyikoresha kera aho abstraction yayo ihuye nikibazo kuko ubundi busaba ubundi buryo bwo gutekereza kumiterere yose. Iyi ngingo ivuga kubyerekeye ubundi buryo. Kugirango twerekane ibi, tuzubaka form imwe imwe yintambwe ebyiri:
Hamwe na Reaction Hook Ifishi + Zod wired kugirango Ukore Ikibazo kugirango utange, Hamwe na SurveyJS, ifata ifishi nkamakuru - igishushanyo cyoroshye cya JSON - kuruta igiti cyibigize.
Ibisabwa bimwe, logique imwe isabwa, guhamagara API kumpera. Noneho tuzashushanya neza icyimutse nicyagumye, hanyuma dushyireho inzira ifatika yo guhitamo icyitegererezo ugomba gukoresha, nigihe. Ifishi twubaka:
Iyi fomu izakoresha intambwe 4: Intambwe ya 1: Ibisobanuro
Izina rya mbere (risabwa), Imeri (bisabwa, imiterere yemewe).
Intambwe ya 2: Tegeka
Igiciro cyibice, Umubare, Igipimo cy'umusoro, Inkomoko: Subtotal, Umusoro, Igiteranyo.
Intambwe ya 3: Konti & Ibitekerezo
Ufite konti? (Yego / Oya) Niba Yego → ukoresha izina ryibanga + ijambo ryibanga, byombi bisabwa. Niba Oya → imeri yamaze gukusanywa mu ntambwe ya 1.
Igipimo cyo kunyurwa (1-5) Niba ≥ 4 → baza “Wakunze iki?” Niba ≤ 2 → baza “Niki dushobora kunonosora?”
Intambwe ya 4: Isubiramo
Gusa biragaragara niba byose> = 100 Kwiyemeza bwa nyuma.
Ibi ntibikabije. Ariko birahagije kwerekana itandukaniro ryubwubatsi. Igice cya 1: Ibikoresho-Bitwarwa (Reba Ifishi Ifata + Zod) Kwinjiza npm shyiramo reaction-hook-form zod @ hookform / abakemura @ tanstack / reaction-ikibazo
Igishushanyo cya Zod Reka duhere kuri Zod schema, kuko mubisanzwe aho niho imiterere yimiterere iba. Kubyiciro bibiri byambere - amakuru yihariye no gutondekanya ibyinjira - byose birigororotse: imirongo isabwa, imibare ifite byibuze, na enum. Igice gishimishije gitangira iyo ugerageje kwerekana amategeko asabwa.
gutumiza {z} muri "zod";
Ifishi yo kohereza hanzeSchema = z.ibintu ({Izina ryambere: z.string (). min (1, "Ibisabwa"), imeri: z.string (). imeri ("imeri itemewe"), igiciro: z.umubare (). min (0), ingano: z.umubare (). min (1), umusoroRate: z.umubare:) z. (! data.username) {ctx.addIsue ({code: "gakondo", inzira:
niba (data. kunyurwa> = 4 &&! data.positiveFeedback) {ctx.addIsue ({code: "gakondo", inzira: ["Ibitekerezo byiza"], ubutumwa: "Nyamuneka sangira ibyo ukunda"}); }
niba (data. kunyurwa <= 2 &&! data.impinduka zisubizwa) {ctx.addIkibazo ({code: "gakondo", inzira:["Gutezimbere Ibisubizo"], ubutumwa: "Nyamuneka tubwire icyo tugomba kunoza"}); }});
Ubwoko bwo kohereza hanze FormData = z.infer
Menya ko izina ryukoresha nijambo ryibanga byanditse nkubushake () nubwo bisabwa muburyo buteganijwe kuko ubwoko bwa Zod-urwego rwimiterere isobanura imiterere yikintu, ntabwo amategeko agenga iyo imirima ifite akamaro. Ibisabwa bisabwa bigomba kuba imbere muri superRefine, ikora nyuma yimiterere yemewe kandi ifite uburenganzira kubintu byose. Ukwo gutandukana ntabwo ari inenge; nibyo gusa igikoresho cyagenewe: superRefine niho logique yambukiranya imipaka igenda iyo idashobora kugaragarira muburyo bwimigambi ubwayo. Ikigaragara kandi hano nicyo iyi gahunda itagaragaza. Ntabwo ifite igitekerezo cyimpapuro, nta gitekerezo cyimirima igaragara aho bigeze, kandi nta gitekerezo cyo kugenda. Ibyo byose bizatura ahandi. Ibigize
gutumiza {gukoreshaForm, koreshaWatch} kuva "reaction-hook-form"; gutumiza {zodResolver} kuva "@ hookform / resolvers / zod"; gutumiza {gukoreshaMutation} kuva "@ tanstack / react-query";
const INTAMBWE = ["ibisobanuro", "gahunda", "konte", "gusubiramo"];
andika OrderPayload = FormData & {subtotal: umubare; umusoro: umubare; yose: umubare};
ibikorwa byo kohereza hanze RHFMultiStepForm () {const [intambwe, setStep] = gukoreshaState (0);
ihinduka rya mutation = gukoreshaMutation ({ mutationFn: async (kwishura: GutumizaPayload) => { const res = gutegereza kuzana ("/ api / amabwiriza", { buryo: "POST", imitwe: {"Ibirimo-Ubwoko": "gusaba / json"}, umubiri: JSON.hindura (kwishura), }); niba (! res.ok) guta Ikosa rishya ("Kunanirwa gutanga"); garuka res.json (); }, });
const. igiciro = gukoresha Reba ({kugenzura, izina: "igiciro"}); ubwinshi = gukoresha Reba ({kugenzura, izina: "ubwinshi"}); const taxRate = koresha Isaha ({kugenzura, izina: "umusoroRate"}); const ifiteAcount = gukoreshaWatch ({kugenzura, izina: "hasAccount"}); const kunyurwa = gukoresha Reba ({kugenzura, izina: "kunyurwa"}); const subtotal = gukoreshaMemo (() => (igiciro ?? 0) * (ubwinshi ?? 1), [igiciro, ubwinshi]); umusoro wa const = gukoreshaMemo (() => subtotal * (umusoroRate ?? 0), [subtotal, umusoroRate]); const total = gukoreshaMemo (() => subtotal + umusoro, [subtotal, umusoro]); const onSubmit = (data: FormData) => mutation.mutate ({... data, subtotal, umusoro, yose}); const showShereza = (intambwe === 2 && yose <100) || (intambwe === 3 && yose> = 100)
garuka ( intambwe === 1 && (<>
{intambwe === 2 && (<>
{hasAcount === "Yego" && (<>
{kunyurwa> = 4 && ()}
{kunyurwa <= 2 && ()} >)}
{intambwe === 3 && yose> = 100 &&
Reba Ikaramu IkaramuJS-03-RHF [forked] na mirongo itandatu. Hano haribintu byinshi bibera hano, kandi birakwiye gutinda kubona aho ibintu bigarukira.
Indangagaciro zikomoka - subtotal, umusoro, igiteranyo - zibarwa mubice ukoresheje gukoreshaWatch na useMemo kuko biterwa nagaciro keza kahantu kandi ntahantu nyaburanga kuri bo. Amategeko agaragara kumukoresha, ijambo ryibanga, gusubiza neza, no kunozaIbisubizo bibaho muri JSX nkibisanzwe. Intambwe-gusimbuka logique - urupapuro rwo gusubiramo rugaragara gusa iyo byose> = 100 - byinjijwe muri showSubmit variable hamwe na render condition kumuntambwe 3. Kugenda ubwabyo nugukoresha gusa konte ya konte turimo kwiyongera. Igisubizo Ikibazo gikemura ibibazo, cishing, no gutesha agaciro. Ifishi yita mutation gusa. Hindura hamwe namakuru yemewe.
Nta na kimwe muri ibyo kibi, kuri buri. Ibi biracyari reaction idasanzwe, kandi ibiyigize birakora neza bitewe nuburyo RHF itandukanya re-gutanga. Ariko uramutse uhaye ibi umuntu utarabyanditse ukabasaba gusobanura mubihe urupapuro rwisubiramo rugaragara, bagomba gukurikirana binyuze kuri ShowSubmit, intambwe ya 3 itanga imiterere, hamwe na log buto ya nav - ahantu hatatu - kugirango hubakwe itegeko ryashoboraga kuvugwa kumurongo umwe. Ifishi irakora, yego, ariko imyitwarire ntabwo igenzurwa rwose nka sisitemu. Igomba gukorwa mu mutwe. Icyingenzi cyane, kubihindura bisaba uruhare rwubuhanga. Ndetse n'akantu gato twahinduye, nko guhindura iyo intambwe yo gusuzuma yerekanwe, bivuze guhindura ibice, kuvugurura kwemeza, gufungura icyifuzo cyo gukurura, gutegereza gusubiramo, no kongera kohereza. Igice cya 2: Igishushanyo-Cyashizweho (UbushakashatsiJS) Noneho reka twubake urujya n'uruza dukoresheje igishushanyo. Kwinjiza npm shyiramo ubushakashatsi-bwibanze ubushakashatsi-reaction-ui @ tanstack / reaction-kubaza
ubushakashatsi-bwibanzeIbikoresho byemewe na MIT-yigenga ya moteri yimikorere itanga uburyo bwa SurveyJS itanga - igice twita hano. Ifata igishushanyo cya JSON, yubaka icyitegererezo cyimbere muri yo, kandi ikora ibintu byose byari kubaho mubindi bice bya Reaction: gusuzuma imvugo igaragara, kubara indangagaciro zikomoka, gucunga page page, gukurikirana kwemeza, no guhitamo icyo "cyuzuye" bivuze ukurikije impapuro zerekanwe mubyukuri.
ubushakashatsi-reaction-uiUurwego UI / gutanga urwego ruhuza iyo moderi na Reaction. Nubusanzwe ni
Hamwe na hamwe, baraguha imikorere yuzuye, impapuro nyinshi zo gukora mugihe utanditse umurongo umwe wo kugenzura ibintu. Igishushanyo mbonera ubwacyo, nkuko byavuzwe mbere, gusa JSON - nta DSL cyangwa ikindi kintu cyose. Urashobora kuyishiramo umurongo, kuyitumiza muri dosiye, kuyikura muri API, cyangwa kuyibika mububiko bwububiko hanyuma ukayiyobora mugihe cyagenwe. Ifishi imwe, nkamakuru Dore uburyo bumwe, iki gihe cyerekanwe nkikintu cya JSON. Igishushanyo gisobanura byose: imiterere, kwemeza, amategeko agaragara, kubara, kubara page - no kuyishyikiriza Model ibisuzuma mugihe gikwiye. Dore uko bisa byuzuye:
kohereza ibicuruzwa hanze yoherejweSchema = {umutwe: "Tegeka gutemba", kwerekanaIterambereBar: "hejuru", impapuro: [{izina: "ibisobanuro", ibintu: {izina: "gutondekanya", ibintu:izina: "umusoroRate", isanzwe Agaciro: 0.1, guhitamo: [{agaciro: 0.05, inyandiko: "5%"}, {agaciro: 0.1, inyandiko: "10%"}, {agaciro: 0.15, inyandiko: "15%"}]}, "imvugo", izina: "igiteranyo", imvugo: "{subtotal} + {umusoro}"}]}, {izina: "konte", ibintu: . .
Gereranya ibi na verisiyo ya RHF kumwanya muto.
Inzitizi ya superRefine isaba izina ryumukoresha nijambobanga ryagiye. ikigaragara Niba: "{hasAccount} = 'Yego'" ihujwe na isabwa: ukuri gukemura ibibazo byombi hamwe, kumurima ubwawo, aho wakwitega kubisanga. GukoreshaWatch + koreshaMemo urunigi rwabaze subtotal, umusoro, hamwe na byose bisimbuzwa imirima itatu imvugo yerekanwe hagati yizina. Urupapuro rwo gusubiramo imiterere, muri verisiyo ya RHF yarubatswe gusa mugushakisha kuri ShowSmit, intambwe ya 3 itanga ishami. Hanyuma, nav buto ya logique ni imwe igaragara Niba umutungo uri kurupapuro.
Ubwenge bumwe burahari. Ni uko igishushanyo giha umwanya wo gutura aho kigaragara mu bwigunge, aho gukwirakwira hose. Kandi, menya ko igishushanyo gikoresha ubwoko: 'imvugo' kuri subtotal, umusoro, hamwe. Imvugo irasomwa gusa kandi ikoreshwa cyane cyane kwerekana indangagaciro zabazwe. SurveyJS nayo ishyigikira ubwoko: 'html' kubintu bihamye, ariko kubiciro byabazwe, imvugo niyo guhitamo neza. Noneho kuruhande rwa reaction. Gutanga no Kwiyegurira Biroroshye cyane. Umugozi onKuzuza API yawe muburyo bumwe - ukoresheje gukoresha Guhindura cyangwa kuzana ibintu bisanzwe:
gutumiza {gukoreshaState, gukoreshaEffect, gukoreshaRef} kuva "reaction"; gutumiza {gukoreshaMutation} kuva "@ tanstack / react-query"; gutumiza {Model} kuva "ubushakashatsi-bwibanze"; gutumiza {Ubushakashatsi} kuva "ubushakashatsi-reaction-ui";
ibikorwa byo kohereza hanze Ubushakashatsi () {const [icyitegererezo] = gukoreshaState (() => Model nshya (ubushakashatsiSchema));
ihinduka rya mutation = gukoreshaMutation ({ mutationFn: async (data) => { const res = gutegereza kuzana ("/ api / amabwiriza", { buryo: "POST", imitwe: {"Ibirimo-Ubwoko": "gusaba / json"}, umubiri: JSON.hindura (amakuru), }); niba (! res.ok) guta Ikosa rishya ("Kunanirwa gutanga"); garuka res.json (); }, });
const mutationRef = gukoreshaRef (mutation); mutationRef.current = ihinduka; Koresha Ingaruka (() => {const handler = (wohereje) => mutationRef.current.mutate (wohereje.data); moderi.onComplete.add (umukoresha); garuka () => icyitegererezo.kuzuza.kuraho (umukoresha);}, [icyitegererezo]); // kwanga kwirinda kongera kwiyandikisha kubakoresha buri kintu (ihinduka ryimiterere yibintu)
garuka (
<>
Reba Ikaramu IkaramuJS-03-UbushakashatsiJS [forked] na mirongo itandatu.
kuri Fire yuzuye iyo uyikoresha ageze kumpera yanyuma ya page. Niba rero igiteranyo kitigeze kirenga 100 kandi urupapuro rwo gusubiramo rwasimbuwe, iracyarasa neza kuko SurveyJS isuzuma ibiboneka mbere yo guhitamo icyo "page yanyuma" bivuze. Noneho, ohereza.data ikubiyemo ibisubizo byose hamwe nagaciro kabaruwe (subtotal, umusoro, igiteranyo) nkumurima wo mucyiciro cya mbere, bityo umutwaro wa API urasa nicyo verisiyo ya RHF yakusanyije intoki muriSubmit. UwitekamutationIcyitegererezo kimwe nimwe wagera ahantu hose ukeneye ibyabaye bihamye kugirango uhindure agaciro gahinduka kuri buri kintu - ntakintu na kimwe SurveyJS yihariye kubyerekeye.
Igice cya React ntikirimo logique yubucuruzi na gato. Nta gukoreshaWatch, nta JSX isabwa, nta compte yintambwe, nta gukoreshaMemo urunigi, nta superRefine. Igisubizo ni ugukora mubyukuri nibyiza: gutanga ibice no kubishaka kumuhamagaro wa API. Ni iki cyakuwe mu bikorwa?
Impungenge RHF Ikibaho UbushakashatsiJS Kugaragara Amashami ya JSX kugaragaraIf Indangagaciro Koresha Reba / KoreshaMemo imvugo Amategeko yambukiranya imipaka superRefine Imiterere yimiterere Kugenda Intambwe Urupapuro rugaragaraIf Ahantu hateganijwe Ikwirakwizwa muri dosiye Hagati muri gahunda
Ikiguma muri Reaction ni imiterere, stil, insinga zoherejwe, hamwe no guhuza porogaramu, nukuvuga, ibintu React yabigenewe mubyukuri. Ibindi byose byimukiye mubishushanyo, kandi kubera ko igishushanyo ari ikintu cya JSON gusa, kirashobora kubikwa muri base de base, kigahinduka cyigenga kode yawe yo gusaba, cyangwa igahinduka binyuze mubikoresho byimbere bidasabye koherezwa. Umuyobozi wibicuruzwa ukeneye guhindura urwego rutera urupapuro rwisubiramo arashobora kubikora adakoze ku bice. Iri ni itandukaniro rinini ryimikorere kumakipe aho imyitwarire yimikorere ihinduka kenshi kandi ntabwo ihora itwarwa naba injeniyeri. Ni ryari Gukoresha Buri buryo? Dore amategeko meza yintoki ankorera: tekereza gusiba burundu. Niki wabura?
Niba ari ecran, urashaka imiterere-yimikorere. Niba ari logique yubucuruzi, nkibipimo, amategeko yishami, nibisabwa bisabwa bikubiyemo ibyemezo bifatika, ushaka moteri yimigambi.
Muri ubwo buryo, niba impinduka ziza munzira zawe ahanini zerekeye ibirango, imirima, n'imiterere, RHF izagufasha neza. Niba ari ibijyanye nibisabwa, ibisubizo, hamwe namategeko ops yawe cyangwa itsinda ryanyu ryemewe n'amategeko rishobora gukenera guhinduka kumunsi wo kuwa kabiri nyuma ya saa sita utatanze itike, icyitegererezo cyateguwe na SurveyJS nicyo gikwiye kurushaho. Ubu buryo bubiri ntabwo burushanwa rwose. Bakemura ibyiciro bitandukanye byibibazo, kandi ikosa rikwiye kwirinda ni uguhuza abstraction nuburemere bwa logique - gufata sisitemu yubutegetsi nkigice kuko aricyo gikoresho kimenyerewe, cyangwa kugera kuri moteri ya politiki kuko ifishi yakuze igera kuntambwe eshatu kandi ikabona umurima uteganijwe. Ifishi twubatse hano yicaye hafi yumupaka nkana, igoye bihagije kugirango igaragaze itandukaniro ariko ntabwo ikabije kuburyo kugereranya wumva ko ari uburiganya. Impapuro nyazo zose zagiye zidakuka muri codebase yawe birashoboka ko yicaye hafi yurwo rubibi, kandi ikibazo mubisanzwe nukumenya niba hari umuntu wavuze amazina mubyukuri. Koresha Ifishi Ifatika + Zod iyo:
Ifishi ireba CRUD; Ubwenge ni buke kandi buyobowe na UI; Ba injeniyeri bafite imyitwarire yose; Inyuma ikomeza kuba isoko yukuri.
Koresha UbushakashatsiJS iyo:
Ifishi ikubiyemo ibyemezo byubucuruzi; Amategeko agenda atandukana na UI; Logic igomba kugaragara, kugenzurwa, cyangwa guhindurwa; Abatari injeniyeri bigira ingaruka kumyitwarire; Ifishi imwe igomba kunyura mubice byinshi.