SurveyJS ne ke daukar nauyin wannan labarin Akwai ƙirar tunani mafi yawan masu haɓaka React suna rabawa ba tare da sun taɓa yin magana da babbar murya ba. Waɗancan siffofin koyaushe yakamata su kasance abubuwan haɗin gwiwa. Wannan yana nufin tari kamar:
Fom ɗin ƙugiya React don ƙaramar jihar (mafi ƙarancin sake fasalin, rajistar filin ergonomic, hulɗar mahimmanci). Zod don ingantawa (daidaitaccen shigarwar, ingantacciyar iyaka, nau'in-lafiya ta tantancewa). Amsa Tambaya don baya: ƙaddamarwa, sake gwadawa, caching, daidaitawar uwar garke, da sauransu.
Kuma ga mafi yawan nau'ikan nau'ikan - allon shiga ku, shafukan saitunanku, tsarin CRUD ɗinku - wannan yana aiki sosai. Kowane yanki yana yin aikinsa, suna tsarawa cikin tsafta, kuma zaku iya matsawa zuwa sassan aikace-aikacenku waɗanda ke bambanta samfuran ku. Amma kowane lokaci a cikin wani lokaci, wani nau'i yana fara tara abubuwa kamar ƙa'idodin ganuwa waɗanda suka dogara da amsoshi na farko, ko ƙimar da aka samo waɗanda suka ɓace ta hanyoyi uku. Wataƙila ma duka shafukan da ya kamata a tsallake su ko a nuna su bisa jimlar gudana. Kuna sarrafa yanayin farko tare da amfaniWatch da reshen layi, wanda yayi kyau. Sai wani. Sannan kuna isa ga SuperRefine don ɓoye ƙa'idodin filin da tsarin Zod ɗin ku ba zai iya bayyanawa ta al'ada ba. Sa'an nan, kewayawa mataki yana fara yoyo dabaru na kasuwanci. A wani lokaci, kuna kallon abin da kuka gina kuma ku gane cewa fom ɗin ba ainihin UI bane kuma. Yana da ƙarin tsarin yanke shawara, kuma itacen bangaren shine kawai inda kuka faru don adana shi. Wannan shine inda nake tsammanin ƙirar tunani don siffofi a cikin React ya rushe, kuma hakika ba laifin kowa bane. Tarin RHF + Zod yana da kyau ga abin da aka tsara shi don shi. Matsalar ita ce mukan ci gaba da yin amfani da shi bayan lokacin da abubuwan da ke tattare da shi ya dace da matsalar saboda madadin yana buƙatar wata hanya ta daban ta tunani game da siffofi gaba ɗaya. Wannan labarin game da wancan madadin. Don nuna wannan, za mu gina ainihin tsari iri ɗaya sau biyu:
Tare da React Hook Form + Zod wanda aka haɗa don amsa tambaya don ƙaddamarwa, Tare da SurveyJS, wanda ke ɗaukar nau'i azaman bayanai - tsari mai sauƙi na JSON - maimakon bishiyar sassa.
Bukatu iri ɗaya, dabaru na sharadi iri ɗaya, kiran API iri ɗaya a ƙarshen. Sa'an nan za mu yi taswirar ainihin abin da ya motsa da abin da ya zauna, da kuma tsara hanya mai amfani don yanke shawarar wane samfurin ya kamata ku yi amfani da shi, da kuma lokacin. Sigar da muke ginawa:
Wannan fom zai yi amfani da kwararar matakai 4: Mataki 1: Cikakkun bayanai
Sunan farko (da ake buƙata), Imel (da ake buƙata, ingantaccen tsari).
Mataki 2: Oda
Farashin naúrar, Yawan, Yawan haraji, An samo: Ƙarfafawa, Haraji, Jimlar.
Mataki 3: Account & Feedback
Kuna da asusun ajiya? (Ee/A'a) Idan Ee → sunan mai amfani + kalmar sirri, duka ana buƙata. Idan A'a → an riga an tattara imel a mataki na 1.
Ƙimar gamsuwa (1-5) Idan ≥ 4 → tambayi "Me kuke so?" Idan ≤ 2 → tambayi "Me za mu iya inganta?"
Mataki na 4: Bita
Yana bayyana kawai idan duka>= 100 Ƙarshe ƙaddamarwa.
Wannan ba matsananci ba ne. Amma ya isa ya nuna bambance-bambancen gine-gine. Sashe na 1: Abubuwan da ake Kokawa (Form React Hook + Zod) Shigarwa npm shigar react-hook-form zod @hookform/resolvers @tanstack/react-query
Zod Schema Bari mu fara da tsarin Zod, saboda yawanci shine inda aka kafa siffar siffar. Don matakai biyu na farko - cikakkun bayanai na sirri da shigarwar oda - komai mai sauki ne: kirtani da ake buƙata, lambobi tare da mafi ƙarancin ƙima, da adadi. Bangaren ban sha'awa yana farawa lokacin da kuke ƙoƙarin bayyana ƙa'idodin sharadi.
shigo da {z} daga "zod";
fitarwa const formSchema = z.abun ({Na farko Suna: z.string() .min(1, "Ake Bukatar"), email: z.string().email("Imel mara inganci"), farashin: z.number().min(0), yawa: z.number().min(1), haraji: z.number(), yana daAccount: z.enum(["]), lambar lambar ([") string ctx.addIssue ({ code: "custom", hanya: ["sunan mai amfani"], saƙo: "An buƙata"});
idan (data.satisfaction>= 4 && !data.positiveFeedback) {ctx.addIssue ({ code: "custom", hanya: ["positiveFeedback"], saƙo: "Da fatan za a raba abin da kuke so"}); }
idan (data.satisfaction <= 2 && !data.improvementFeedback) {ctx.addIssue({ code: "custom", hanya:["improvementFeedback"], saƙo: "Don Allah gaya mana abin da za mu inganta"}); }});
nau'in fitarwa na FormData = z.infer
Lura cewa ana buga sunan mai amfani da kalmar wucewa azaman zaɓi () ko da yake ana buƙatar su bisa sharadi saboda tsarin nau'in nau'in nau'in Zod yana bayyana sifar abun, ba ƙa'idodin da ke tafiyar da filaye ba. Abubuwan da ake bukata dole ne su zauna a cikin superRefine, wanda ke gudana bayan an tabbatar da siffar kuma yana da damar yin amfani da cikakken abu. Wannan rabuwa ba aibi ba ne; kawai abin da aka tsara kayan aikin don: superRefine shine inda ma'anar giciye ke tafiya lokacin da ba za a iya bayyana shi a cikin tsarin tsarin kanta ba. Abin da kuma abin lura a nan shi ne abin da wannan tsari bai bayyana ba. Ba shi da ra'ayi na shafuka, ba shi da ra'ayi na waɗanne fage ne ake iya gani a wane lokaci, kuma ba shi da ra'ayi na kewayawa. Duk waɗannan za su zauna a wani wuri dabam. Samfurin Samfura
shigo da {useForm, useWatch} daga "react-hook-form"; shigo da {zodResolver} daga "@hookform/resolvers/zod";import {useMutation } daga "@tanstack/react-query";shigo {useState, amfaniMemo } daga "react"/shigo da "Nau'in FormSchetama,}
const STEPS = ["bayanai", "oda", "asusu", "bita"];
nau'in OrderPayload = FormData & {ƙaddara: lamba; haraji: lamba; jimla: lamba};
aikin fitarwa RHFMultiStepForm () {const [mataki, setStep] = amfaniState (0);
maye gurbi = amfani da Mutation ({ mutationFn: async (nauyin kaya: OrderPayload) => { const res = jira a samo ("/api/orders", { hanya: "POST", buga kai: {"Nau'in Abun ciki": "application/json"}, jiki: JSON.stringify (nauyin kaya), }); idan (!res.ok) jefa sabon Kuskure ("Ba a kasa ƙaddamarwa"); dawo res.json (); }, });
const {rejista, sarrafawa, handleSubmit, formState: {kurakurai},} = useForm
mayar (
);}Duba Binciken AlƙalamiJS-03-RHF [mai yatsa] ta hanyar ɓarna. Akwai abubuwa da yawa da ke faruwa a nan, kuma yana da kyau a rage gudu don lura da inda abubuwa suka ƙare.
Ƙimar da aka samo - ƙananan jimla, haraji, jimlar - ana lissafta su a cikin ɓangaren ta hanyar amfani da Watch da kuma amfani da Memo saboda sun dogara da ƙimar filin rayuwa kuma babu wani wuri na halitta a gare su. Dokokin ganuwa don sunan mai amfani, kalmar sirri, tabbataccen amsawa, da haɓakawaTaimako suna rayuwa a cikin JSX azaman sharuɗɗan layi. Ma'anar tsallake-tsallake mataki - shafin bita yana bayyana kawai lokacin da jimillar> = 100 - an saka shi cikin madaidaicin nunin Submit da yanayin bayarwa akan mataki na 3. Kewayawa kanta ma'aunin amfani ne kawai na jihar wanda muke haɓakawa da hannu. Amsa Tambaya tana ɗaukar sakewa, caching, da rashin aiki. Fom ɗin kawai yana kiran maye gurbi.mutate tare da ingantattun bayanai.
Babu ɗayan waɗannan da ba daidai ba, kowane ɗaya. Wannan har yanzu amsawa ce mai ma'ana, kuma sashin yana aiki sosai godiya ga yadda RHF ke ware masu sake-sakewa. Amma idan za ku mika wannan ga wanda bai rubuta shi ba kuma ku tambaye su ya bayyana a ƙarƙashin yanayin da shafin bita ya bayyana, za su bi ta hanyar showSubmit, mataki na 3 da ke ba da yanayin, da maballin maɓallin kewayawa - wurare guda uku - don sake gina wata doka da za a iya bayyana a layi ɗaya. Samfurin yana aiki, a, amma halin da ake ciki ba shi da tabbas a matsayin tsarin. Dole ne a kashe shi a hankali. Mafi mahimmanci, canza shi yana buƙatar shigar injiniya. Ko da ƙaramin tweak, kamar daidaitawa lokacin da matakin bita ya bayyana, yana nufin gyara ɓangaren, sabunta ingantaccen aiki, buɗe buƙatar ja, jiran bita, da turawa kuma. Kashi na 2: Tsare-Tsare-Tsarki (SurveyJS) Yanzu bari mu gina guda guda ta amfani da tsari. Shigarwa npm shigar da binciken-core binciken-react-ui @tanstack/react-query
binciken-coreInjin aikin lokaci mai zaman kansa na dandamali mai lasisi na MIT wanda ke ba da ikon yin fasalin SurveyJS - ɓangaren da muke kula da shi anan. Yana ɗaukar tsarin JSON, yana gina ƙirar ciki daga gare ta, kuma yana sarrafa duk abin da zai rayu a cikin sashin React ɗinku: kimanta maganganun gani, ƙididdige ƙididdiga da aka samo, sarrafa yanayin shafi, tabbatar da bin diddigin, da yanke shawarar abin da “cikakke” ke nufi da aka ba waɗanne shafukan da aka nuna a zahiri.
Survey-react-uiThe UI / rendering Layer wanda ya haɗa wannan ƙirar zuwa React. Yana da ainihin ɓangaren
Tare, suna ba ku cikakken aiki, lokaci na tsari mai shafuka da yawa ba tare da rubuta layin sarrafawa guda ɗaya ba. Tsarin tsari da kansa shine, kamar yadda aka fada a baya, JSON ne kawai - babu DSL ko wani abu na mallaka. Kuna iya haɗa shi, shigo da shi daga fayil, ɗauko shi daga API, ko adana shi a cikin ginshiƙi na bayanai kuma sanya ruwa a lokacin aiki. Form iri ɗaya, Kamar Data Anan nau'i iri ɗaya ne, wannan lokacin an bayyana shi azaman abun JSON. Tsarin yana bayyana komai: tsari, tabbatarwa, ƙa'idodin ganuwa, ƙididdigewa da aka samo, kewayawa shafi - kuma mika shi ga Samfurin da ke kimanta shi a lokacin aiki. Ga yadda abin yake a cikakke:
fitarwa const surveySchema = { take: "Order Flow", showProgressBar: "saman", shafuka: [ {suna: "cikakkun bayanai", abubuwa: [ {nau'in: "rubutu", suna: "Na farko", isRequired: gaskiya }, {nau'in: "rubutu", suna: "email", shigarwaType: "email", ana buƙatar: "nau'in imel: masu inganci: [{} imel ]}, {suna: "oda", abubuwa: [ {nau'in: "rubutu", suna: "farashi", shigarwaType: "lamba", tsohoValue: 0 }, {nau'in: "rubutu", suna: "yawan", shigarwaType: "lambar", tsohoValue: 1 }, {nau'in: "zazzagewa",suna: "TaxRate" "bayani", suna: "haraji", magana: "{subtotal} {taxRate}"}, {nau'in: "bayani", suna: " jimla ", magana: "{subtotal} + {haraji}" } ] }, {suna: "account", abubuwa: [ {nau'in: "radiyo", suna: "hasAccount", "nau'in", "nau'i: {"Nau'in] "username", visualIf: "{hasAccount} = 'Ee'", isRequired: true}, {nau'in: "rubutu", suna: "password", inputType: "password", bayyaneIf: "{hasAccount} = 'Ee'", isRequired: true, validators: [{ type:" text", minLength: in " type 6}] rubutu: 6} suna: " gamsuwa", rateMin: 1, rateMax: 5 }, {nau'in: "comment", suna: "positiveFeedback", bayyaneIf: "{ gamsuwa} >= 4" }, {nau'in: "comment", suna: "inganta Feedback", bayyane Idan: "{sunan gamsuwa} <= 2" }}, {ganowa}, 100", abubuwa: []}];
Kwatanta wannan da sigar RHF na ɗan lokaci.
Katange superRefine wanda sunan mai amfani da kalmar sirri da ake buƙata ya ɓace. visualIf: "{hasAccount} = 'Ee'" haɗe da isRequired: gaskiya yana ɗaukar abubuwan da suka shafi duka biyu tare, a filin da kansa, inda zaku sa ran samun su. UseWatch + amfaniMemo sarkar da aka lissafta jumloli, haraji, da jimillar ana maye gurbinsu da filayen magana guda uku waɗanda ke magana da juna da suna. Yanayin shafin bita, wanda a cikin sigar RHF an sake gina shi ta hanyar ganowa ta hanyar nunaSubmit, mataki na 3 yana ba da reshe. Kuma a ƙarshe, maballin maɓallin kewayawa nav abu ne mai gani guda ɗaya Idan dukiya akan abu shafi.
Hankali guda yana nan. Sai dai kawai tsarin ya ba shi wurin zama inda ake iya gani a keɓe, maimakon yadawa cikin ɓangaren. Hakanan, lura cewa tsarin yana amfani da nau'in: 'bayani' don jimla, haraji, da jimillar. Maganar karantawa ne kawai kuma ana amfani da ita musamman don nuna ƙididdiga masu ƙima. SurveyJS kuma yana goyan bayan nau'in: 'html' don abun ciki a tsaye, amma don ƙididdige ƙididdiga, magana shine zaɓin da ya dace. Yanzu ga bangaren React. Bayar da Bayarwa Mai sauqi qwarai. Waya a kan Cikakke zuwa API ɗinku iri ɗaya - ta hanyar amfani da Mutation ko fito da sarari:
shigo da {useState, useEffect, useRef} daga "react"; shigo da {useMutation} daga "@tanstack/react-query";shigo {Model } daga "binciken-core"; shigo da {binciken } daga "binciken-react-ui"; shigo da "binciken-core/survey-core".
aikin fitarwa SurveyForm () {const [model] = useState (() => sabon Model (surveySchema));
maye gurbi = amfani da Mutation ({ mutationFn: async (data) => { const res = jira a samo ("/api/orders", { hanya: "POST", buga kai: {"Nau'in Abun ciki": "application/json"}, jiki: JSON.stringify (bayanai), }); idan (!res.ok) jefa sabon Kuskure ("Ba a kasa ƙaddamarwa"); dawo res.json (); }, });
const mutationRef = amfaniRef (maye gurbi); mutationRef.current = maye gurbi; useEffect (() => {const mai kulawa = (mai aikawa) => maye gurbin Ref.current.mutate (sender.data); model.onComplete.add (mai kulawa); dawowa () => model.onComplete.cire (mai kulawa); }, [samfurin]); // ref ya nisanci sake yin rajistar mai sarrafa kowane abin da aka yi (canza ainihin abin maye)
dawo (
<>
Dubi Binciken AlƙalamiJS-03-SurveyJS [mai yatsa] ta hanyar tsattsauran ra'ayi.
onCikakken gobara lokacin da mai amfani ya kai ƙarshen shafi na ƙarshe. Don haka idan jimlar ba ta ƙetare 100 ba kuma an tsallake shafin bita, har yanzu tana ci daidai saboda SurveyJS tana kimanta ganuwa kafin yanke shawarar abin da “shafi na ƙarshe” ke nufi. Sa'an nan, sender.data ya ƙunshi duk amsoshi tare da ƙididdige ƙididdiga (babban jimla, haraji, jimillar) azaman filayen aji na farko, don haka yawan kuɗin API yayi daidai da abin da sigar RHF ta taru da hannu a kanSubmit. TheMutationRef tsarin iri ɗaya ne da za ku isa a duk inda kuke buƙatar tsayayye mai kula da taron akan ƙimar da ke canzawa akan kowane samarwa - babu wani takamaiman SurveyJS game da shi.
Bangaren React baya ƙunshi kowane dabaru na kasuwanci kwata-kwata. Babu WatchWatch, babu JSX na sharadi, babu matakan mataki, babu sarkar amfaninMemo, babu superRefine. React yana yin abin da yake da kyau a zahiri: samar da wani sashi da haɗa shi zuwa kiran API. Me Ya Kosa Daga Amsa?
Damuwa Farashin RHF SurveyJS Ganuwa JSX rassan bayyane Idan Dabarun da aka samo amfaniWatch / amfani Memo magana Dokokin tsallake-tsallake superRefine Sharuɗɗan tsari Kewayawa jihar mataki Page bayyane Idan Wurin doka Rarraba cikin fayiloli Karkashe a cikin tsarin
Abin da ya tsaya a cikin React shine shimfidawa, salo, wayar da kai, da haɗin app, wanda shine a ce, abubuwan da aka yi React an tsara su da gaske. Duk wani abu ya koma cikin tsarin, kuma saboda makircin abu ne kawai na JSON, ana iya adana shi a cikin ma'ajin bayanai, wanda aka tsara shi ba tare da lambar aikace-aikacenku ba, ko kuma gyara ta hanyar kayan aiki na ciki ba tare da buƙatar turawa ba. Manajan samfur wanda ke buƙatar canza ƙofa wanda ke jawo shafin bita zai iya yin hakan ba tare da taɓa ɓangaren ba. Wannan shine bambancin aiki mai ma'ana ga ƙungiyoyi inda ɗabi'un tsari ke tasowa akai-akai kuma ba koyaushe injiniyoyi ke jagorantar su ba. Lokacin Amfani da kowace Hanya? Anan akwai kyakkyawan ƙa'idar babban yatsa da ke aiki a gare ni: yi tunanin share fom ɗin gaba ɗaya. Me za ku rasa?
Idan allon fuska ne, kuna son nau'ikan abubuwan da aka sarrafa. Idan dabara ce ta kasuwanci, kamar ƙofa, ƙa'idodin reshe, da buƙatun sharadi waɗanda ke ɓoye ainihin yanke shawara, kuna son injin ƙira.
Hakazalika, idan canje-canjen da ke zuwa muku galibi game da lakabi, filaye, da shimfidawa ne, RHF zai yi muku aiki lafiya. Idan sun kasance game da yanayi, sakamako, da dokoki waɗanda ops ko ƙungiyar lauyoyi na iya buƙatar daidaitawa a ranar Talata da yamma ba tare da shigar da tikiti ba, ƙirar ƙira tare da SurveyJS shine mafi dacewa da gaskiya. Wadannan hanyoyi guda biyu ba su da gaske cikin gasa da juna. Suna magance nau'o'in matsaloli daban-daban, kuma kuskuren da ya kamata a kauce masa shine rashin daidaituwa ga ma'auni zuwa nauyin ma'anar - kula da tsarin mulki kamar wani sashi saboda wannan shine kayan aikin da aka saba, ko kuma kaiwa ga injin manufofin saboda nau'i ya girma zuwa matakai uku kuma ya sami filin yanayi. Fom ɗin da muka gina a nan yana zaune kusa da kan iyaka da gangan, mai sarƙaƙƙiya don fallasa bambanci amma ba matsananci ba har kwatankwacin yana jin an tauye shi. Yawancin ainihin siffofin da ba su da ƙarfi a cikin codebase ɗinku mai yiwuwa suna zaune kusa da wannan iyaka, kuma tambayar yawanci shine kawai ko wani ya ambaci sunan ainihin su. Yi amfani da React Hook Form + Zod lokacin:
Siffofin sun dace da CRUD; Hankali ba shi da zurfi kuma mai UI; Injiniyoyin sun mallaki kowane hali; Baya ya kasance tushen gaskiya.
Yi amfani da SurveyJS lokacin da:
Siffofin sun haɗa da yanke shawarar kasuwanci; Dokokin sun samo asali ba tare da UI ba; Hankali dole ne a bayyane, a duba, ko siffa; Wadanda ba injiniyoyi suna tasiri hali; Dole ne nau'i ɗaya ya gudana a kan gaba da yawa.