Ev gotar ji hêla SurveyJS ve hatî piştgirî kirin Modelek derûnî heye ku piraniya pêşdebirên React bêyî ku bi dengekî bilind nîqaş bikin parve dikin. Ew form her gav tê guman kirin ku bibin pêkhate. Ev tê wateya stûnek mîna:
Forma React Hook ji bo dewleta herêmî (ji nû vesazkirina hindiktirîn, qeydkirina zeviyê ergonomîk, danûstendina mecbûrî). Zod ji bo erêkirinê (rastiya têketinê, erêkirina sînor, parsek-ewle ya tîpê). React Query ji bo paşîn: radestkirin, ji nû ve ceribandin, caching, hevdemkirina serverê, û hwd.
Û ji bo pirraniya formên - ekranên têketina we, rûpelên mîhengên we, modalên weya CRUD - ev bi rastî baş dixebite. Her perçe karê xwe dike, ew bi paqijî çêdikin, û hûn dikarin berbi beşên serîlêdana xwe yên ku bi rastî hilberê we cûda dikin biçin. Lê her carê, formek dest bi berhevkirina tiştan dike mîna qaîdeyên xuyangiyê yên ku bi bersivên berê ve girêdayî ne, an jî nirxên jêhatî yên ku di sê qadan de derbas dibin. Dibe ku tewra rûpelên ku divê werin paşxistin an jî li ser bingeha tevheviyek xebitandinê bêne xuyang kirin. Hûn şerta yekem bi useWatch û şaxek hundurîn re mijûl dibin, ku baş e. Piştre din. Dûv re hûn digihîjin superRefine da ku qaîdeyên xaçerê yên ku şemaya Zod-a we nekare bi rengek normal eşkere bike kod bike. Dûv re, navîgasyon gav dest bi mentiqê karsaziyê dike. Di hin xalan de, hûn li tiştê ku we çêkiriye dinêrin û pê dihesin ku form êdî bi rastî ne UI ye. Ew bêtir pêvajoyek biryarê ye, û dara pêkhateyê tenê cihê ku we lê hilanîn e. Li vir ez difikirim ku modela derûnî ya formên di React de têk diçe, û ew bi rastî ne sûcê kesî ye. Stack RHF + Zod di tiştê ku ji bo wê hatî çêkirin de pir xweş e. Pirsgirêk ev e ku em mêl dikin ku wê bikar bînin ji xala ku abstraksyonên wê bi pirsgirêkê re hevrû dibin ji ber ku alternatîf bi tevahî şêwazek ramana cûda hewce dike. Ev gotar li ser wê alternatîf e. Ji bo ku vê yekê nîşan bidin, em ê heman forma pir-gavekî du caran ava bikin:
Bi Forma React Hook + Zod re ji bo radestkirinê ji bo React Query ve girêdayî ye, Bi SurveyJS re, ku formek wekî daneyê dihesibîne - şemayek JSON a hêsan - li şûna darek pêkhatî.
Heman hewcedarî, heman mantiqa şertî, heman banga API-ê di dawiyê de. Dûv re em ê tam nexşeyê bikin ka çi bar kiriye û çi maye, û rêyek pratîkî destnîşan bikin ku hûn biryar bidin ka hûn kîjan modelê û kengê bikar bînin. Forma ku em ava dikin:
Ev form dê herikîna 4-gavekî bikar bîne: Gav 1: Details
Navê (pêdivî), E-name (pêdivî, forma derbasdar).
Gav 2: Siparîş bike
Buhayê yekîneyê, Hejmar, Rêjeya bacê, Derketî: Bi tevahî, Bac, Total.
Gav 3: Hesab & Bersiv
Hesabê te heye? (Belê/Na) Ger Erê → navê bikarhêner + şîfre, her du jî hewce ne. Ger Na → e-name jixwe di gava 1-ê de hatî berhev kirin.
Rêjeya razîbûnê (1–5) Ger ≥ 4 → bipirsin "Te çi hez kir?" Ger ≤ 2 → bipirsin "Em dikarin çi çêtir bikin?"
Gav 4: Vekolîn
Tenê heke bi tevahî >= 100 xuya bibe radestkirina dawî.
Ev ne tundî ye. Lê ji bo eşkerekirina cûdahiyên mîmarî bes e. Beş 1: Pêkhatî-Driven (React Hook Form + Zod) Sazkirin npm saz bike react-hook-form zod @hookform/resolvers @tanstack/react-query
Zod Schema Ka em bi şemaya Zod dest pê bikin, ji ber ku bi gelemperî şeklê formê li wir ava dibe. Ji bo her du gavên pêşîn - hûrguliyên kesane û têketinên fermanê - her tişt rasterast e: rêzikên pêwîst, hejmarên bi hindiktirîn, û hejmarek. Beşa balkêş gava ku hûn hewl didin ku qaîdeyên şertî îfade bikin dest pê dike.
import { z } ji "zod";
hinardekirin z.string()optional(), şîfre: z.string().optional(), razîbûn: z.number().min(1).max(5),positiveFeedback: z.string().optional(), çêtirkirinaFeedback: z.string().optional(),}).superRefine((data, ifesda) = "{Afsxta)=ha"> (!data.username) { ctx.addIssue({kod: "custom", rê: ["username"], message: "Required" } } if (!data.password || data.password.length < 6) { ctx.addIssue({cod: "password", path:"}); }
if (data.satisfaction >= 4 && !data.positiveFeedback) { ctx.addIssue({ kod: "custom", rê: ["Feedback"], peyam: "Ji kerema xwe tiştê ku te eciband parve bike" }); }
if (data.satisfaction <= 2 && !data.improvementFeedback) { ctx.addIssue({ kod: "custom", rê:["improvementFeedback"], peyam: "Ji kerema xwe ji me re bêje ka em çi çêtir bikin" }); }});
cureyê hinardekirinê FormData = z.infer
Bala xwe bidinê ku navê bikarhêner û şîfreyê wekî vebijarkî () têne nivîsandin, her çend ew bi şertî hewce ne ji ber ku şemaya asta tîpê ya Zod şeklê objektê vedibêje, ne qaîdeyên ku dema zevî girîng dibin destnîşan dike. Pêdivî ye ku pêdivî ye ku di hundurê superRefine de bijî, ku piştî ku şekil were pejirandin dimeşe û bigihîje tişta tevahî. Ew veqetandin ne xeletiyek e; ew tenê ya ku amûr ji bo hatî sêwirandin ev e: superRefine ew e ku mentiqê zevî li ku derê diçe gava ku ew nekare di avahiya şema bixwe de were diyar kirin. Ya ku li vir jî balkêş e ev e ku ev şema çi îfade nake. Têgeha wê ya rûpelan tune ye, têgehek ku li kîjan xalê têne xuyang kirin, û têgîna navîgasyonê tune. Hemî wê dê li cîhek din bijîn. Form Component
import { useForm, useWatch } ji "react-hook-form";import {zodResolver } ji "@hookform/resolvers/zod";import {useMutation } ji "@tanstack/react-query";import {useState, useMemo} ji "react";import type {formSche;
const STEPS = ["detay", "ferman", "hesab", "review"];
binivîse OrderPayload = FormData & { subtotal: hejmar; bac: hejmar; gişt: hejmar };
fonksiyona hinardekirinê RHFMultiStepForm() {const [gav, setStep] = useState(0);
const mutation = useMutation({ mutationFn: async (barkirin: OrderPayload) => { const res = li benda wergirtinê ("/api/orders", { rêbaz: "POST", sernivîs: { "Content-Type": "sepan/json" }, laş: JSON.stringify(payload), }); heke (!res.ok) xeletiyek nû bavêje ("Serkeftin nehat şandin"); vegera res.json(); }, });
const {qeyd, kontrol, handleSubmit, formState: {çewtiyên }, } = useForm
vegere (
);}Binêre Pen SurveyJS-03-RHF [ji hêla sixthextinction ve hatî kişandin. Li vir pir tişt diqewimin, û hêja ye ku hêdî hêdî bala xwe bidin ka tişt li ku bi dawî bûne.
Nirxên jêderketî - bi tevahî, bac, tevayî - di beşê de bi navgîniya useWatch û useMemo ve têne hesibandin ji ber ku ew bi nirxên zeviyê zindî ve girêdayî ne û ji wan re cîhek xwezayî ya din tune. Rêzikên dîtinê yên ji bo navê bikarhêner, şîfre, Feedback, û çêtirkirinaFeedback di JSX de wekî şertên hundurîn dijîn. Mantiqa paşveçûna gavê - rûpela vekolînê tenê dema ku bi tevahî >= 100 xuya dibe - di guhêrbara showSubmit û şerta renderê ya li ser gava 3-ê de tête bicîh kirin. Navîgasyon bixwe tenê jimarvanek useState ye ku em bi destan zêde dikin. React Query dubare, cachkirin, û betalkirinê digire dest. Form tenê bi daneyên pejirandî gazî mutation.mutate dike.
Yek ji van ne xelet e, bi serê xwe. Ev hîn jî React îdyomatîk e, û pêkhate bi saya ka RHF çawa ji nû ve îzole dike performans e. Lê heke hûn vê yekê bidin destê yekî ku ew nenivîsandiye û ji wan bipirsin ku rave bikin ka di bin çi şert û mercan de rûpela vekolînê xuya dike, ew neçar in ku di nav showSubmit, qonaxa 3-ya şerta danûstendinê, û mantiqa bişkoja nav-ê - sê cihên cihê - ji nû ve ava bikin ku qaîdeyek ku dikaribû di yek rêzê de were diyar kirin. Form kar dike, erê, lê tevger bi rastî wekî pergalek nayê kontrol kirin. Divê bi derûnî were îdam kirin. Ya girîngtir, guhartina wê tevlêbûna endezyariyê hewce dike. Tewra guheztinek piçûk jî, mîna rastkirina gava ku gava vekolînê xuya dike, tê wateya guherandina pêkhatê, nûvekirina erêkirinê, vekirina daxwazek kişandinê, li benda vekolînê, û ji nû ve bicîhkirinê. Beş 2: Schema-Driven (SurveyJS) Naha em bi karanîna nexşeyek heman herikînê ava bikin. Sazkirin npm saz bikin anket-core lêkolîn-react-ui @tanstack/react-query
Survey-core Motora xebitandinê ya serbixwe-platforma-lîsansa MIT-ê ya ku guheztina forma SurveyJS-ê hêzdar dike - beşa ku em li vir eleqedar dibin. Ew nexşeyek JSON digire, jê re modelek hundurîn ava dike, û her tiştê ku dê wekî din di pêkhateya weya React de bijî bi rê ve dibe: nirxandina vegotinên dîtinê, hesabkirina nirxên jêderkirî, birêvebirina rewşa rûpelê, şopandina pejirandinê, û biryardana ku tê çi wateyê "temam" ji ber ku kîjan rûpel bi rastî hatine destnîşan kirin.
Survey-react-uiPêka UI / rendering ku wê modelê bi React ve girêdide. Ew di bingeh de hêmanek
Bi hev re, ew bêyî nivîsandina yek rêzek herikîna kontrolê bi tevahî fonksiyonel, forma pir-rûpelî didin we. Forma schema bixwe, wekî ku berê jî hate gotin, tenê JSON e - ne DSL an tiştek xwedanî ye. Hûn dikarin wê têxin hundurê, wê ji pelek derxînin, wê ji API-yê bistînin, an jî wê di stûnek databasê de hilînin û di dema xebitandinê de wê hîdro bikin. Heman Forma, Wek Daneyên Li vir heman form heye, vê carê wekî tiştek JSON tête diyar kirin. Skema her tiştî diyar dike: avahî, erêkirin, qaîdeyên dîtinê, hesabên derhatî, navîgasyona rûpelê - û wê dide Modelek ku di dema xebitandinê de wê dinirxîne. Li vir tiştê ku bi tevahî xuya dike ev e:
export const surveySchema = {sernav: "Serherikîna Siparîşê", showProgressBar: "jor", rûpel: [ {nav: "detayên", hêman: [ {cure: "nivis", nav: "firstName", isRequired: rast }, {cure: "text", nav: "email", inputType: "email", "email": "email" }] } ] }, {nav: "sipari", hêman: [ {cure: "nivis", nav: "biha", inputType: "hejmar", defaultValue: 0 }, { type: "text", nav: "quantity", inputType: "hejmar", nirxa xwerû: 1 }, {type: "dropdown",nav: "TaxRate", defaultValue: 0.1, vebijark: [ {nirx: 0.05, nivîs: "5%" }, {nirx: 0.1, nivîs: "10%" }, {nirx: 0.15, nivîs: "15%" } ] }, {cure: "expression", nav: "{{antprice}" "binavkirin", nav: "bac", îfade: "{bingiştî} {bacRate}" }, {cure: "derbirrîn", nav: "tev" } ] }, {nav: "hesab", hêman: [{cure: "radyogrûp", nav: "hasAccount", "Navî:"Nav: "Nav: "Nav: "Nav: "Nav: "Nav: "Nav: "Nav:" "bikarhêner", xuyaIf: "{hasAccount} = 'Erê'", pêwîst e: rast }, { type: "nivis", nav: "şîfre", inputType: "şîfre", xuyaIf: "{hasAccount} = 'Erê'", is Required: rast, erêker: [{ type: "text", tîpên 6. tîp: "nirxandin", nav: "razî", rêjeyaMin: 1, rêjeyaMax: 5 }, { cure: "şirove", nav: "Feedbacka erênî", xuyaIf: "{rêwîtî} >= 4" }, { cure: "şirove", nav: "başkirinaFeedback", xuyaIf: "{ razîbûn" visualIf: "{giştî} >= 100", hêman: [] } ]};
Vê ji bo bîskekê bi guhertoya RHF re bidin hev.
Bloka superRefine ya ku bi şertê navê bikarhêner û şîfreya xwe hewce dike ji holê rabû. visualIf: "{hasAccount} = 'Erê'" bi isRequired re tê hev kirin: rast her du fikaran bi hev re, li ser zeviyê bixwe, cihê ku hûn li bendê ne ku wan bibînin, digire. Zincîra useWatch + useMemo ya ku bineretî, bac, û gişt hesab dike, bi sê qadên bilêvkirinê yên ku bi navên hev re referans dikin tê guheztin. Rewşa rûpela vekolînê, ku di guhertoya RHF-ê de tenê bi şopandina showSubmit, qonaxa 3-ê şaxê renderê ji nû ve hatî çêkirin. Û di dawiyê de, mantiqa bişkoja nav-ê yek taybetmendiyek xuyangIf-ê ya li ser objekta rûpelê ye.
Heman mantiq heye. Tenê ev e ku şema cîhek dide ku lê bijî li cihê ku ew ji hev veqetandî xuya dibe, li şûna ku li ser pêkhateyê belav bibe. Di heman demê de, bala xwe bidin ku şema celebê bikar tîne: 'derbirrîn' ji bo tevhev, bac û tevahî. Îfade tenê-xwendin e û bi giranî ji bo nîşandana nirxên hesapkirî tê bikar anîn. SurveyJS ji bo naveroka statîk jî celeb piştgirî dike: 'html', lê ji bo nirxên hesabkirî, vegotin bijareya rast e. Naha ji bo aliyê React. Rendering And Submission Pir sade. Bi heman awayî bi API-ya xwe re Têl bikin Complete - bi navgîniya karanîna Mutation an vekêşana sade:
import {useState, useEffect, useRef } ji "react"; import {useMutation } ji "@tanstack/react-query"; import {Model } ji "survey-core"; import { Survey } ji "survey-react-ui"; import "survey-core/curvey";core.
fonksiyona hinardekirinê SurveyForm() {const [model] = useState(() => Modela nû(surveySchema));
const mutation = useMutation({ mutationFn: async (dane) => { const res = li benda wergirtinê ("/api/orders", { rêbaz: "POST", sernivîs: { "Content-Type": "sepan/json" }, laş: JSON.stringify(dane), }); heke (!res.ok) xeletiyek nû bavêje ("Serkeftin nehat şandin"); vegera res.json(); }, });
const mutationRef = useRef(mutasyon); mutationRef.current = mutasyon; useEffect(() => {const handler = (sender) => mutationRef.current.mutate(sender.data); model.onComplete.add(handler); return () => model.onComplete.remove(handler);}, [model]); // ref ji nû ve qeydkirina hilberkerê her renderê diparêze (guheztina nasnameya objeya mutasyonê)
vegere (
<>
Binêre Pen SurveyJS-03-SurveyJS [forked] ji hêla sixthextinction ve.
onComplete dema ku bikarhêner digihîje dawiya rûpela paşîn a xuyayî dişewite. Ji ber vê yekê heke bi tevahî 100-an derbas neke û rûpela vekolînê were paşxistin, ew dîsa jî rast dişewite ji ber ku SurveyJS berî ku biryar bide ku tê çi wateyê "rûpela paşîn" dîtinê dinirxîne. Dûv re, sender.data hemî bersivan digel nirxên hesapkirî (bi tevahî, bac, tevahî) wekî zeviyên pola yekem dihewîne, ji ber vê yekê bargiraniya API-ê bi ya ku guhertoya RHF bi destan di onSubmit de berhev kiriye yek e. EwNimûneya mutationRef heman yek e ku hûn ê bigihîjin her derê ku hûn hewcedarek bûyerek domdar li ser nirxek ku li ser her rengdêrê diguhezîne - tiştek di derbarê wê de SurveyJS-taybetî tune.
Perçeya React êdî ti mantiqa karsaziyê tune. UseWatch tune, JSX-ya şertî tune, jimareya gavê tune, zincîra memo bikar bîne, superRefine tune. React tiştê ku ew di rastiyê de jêhatî ye dike: danasîna pêkhateyek û têlkirina wê bi bangek API re. Çi ji Reaksiyonê derket?
Xemgîn RHF Stack SurveyJS Dîtin şaxên JSX xuyanIf Nirxên hildayî bikar bîninWatch / useMemo îfade qaîdeyên cross-qada superRefîne Şertên Schema Navîgasyon dewleta gav Rûpel xuya dibeIf Cihê rêbazê Li ser pelan belav kirin Navendî di schema
Tiştê ku di React de dimîne sêwirandin, şêwaz, têlkirina radestkirinê, û yekbûna sepanê ye, ango tiştên ku React bi rastî ji bo wan hatine sêwirandin. Her tiştê din di şemayê de bar kir, û ji ber ku şema tenê tiştek JSON e, ew dikare di databasek de were hilanîn, ji koda serîlêdana we serbixwe were guherandin, an jî bi navgîniya amûra hundurîn ve were sererast kirin bêyî ku pêdivî bi bicîhkirinê hebe. Rêvebirek hilberek ku pêdivî ye ku sînorê ku rûpela vekolînê vedike biguhezîne, dikare wiya bêyî destwerdana pêkhateyê bike. Ew cûdahiyek xebitandinê ya watedar e ji bo tîmên ku tevgera formê bi gelemperî pêşve diçe û her gav ji hêla endezyaran ve nayê rêve kirin. Kengê Her Nêzîktêdayîn Bikaranîn? Li vir qaîdeyek baş heye ku ji bo min dixebite: xeyal bikin ku formê bi tevahî jêbirin. Hûn ê çi winda bikin?
Ger ew ekran be, hûn formên pêkhatî-rêvebir dixwazin. Ger ew mantiqa karsaziyê ye, mîna bend, qaîdeyên şaxkirinê, û daxwazên şertî yên ku biryarên rastîn kod dikin, hûn motorek şema dixwazin.
Bi heman rengî, heke guheztinên ku li ber we têne bi piranî li ser etîket, zevî û sêwiranê ne, RHF dê ji we re baş xizmet bike. Ger ew li ser şert, encam, û qaîdeyên ku dibe ku tîmê weya qanûnî an jî tîmê weya dadrêsî hewce bike ku roja Sêşemê piştî nîvro bêyî tomarkirina bilêtek were sererast kirin, modela şema bi SurveyJS re rasttir e. Ev her du nêzîkatî bi rastî bi hev re ne di pêşbaziyê de ne. Ew çînên cûda yên pirsgirêkan destnîşan dikin, û xeletiya ku hêja ye jê were dûrxistin nehevkirina abstrakasyonê bi giraniya mantiqê re ye - muameleya pergalek qaîdeyê wekî pêkhateyek ji ber ku ew amûrek naskirî ye, an gihîştina motorek siyasetê ji ber ku formek sê gavan mezin bû û qadek şert girt. Forma ku me li vir ava kiriye, bi qestî li nêzî sînor rûdine, têra xwe tevlihev e ku cûdahiyê derxe holê lê ne ew qas tundûtî ye ku berawirdkirin xelet hîs bike. Piraniya formên rastîn ên ku di bingeha koda we de nelirêtî bûne, dibe ku li nêzî heman sînorî rûnin, û pirs bi gelemperî tenê ev e ku gelo kesek navê wan bi rastî çi ye. Dema ku Forma React Hook + Zod bikar bînin:
Formên CRUD-oriented in; Mantiq hûrik û UI-rêveber e; Endezyar xwediyê hemû tevgerê ne; Backend çavkaniya rastiyê dimîne.
Dema ku SurveyJS bikar bînin:
Form biryarên karsaziyê kod dikin; Rêgezên serbixwe ji UI pêşve diçin; Divê mantiq xuya be, were guhdarîkirin, an jî versiyonê be; Ne-endezyar bandor li ser tevgerê dikin; Pêdivî ye ku heman form li gelek pêşangehan derbas bibe.