Bu makala SurveyJS tarapyndan hemaýatkärlik edilýär React işläp düzüjileriň köpüsiniň hiç wagt sesini çykarman paýlaşýan akyl nusgasy bar. Bu görnüşler elmydama komponentler bolmalydyr. Munuň ýaly stakany aňladýar:
Stateerli ştat üçin çeňňek formasyny reaksiýa ediň (minimal täzeden görkezişler, ergonomiki meýdan belligi, hökmany täsir). Barlamak üçin kod (giriş dogrylygy, araçäk tassyklamasy, görnüşli howpsuz derňew). Yzky sorag üçin reaksiýa: tabşyrmak, gaýtadan synanyşmak, keş keşdesi, serweri sinhronlamak we ş.m.
Formalaryň köpüsi üçin - giriş ekranlaryňyz, sazlama sahypalaryňyz, CRUD modallaryňyz üçin bu hakykatdanam gowy işleýär. Her bir eser öz işini ýerine ýetirýär, arassa düzýär we programmaňyzyň önümiňizi hakykatdanam tapawutlandyrýan böleklerine geçip bilersiňiz. Everyöne wagtal-wagtal bir görnüş, öňki jogaplara bagly bolan görünmek düzgünleri ýa-da üç ugurdan geçýän gymmatlyklar ýaly zatlary toplap başlaýar. Belki-de, tutuşlygyna geçip gitmeli ýa-da görkezilmeli sahypalaryň hemmesi. Ilkinji şertli ulanyşWatch we içerki şahasy bilen işleýärsiňiz, bu gowy. Soň başga. Soňra Zod shemaňyzyň adaty görnüşde beýan edip bilmejek meýdan düzgünlerini kodlamak üçin superRefine ýetýärsiňiz. Soň bolsa, ädim nawigasiýasy biznes logikasyny syzdyryp başlaýar. Belli bir wagt, guran zatlaryňyza seredip, formanyň indi UI däldigine göz ýetirersiňiz. Bu has köp karar bermek prosesi we komponent agajy ony saklamak üçin edil şol ýerde. Ine, meniň pikirimçe, React görnüşleriniň akyl nusgasy bozulýar we hakykatdanam hiç kimiň ýalňyşlygy ýok. RHF + Zod stakasy, dizaýn üçin ajaýyp. Mesele, abstraktlaryň meselä gabat gelýän ýerinden geçmäge ýykgyn edýäris, sebäbi alternatiw formalar barada başgaça pikirlenmegi talap edýär. Bu makala şol alternatiwa barada. Muny görkezmek üçin takyk iki basgançakly görnüşi iki gezek gurarys:
React Hook Form + Zod bilen, React Query-a tabşyrmak üçin simli, Forma maglumat hökmünde seredýän SurveyJS bilen, komponent agajy däl-de, ýönekeý JSON shemasy.
Birmeňzeş talaplar, şol bir şertli logika, ahyrynda şol bir API jaňy. Soňra nämäniň göçendigini we nämäniň galandygyny anyk kesgitläris we haýsy modeli ulanmalydygyňyzy we haçan ulanmalydygyňyzy kesgitlemegiň amaly usulyny kesgitläris. Gurýan görnüşimiz:
Bu görnüş 4 basgançakly akymy ulanar: 1-nji ädim: Jikme-jiklikler
Ady (hökmany), E-poçta (zerur, dogry format).
2-nji ädim: Sargyt
Bölümiň bahasy, Mukdar, Salgyt stawkasy, Alnan: Subtotal, Salgyt, Jemi.
3-nji ädim: Hasap we seslenme
Hasabyňyz barmy? (Hawa /) ok) Hawa → ulanyjy ady + paroly bolsa, ikisi hem zerur. Eger No → e-poçta eýýäm 1-nji ädimde toplanan bolsa.
Kanagatlanma derejesi (1–5) ≥ 4 → “Näme haladyňyz?” Diýip soraň. ≤ 2 → “Näme gowulaşdyryp bileris?” Diýip sorasa.
4-nji ädim: Syn
Diňe jemi> = 100 bolsa peýda bolýar Jemleýji tabşyryk.
Bu aşa däl. Emma binagärlik tapawudyny paş etmek ýeterlikdir. 1-nji bölüm: Komponent bilen dolandyrylýar (React Hook Form + Zod) Gurnama npm react-hook-form zod @ hookform / çözüjiler @ tanstack / react-query guruň
Zod shemasy Zod shemasyndan başlalyň, sebäbi adatça forma görnüşi kesgitlenýär. Ilkinji iki ädim üçin - şahsy jikme-jiklikler we sargyt girişleri - hemme zat gönümel: zerur setirler, minimal sanlar we san. Gyzykly bölüm, şertli düzgünleri aýtjak bolanyňyzda başlaýar.
"zod" -dan {z import;
eksport const formSchema = z.object ({firstName: z.string (). min (1, "Gerekli"), e-poçta: z.string (). e-poçta ("Nädogry e-poçta"), bahasy: z.number () min. z.string (). islege bagly (), parol: z.string (). islege bagly (), kanagatlanma: z.number () min. (! data.username) {ctx.addIssue ({kody: "adaty", ýol: ["ulanyjy ady"], habar: "Gerekli"});
eger (data.satisfaction> = 4 &&! data.positiveFeedback) {ctx.addIssue ({kody: "adaty", ýol: ["positiveFeedback"], habar: "Halaýan zadyňyzy paýlaşmagyňyzy haýyş edýäris"}); }
eger (data.satisfaction <= 2 &&! data.improvementFeedback) {ctx.addIssue ({kody: "adaty", ýol:["improvementFeedback"], habar: "Näme gowulaşdyrmalydygyny aýdyň"}); }});
eksport görnüşi FormData = z.infer
Ulanyjy adynyň we parolynyň şertli talap edilýändigine garamazdan islege bagly () görnüşinde ýazylýandygyna üns beriň, sebäbi Zodyň görnüşli shemasy meýdanlar möhüm bolanda düzgünleri däl-de, obýektiň görnüşini suratlandyrýar. Şertli talap, görnüşi tassyklanandan soň işleýän we doly obýekte girip bilýän superRefine-de ýaşamaly. Bu aýralyk kemçilik däl; gural üçin niýetlenen zat: superRefine, shema gurluşynyň özünde beýan edip bolmaýan mahaly meýdan logikasynyň gidýän ýeri. Bu ýerde bellemeli zat, bu shemanyň aňlatmaýan zady. Sahypalar düşünjesi, haýsy meýdanlarda haýsy nokatda görünýändigi we nawigasiýa düşünjesi ýok. Bularyň hemmesi başga bir ýerde ýaşar. Form komponenti
import "useForm, useWatch" "react-hook-form" -dan; "@ hookform / resolvers / zod" -dan import {zodResolver import; import
const STEPS = ["jikme-jiklikler", "sargyt", "hasap", "gözden geçirmek"];
OrderPayload = FormData & {jemi: san; salgyt: san; jemi: san};
eksport funksiýasy RHFMultiStepForm () {const [ädim, setStep] = useState (0);
const mutasiýa = useMutation ({ mutationFn: async (ýük göteriji: OrderPayload) => { const res = almaga garaşyň ("/ api / sargytlar", { usuly: "POST", sözbaşylar: {"Mazmun görnüşi": "programma / json"}, bedeni: JSON.stringify (ýük göteriji), }); eger (! res.ok) täze roralňyşlyk taşlasa ("Iberilmedi"); res.json (); }, });
const {hasaba almak, gözegçilik etmek, dolandyrmakSubmit, formState: {ýalňyşlar},} = useForm
yzyna gaýdyp geliň
{ädim === 1 && (<>
{ädim === 2 && (<>
{hasAccount === "Hawa" && (<>
{kanagatlanma> = 4 && ()}
{kanagatlanma <= 2 && ()} >)}
{ädim === 3 && jemi> = 100 &&
Galam gözlegine serediň JS-03-RHF [kesilen] Bu ýerde gaty köp zat bolup geçýär we zatlaryň nirede gutarandygyny duýmak üçin haýal etmeli.
Alnan bahalar - jemi, salgyt, jemi - ulanmakWatch we useMemo arkaly komponentde hasaplanýar, sebäbi janly meýdan bahalaryna bagly we olar üçin başga tebigy ýer ýok. Ulanyjy ady, parol, pozitiwFeedback we gowulaşmaFeedback üçin görüniş düzgünleri JSX-da içerki şertler hökmünde ýaşaýar. Basgançakly logika - gözden geçiriş sahypasy diňe jemi> = 100 - showSubmit üýtgeýjisine we 3-nji ädimdäki görkeziş ýagdaýyna girizilende peýda bolýar. Nawigasiýanyň özi, diňe el bilen artdyrýan useState hasaplaýjymyz. React Query gaýtadan synanyşmak, keş keşdesi we nädogry hereketleri amala aşyrýar. Forma diňe tassyklanan maglumatlar bilen mutation.mutate diýýär.
Bularyň hiç biri-de ýalňyş däl. Bu henizem samsyk reaksiýa we RHF-iň täzeden görkezişlerini izolýasiýa etmegi sebäpli komponent gaty ýerine ýetiriji. Thisöne muny ýazmadyk birine tabşyryp, gözden geçiriş sahypasynyň haýsy şertlerde peýda bolýandygyny düşündirmegini haýyş etseňiz, bir setirde beýan edilip bilinjek düzgüni täzeden gurmak üçin showSubmit, 3-nji ädim şerti we deňiz düwmesiniň logikasy - üç aýry ýer arkaly yzarlamaly bolarlar. Forma işleýär, hawa, ýöne özüni alyp barş ulgam hökmünde hakykatdanam barlap bolmaýar. Akyl taýdan ýerine ýetirilmeli. Has möhümi, ony üýtgetmek in engineeringenerçilik gatnaşygyny talap edýär. Hatda gözden geçiriş ädimi görkezilende sazlamak ýaly kiçijik bir düzediş hem komponenti redaktirlemegi, tassyklamany täzelemegi, çekiş haýyşyny açmagy, gözden geçirmäge garaşmagy we gaýtadan ýerleşdirmegi aňladýar. 2-nji bölüm: Shema bilen dolandyrylýar (SurveyJS) Indi shema ulanyp, şol bir akymy guralyň. Gurnama npm gözleg-ýadro gözleg-react-ui @ tanstack / react-query guruň
Anket-ýadroMIT-ygtyýarly platforma garaşsyz iş wagty hereketlendirijisi, SurveyJS-iň görnüşini görkezmäge kuwwat berýär - bu ýerde biziň gyzyklanýan bölümimiz. JSON shemasyny alýar, ondan içerki model döredýär we “React” komponentinde başgaça ýaşap boljak ähli zatlary dolandyrýar: görünýän aňlatmalara baha bermek, alnan bahalary hasaplamak, sahypanyň ýagdaýyny dolandyrmak, tassyklamany yzarlamak we haýsy sahypalaryň hakykatdanam görkezilendigini “doly” manysyny kesgitlemek.
anket-react-ui Şol modeli React bilen birleşdirýän UI / görkeziş gatlagy. Aslynda, motoryň ýagdaýy üýtgän mahaly täzeden görkezýän
Bilelikde, gözegçilik akymynyň ýekeje setirini ýazman, doly işleýän, köp sahypalyk iş wagtyny berýär. Shema formatynyň özi, öň aýdylyşy ýaly, diňe JSON - DSL ýa-da eýeçilikli zat ýok. Ony çyzyp, faýldan import edip, API-den alyp ýa-da maglumat bazasynyň sütüninde saklap we iş wagtynda gidrat edip bilersiňiz. Maglumatlar ýaly birmeňzeş görnüş Ine, şol bir görnüş, bu gezek JSON obýekti hökmünde aňladyldy. Shema hemme zady kesgitleýär: gurluşy, tassyklamasy, görünmek düzgünleri, alnan hasaplamalar, sahypa nawigasiýasy - we iş wagtynda baha berýän Modeliň eline berýär. Ine, doly görnüşi:
eksport const anketasySchema = {title: "Sargyt akymy", showPresentBar: "ýokarky", sahypalar: [{name: "jikme-jiklikler", elementler: {name: "order", elementler:ady: "taxRate", defaultValue: 0.1, saýlawlar: "aňlatma", ady: "jemi", aňlatma: "{subtotal} + {salgyt}"}]}, {name: "hasaby", elementler: [{görnüşi: "radiogroup", ady: "hasAccount", saýlawlar: "parol", giriş görnüşi: "parol", görünýänIf: "{hasAccount} = 'Hawa'", talap edilýär: dogry, tassyklaýjylar: > = 4 "}, {görnüşi:" teswir ", ady:" gowulaşdyrmakFedback ", görünýänIf:" {kanagatlanma} <= 2 "}]}, {ady:" syn ", görünýänIf:" {jemi}> = 100 ", elementler: []}]};
Muny RHF wersiýasy bilen bir salym deňeşdiriň.
Ulanyjy adyny we parolyny şertli talap edýän superRefine bloky ýok boldy. görünýänIf: "{hasAccount} = 'Hawa'" isRequired bilen utgaşdyrylýar: hakyky iki aladany bilelikde tapýar, nirede tapjakdygyňyza. Jemi, salgyt we jemi hasaplaýan “UseWatch + useMemo” zynjyry biri-birine adyny görkezýän üç aňlatma meýdançasy bilen çalşyrylýar. Gözden geçiriş sahypasynyň ýagdaýy, RHF wersiýasynda diňe 3-nji ädim görkeziş şahasy bolan ShowSubmit-den gözlemek arkaly täzeden gurlup bilner. Iň soňunda bolsa, nav düwmesiniň logikasy sahypanyň obýektindäki ýekeje görünýän bolsa.
Şol bir logika bar. Diňe shema, komponente ýaýramazdan, izolýasiýa görünýän ýerinde ýaşamaga ýer berýär. Şeýle hem, shemanyň jemi, salgyt we jemi üçin “aňlatma” görnüşini ulanýandygyna üns beriň. Düşündiriş diňe okalýar we esasan hasaplanan bahalary görkezmek üçin ulanylýar. SurveyJS, şeýle hem: statiki mazmun üçin 'html' görnüşini goldaýar, ýöne hasaplanan bahalar üçin aňlatma dogry saýlawdyr. Indi React tarapy üçin. Bermek we tabşyrmak Örän ýönekeý. “API” -e edil şonuň ýaly - “UseMutation” ýa-da ýönekeý getiriş arkaly:
import etmek
eksport funksiýasy SurveyForm () {const [model] = useState (() => täze Model (surveySchema));
const mutasiýa = useMutation ({ mutationFn: async (maglumatlar) => { const res = almaga garaşyň ("/ api / sargytlar", { usuly: "POST", sözbaşylar: {"Mazmun görnüşi": "programma / json"}, beden: JSON.stringify (maglumatlar), }); eger (! res.ok) täze roralňyşlyk taşlasa ("Iberilmedi"); res.json (); }, });
const mutationRef = useRef (mutasiýa); mutationRef.current = mutasiýa; useEffect (() => {const işleýji = (iberiji) => mutationRef.current.mutate (iberiji.data); model.onComplete.add (işleýji); gaýdyp () => model.onComplete.remove (işleýji);}, [model]); // ref her görkeziji işleýjini gaýtadan hasaba almakdan saklanýar (mutasiýa obýektiniň şahsyýeti üýtgeýär)
gaýdyp gel (
<>
Galam SurveyJS-03-SurveyJS-a serediň.
Ulanyjy iň soňky görünýän sahypanyň soňuna ýetende doly ýanýar. Şeýlelik bilen jemi 100-den geçmese we gözden geçiriş sahypasy geçmese, henizem dogry işleýär, sebäbi SurveyJS “soňky sahypanyň” nämäni aňladýandygyny kesgitlemezden ozal görnüklilige baha berýär. Soňra, sender.data birinji derejeli meýdanlar hökmünde hasaplanan bahalar (jemi, salgyt, jemi) bilen birlikde ähli jogaplary öz içine alýar, şonuň üçin API ýük göterijisi RHF wersiýasynyňSubmit-de el bilen ýygnan zady bilen birmeňzeşdir. ThemutasiýaRef nagşy, her öwrülişikde üýtgeýän bir bahadan durnukly hadysa işleýjisine mätäç bolan ýeriňize baryp ýetýän görnüşiňizdir - bu barada SurveyJS-a mahsus zat ýok.
React komponentinde indi hiç hili iş logikasy ýok. UlanyjyWatch ýok, şertli JSX ýok, ädim hasaplaýjy ýok, useMemo zynjyry ýok, superRefine ýok. React, aslynda gowy zady edýär: bir komponent hödürlemek we ony API çagyryşyna geçirmek. Reaktdan näme göçürildi?
Alada RHF Stack AnketJS Görünmek JSX şahalary Görünýän bolsa Alnan bahalar useWatch / useMemo aňlatma Meýdanyň düzgünleri superRefine Shema şertleri Nawigasiýa ädim ýagdaýy Sahypa görünýär Locationerleşýän ýeri Faýllara paýlanýar Shemada merkezleşdirilen
“React” -da galan zat düzüliş, stil düzmek, tabşyrmak simleri we programma integrasiýasy, ýagny “React” -iň aslynda döredilen zatlary. Galan hemme zat shema geçdi we shema diňe JSON obýekti bolany üçin, maglumatlar bazasynda saklanyp bilner, programma koduňyza garaşsyz wersiýa edilip ýa-da ýerleşdirilmegini talap etmezden içerki gurallar arkaly redaktirläp bolýar. Syn sahypasyny açýan bosagany üýtgetmeli önüm dolandyryjysy, komponente degmezden edip biler. Formanyň özüni alyp barşynyň ýygy-ýygydan ösýän we hemişe inersenerler tarapyndan dolandyrylmaýan toparlary üçin manyly iş tapawudy. Her çemeleşmäni haçan ulanmaly? Ine, meniň üçin işleýän gowy düzgün: formany düýbünden pozmagy göz öňüne getiriň. Näme ýitirerdiň?
Ekranlary bolsa, komponentlere esaslanýan görnüşleri isleýärsiňiz. Bosgunlar, şahalandyryş düzgünleri we hakyky kararlary kodlaýan şertli talaplar ýaly iş logikasy bolsa, shema motoryny isleýärsiňiz.
Şonuň ýaly-da, gelýän üýtgeşmeler esasan bellikler, meýdanlar we ýerleşiş bilen baglanyşykly bolsa, RHF size gowy hyzmat eder. Sişenbe ýa-da kanuny toparyňyzyň sişenbe güni öýlän bilet tabşyrmazdan düzetmeli şertleri, netijeleri we düzgünleri barada bolsa, SurveyJS bilen shema modeli has dogruçyl. Bu iki çemeleşme hakykatdanam biri-biri bilen bäsdeşlik etmeýär. Meseleleriň dürli synplaryny çözýärler we öňüni almaly ýalňyşlyk abstraksiýany logikanyň agramyna laýyk getirmezlik - düzgün ulgamyna komponent ýaly garamak, sebäbi bu tanyş gural, ýa-da bir forma üç basgançaga çenli ösüp, şertli bir meýdan gazanylandygy üçin syýasat ulgamyna ýetmek. Bu ýerde guran görnüşimiz, tapawudy paş etmek üçin bilkastlaýyn, çylşyrymly serhet ýakasynda ýerleşýär, ýöne deňeşdirme gaty galýar. Kod koduňyza girmedik hakyky görnüşleriň köpüsi, şol serhediň golaýynda oturandyr we sorag, adatça, kimdir biriniň adyny tutdumy ýa-da ýokmy diýen sorag. Haçan-da React Hook Form + Zod ulanyň:
Formalar CRUD-a gönükdirilen; Logika çuňňur we UI bilen dolandyrylýar; Inersenerleriň ähli gylyk-häsiýetleri bar; Arka tarap hakykatyň çeşmesi bolmagynda galýar.
Haçan-da SurveyJS ulanyň:
Formalar işewürlik kararlaryny kodlaýar; Düzgünler UI-den garaşsyz ösýär; Logika görünmeli, eşidilmeli ýa-da wersiýaly bolmaly; In engineener däller özüni alyp barşyna täsir edýär; Şol bir görnüş birnäçe frontdan geçmeli.