Kay qillqasqaqa SurveyJS nisqap yanapasqanmi Kanmi huk yuyay modelo aswan React ruwaqkuna rakinakunku mana hayk’aqpas kallpawan rimaspa. Chay formakuna sapa kuti componentekuna kananku. Kayqa niyta munan huk pila kayhinata:
React Hook Formulario llaqta estadopaq (aslla re-renders, ergonómico campo registro, interacción imperativa). Zod chiqaqchaypaq (yaykusqa chiqan kay, lindero chiqaqchay, laya-mana manchay t'aqwiy). React Tapuy qhipa kaqpaq: apachiy, wakmanta kallpachakuy, waqaychay, sirwiq tinkiynin, chaymanta wakkuna.
Hinallataq aswan achka formulariokunapaq — pantallakuna yaykuyniykipaq, churana p'anqakunaykipaq, CRUD modalesniykipaq — kay chiqamanta allinta llamkan. Sapa p’anqa llamk’ayninta ruwan, ch’uyata ruwanku, chaymanta chiqamanta ruruykita t’aqaq partekunaman puriyta atikunki. Ichaqa sapa kuti, huk formularioqa imakunatapas huñuyta qallarikun imaynan rikuy kamachikuykuna ñawpaq kutichiykunamanta hapipakuq, utaq hurqusqa chanikuna kimsa chakrakunapi cascada hina. Ichapas llapan p'anqakunatapas saltanapaq utaq rikuchisqa kanan huk puriq llapanpi hapipakuspa. Ñawpaq condicionalta huk useWatch kaqwan chaymanta huk inline rama kaqwan ruwanki, chaytaq allinmi. Chaymantataq huk. Chaymanta superRefine kaqman chayachkanki chakasqa pampa kamachiykunata codificananpaq mayqinkunatachus Zod esquemayki mana normal ñanpi rikuchiyta atinchu. Chaymanta, paso puriyqa negocio lógica fugayta qallarikun. Mayninpi, ima ruwasqaykita qhawanki chaymanta reparanki formulario manaña chiqamanta UI kaqta. Aswan huk tanteay ruwaymi, chaymanta componente sach’a maypichus waqaychasqayki chayllapi kachkan. Kaypin yuyaykuni React nisqapi formakunapaq yuyay modelo p’akikun, cheqaqtapunitaqmi mana pipas huchanchu. RHF + Zod pilaqa ancha allinmi imapaq ruwasqa kasqanmanta. Chay asuntoqa, tendenciaykuqa chayta llamk’achiyta munanchik, maypichus abstraccionesnin chay sasachakuywan tupan chay puntomanta, imaraykuchus chay alternativaqa wakjina yuyayta munan formakunamanta tukuyninpi. Kay qillqasqaqa chay alternativamantam rimachkan. Kayta rikuchinapaq, iskay kutita kikin achka llamkana formulariota ruwasaqku:
React Hook Form + Zod nisqawan React Query nisqaman alambrasqa apachinapaq, SurveyJS kaqwan, mayqinchus huk formulariota willay hina qhawan — huk sanu JSON esquema — aswan huk componente sach'a hina.
Kikin mañakuykuna, kikin condicional lógica, kikin API waqyay tukukuypi. Chaymantaqa allinta mapapi ruwasaqku imakunachus kuyusqa chaymanta imakuna qhipakusqanmanta, chanta juk ruwaypaq ñanta churasaqku mayqin modelotachus llamk’achinaykita, mayk’aqchus llamk’achinaykipaq. Chay formulario ruwasqaykuqa:
Kay formularioqa 4 llamkanayuq flujota llamk'achinqa: 1 kaq phatma: Detalles
Ñawpaq suti (necesario), . Correo electrónico (necesario, formato valido).
2 kaq phatma: Kamachiy
Unidadpa chanin, . Achka kaynin, . Tasa tributaria, 1.1. Derivado: 1.1. Subtotal, . Impuesto, . Llapan.
3 kaq phatma: Cuenta & Retroalimentación
¿Qanpa cuentan kanchu? (Arí/Mana) Sichus Arí → username + contraseña, iskaynintinmi mañasqa. Sichus Mana → correo electrónico 1 kaqpi huñusqaña.
Satisfacción nisqamanta (1–5) . Sichus ≥ 4 → tapuy “¿Imataq gustasurqanki?” Sichus ≤ 2 → tapuy “¿Imatan allinchasunman?”
4 kaq phatma: Riqsichikuy
Llapan >= 100 kaptinllam rikurin Tukupay apachiy.
Kayqa manan nishutachu. Ichaqa arquitectura nisqapi mana kaqlla kasqankuta sut’inchanapaqmi suficiente. 1 kaq raki: Componente-driven (Forma de Gancho de Reacción + Zod) . Instalación nisqa npm churay react-hook-form zod @hookform/resolvers @tanstack/react-tapukuy
Zod Esquema nisqa Zod esquemawan qallarisun, imaraykuchus chaypiqa aswanta formap rikch’ayninqa takyasqa kachkan. Ñawpaq iskay llamkanakunapaq — sapalla willaykunapaq chaymanta kamachiy yaykuykunapaq — tukuy imapas chiqan kachkan: mañasqa watiqakuna, yupaykuna aswan pisi kaqwan, chaymanta huk enum kaqwan. Chay interesante parteqa qallarikunmi kamachikuy condicional nisqakunata rimayta munaspayki.
"zod" nisqamanta { z } nisqa apamuy;
export const formSchema = z.object({ ñawpaqSuti: z.string().min(1, "Munasqa"), correo electrónico: z.string().email("Mana allin correo electrónico"), chanin: z.yupay().min(0), achka: z.yupay().min(1), taxRate: z.number(), hasAccount: z.enum(["Arí", "Mana"]), username: z.string ().akllasqa (), contraseña: z.string ().akllasqa (), satisfacción: z.yupay ().min (1).max (5), positivoRetroalimentación: z.string ().akllasqa (), allinchayRetroalimentación: z.string ().akllasqa (),}).superRefine ((datos, ctx) => { sichus (datos.hasAccount === "Arí") { sichus .
if (data.satisfaction >= 4 && !data.positiveFeedback) { ctx.addIssue({ codigo: "costumbre", ñan: ["positiveFeedback"], willakuy: "Ama hina kaspa, gustasqaykita rakiy" }); } .
if (datos.satisfacción <= 2 && !datos.allinchayRetroalimentación) { ctx.addIssue({ código: "sapanchasqa", ñan:["improvementFeedback"], willakuy: "Ama hina kaspa, willawayku ima allinchanapaq" }); }});
hawaman apachiy laya FormData = z.infer
Reparay username chaymanta contraseña opcional() hina qillqasqa kachkanku condicionalmente mañasqa kaptinkupas imaraykuchus Zod’s tipo-nivel esquema objetopa rikchayninta willan, mana kamachiykunatachu kamachin mayk’aqchus chakrakuna importante kanku. Condicional mañakuyqa superRefine ukhupi kawsanan tiyan, mayqinchus rikch'a chiqaqchasqa kaptin purin chaymanta hunt'asqa objetoman yaykuyniyuq. Chay t’aqanakuyqa manan pantaychu; chaylla imapaqchus yanapakuy ruwasqa kachkan: superRefine maymanchus cruzada-campo lógica rin mayk’aqchus mana kikin esquema estructurapi rikuchiyta atikunmanchu. Kaypipas reparanapaqmi, kay esquema mana rikuchisqanmi. Manataqmi p'anqakunamanta hamut'ayniyuqchu, manam mayqin chakrakuna maypi rikukuq kasqanmanta hamut'ayniyuqchu, manataqmi puriymanta yuyayniyuqchu. Tukuy chaykunam huklawpi kawsanqa. Formulario Componente nisqa
import { useForm, useWatch } "react-hook-form" kaqmanta;import { zodResolver } kaqmanta "@hookform/resolvers/zod" kaqmanta;import { useMutation } kaqmanta "@tanstack/react-query" kaqmanta;import { useState, useMemo } kaqmanta "react" kaqmanta;import { formSchema, type FormData } kaqmanta "./schema" kaqmanta;
const STEPS = ["detalles", "orden", "cuenta", "qhaway"];
tipo OrderPayload = FormularioData & { subtotal: yupay; impuesto: yupay; llapan: yupay };
hawaman apachiy ruway RHFMultiStepForm () { const [paso, setStep] = Estadota llamk'achiy (0);
const mutación = llamk'achiyMutación ({ mutationFn: async (carga útil: Carga de pedido) => { const res = suyay apamuy ("/api/kamachiykuna", { método: "POST", . umalliqkuna: { "Contenido-Tipo": "aplicación/json" }, kurku: JSON.stringify (carga útil), . }); if (!res.ok) throw new Error("Mana apachiyta atirqanichu"); kutichiy res.json (); }, . });
const { registro, control, handleSubmit, formState: { pantaykuna }, } = useForm
return (
);}Qaway Encuesta de PlumaJS-03-RHF [forked] suqta chinkaywan. Kaypiqa askhan pasashan, chaymi allin kanman pisiyachiy maypichus imapas tukukusqanmanta reparanapaq.
Chay hurqusqa chanikuna — subtotal, impuesto, total — componente kaqpi yupasqa kanku useWatch chaymanta useMemo kaqnintakama imaraykuchus kawsaq chakra chaninkunamanta hapirin chaymanta mana wak natural sitio paykunapaq kanchu. Rikuna kamachiykuna username kaqpaq, contraseña kaqpaq, positiveFeedback kaqpaq chaymanta improvementFeedback kaqpaq JSX kaqpi kawsanku inline condicionales hina. Llamkana-saltay lógica — qhaway p'anqalla rikukun mayk'aq tukuynin >= 100 — showSubmit tikraqpi chaymanta ruway condicionpi 3 kaqpi churasqa. Kikin puriyqa huk useState yupaylla kachkan chaymanta makiwan yapachkayku. React Query kaqmanta kallpachakuykunata, waqaychayta, mana allin ruwayta ima ruwan. Formularioqa mutation.mutate nispalla waqyan validado datoswan.
Kaykunamantaqa manam mayqinpas pantasqachu, per se. Kayqa React idiomáticoraqmi, chaymanta componenteqa allin ruwaqmi gracias imayna RHF re-renders sapaqchasqa. Ichaqa sichus kayta huk runaman quwaq mana qillqaqman chaymanta mañawaq sut’inchanankupaq ima condicionkunapichus qhaway p’anqa rikhurin, paykuna showSubmit kaqninta qatinanku tiyan, 3 kaq llamkana ruway condicionwan, chaymanta nav botón lógica kaqwan — kimsa sapaq kitikunapi — huk kamachiyta wakmanta ruwanankupaq mayqinchus huk chirupi nisqa kanman karqa. Formulario llamk’an, arí, ichaqa comportamientoqa mana chiqamantachu qhawanapaq sistema hina. Yuyaypi wañuchina tiyan. Aswan allinqa, chayta tikranapaqqa ingenieria nisqapa yanapakuyninmi. Huk huch'uy allichaypas, imaynachus allichay mayk'aq qhaway llamkana rikuchikun, componente llamk'achiyta, chiqaqchayta musuqyachiy, huk aysana mañakuyta kichay, qhawayta suyay chaymanta wakmanta mast'ariy niyta munan. 2 kaq raki: Esquema-Dirigido (EncuestaJS) . Kunanqa chay kikin flujota ruwasun esquema nisqawan. Instalación nisqa npm encuesta-core encuesta-react-ui @tanstack/react-query nisqa churay
survey-coreMIT-licenciayuq plataformamanta sapanchasqa puriy pacha motor kaqmanta mayqinchus SurveyJS’s formulario ruwayta kallpachan — kaypi llakikusqayku parte. Huk JSON esquemata hapin, chaymanta huk ukhu modelota ruwan, chaymanta tukuy imata ruwan mayqinkunachus wakhina React componenteykipi kawsankuman: rikuy expresionkuna chaninchay, hurqusqa chanikuna yupay, p'anqa estadota kamachiy, chiqaqchay qatiy, chaymanta ima “hunt'asqa” niyta munan qusqa mayqin p'anqakuna chiqamanta rikuchisqa kaqta tanteay.
survey-react-uiChay modelota React kaqwan tinkiq UI / ruway qatana. Aswanta huk
Kuska, paykuna huk hunt'asqa ruwanayuq, achka p'anqayuq formulario puriy pachata qusunki mana huklla chiru kamachiy puriyta qillqaspa. Kikin esquema formatoqa, ñawpaq nisqa hina, JSONlla — mana DSL nitaq imapas propiedad nisqachu. Chayta chiru ukhupi churayta atikunki, huk willañiqimanta apamuyta atikunki, huk APImanta apamuyta atikunki utaq huk willaypa tiyapuynin columnapi waqaychayta atikunki chaymanta purichiy pachapi hidratayta atikunki. Kikin Forma, Datos hina Kaypi kikin formulario, kay kutipi JSON objeto hina rikuchisqa. Esquema tukuy imata riqsichin: ruway, chiqaqchay, rikuy kamachiykuna, hurqusqa yupaykuna, p'anqa puriy — chaymanta huk Modeloman qun chaymanta purichiy pacha chaninchan. Kaypin kashan imaynachus chay hunt’asqata:
export const surveySchema = { title: "Ordenpa puriynin", showProgressBar: "hanaq", p'anqakuna: [ { suti: "detalles", elementos: [ { laya: "qillqa", suti: "ñawpaq suti", isRequired: chiqap }, { laya: "qillqa", suti: "correo electrónico", inputType: "correo electrónico", isRequired: chiqap, validadores: [{ laya: "correo electrónico", qillqa: "Mana allin correo electrónico" }] } ] }, { suti: "kamachiy", elementokuna: [ { laya: "qillqa", suti: "precio", yaykuyTipo: "yupay", ñawpaqmanta Chanin: 0 }, { laya: "qillqa", suti: "achka", yaykusqaTipo: "yupay", ñawpaqmanta chaniyuq: 1 }, { laya: "urquy",suti: "taxRate", defaultValue: 0.1, akllanakuna: [ { chani: 0.05, qillqa: "5%" }, { chani: 0.1, qillqa: "10%" }, { chani: 0.15, qillqa: "15%" } ] }, { laya: "expresión", suti: "subtotal", expresion: "{precio} {cantidad}" }, { tipo: "expresión", suti: "impuesto", expresion: "{subtotal} {taxRate}" }, { tipo: "expresión", suti: "total", expresion: "{subtotal} + {impuesto}" } ] }, { suti: "cuenta", elementokuna: [ { tipo: "radiogrupo", suti: "hasAccount", akllanakuna: ["Arí", "Mana"] } , { tipo: "texto", suti: "username", visibleIf: "{hasAccount} = 'Arí'", isRequired: true }, { tipo: "texto", suti: "contraseña", inputType: "contraseña", visibleIf: "{hasAccount} = 'Arí'", isRequired: chiqap, validadores: [{ tipo: "qillqa", minLargo: 6, qillqa: "Mana 6 qillqakunapi" } ] }, { tipo: "calificación", suti: "satisfacción", rateMin: 1, rateMax: 5 }, { tipo: "comentario", suti: "positiveRetroalimentación", visibleSi: "{satisfacción} >= 4" }, { tipo: "comentario", suti: "allinchakuyRetroalimentación", rikukuqSi: "{satisfacción} <= 2" } ] }, { suti: "qhaway", rikukuqSichus: "{tukuy} >= 100", elementokuna: [] } ]};
Kayta huk ratulla RHF kaqwan tupachiy.
SuperRefine bloque mayqinchus condicionalmente username chaymanta contraseña mañasqa karqa. visibleIf: "{hasAccount} = 'Arí'" isRequired kaqwan huñusqa: true iskaynin llakikuykunata kuska llamk'achin, kikin pampapi, maypi tariyta suyakuwaq. UseWatch + useMemo kadena mayqinchus subtotal, impuesto chaymanta total yupasqa kimsa expresión pampakunawan tikrasqa kachkan mayqinkunachus sutiwan riqsichikunku. Revisión p'anqap kaynin, mayqinchus RHF kaqpi musuqmanta ruway atikuq karqa showSubmit kaqninta qatispalla, 3 kaq llamkana ruway rama. Hinallataq tukukuypaq, nav botón lógica huk sapalla visibleIf propiedad p'anqa objeto kaqpi.
Chay kikin lógica nisqataqmi kan. Chaylla esquema huk tiyananpaq qun maypichus sapanchasqa rikukun, aswanta componente kaqpi mast’arisqa. Hinallataq, reparay esquema nisqapiqa subtotal, impuesto, total nisqapaqpas tipo: ‘expresión’ nisqawanmi llamk’achkan. Expresión nisqaqa ñawirinapaqlla, astawanqa yupasqa chanikunata qhawanapaq llamk'achisqa. SurveyJS yanapallantaq laya: 'html' mana kuyukuq contenidopaq, ichaqa yupasqa chanikunapaq, expresión allin akllana. Kunanqa React ladopaq. Renderización Y Entrega Ancha simple. Wire onComplete APIykiman kaqllata — useMutation utaq llañu apamuy kaqnintakama:
import { useState, useEffect, useRef } "react" kaqmanta;import { useMutation } kaqmanta "@tanstack/react-query";import { Modelo } kaqmanta "encuesta-core" kaqmanta;import { Encuesta } kaqmanta "encuesta-react-ui" kaqmanta;import "encuesta-core/encuesta-core.css" kaqmanta;
hawaman apachiy ruway EncuestaFormulario () { const [modelo] = useState (() => musuq Modelo (encuestaEsquema));
const mutación = llamk'achiyMutación ({ mutaciónFn: sincronización (datos) => { . const res = suyay apamuy ("/api/kamachiykuna", { método: "POST", . umalliqkuna: { "Contenido-Tipo": "aplicación/json" }, kurku: JSON.stringify (willakuy), . }); if (!res.ok) throw new Error("Mana apachiyta atirqanichu"); kutichiy res.json (); }, . });
const mutationRef = llamk'achiyRef (mutacion); mutationRef.current = mutación nisqa; useEffect (() => { const handler = (kachaq) => mutationRef.current.mutate (kachaq.datos); modelo.onComplete.yapay (handler); kutichiy () => modelo.onComplete.qurquy (kamachiq); }, [modelo]); // ref sapa ruwaypi hapiqninta wakmanta qillqachiyta hark'an (mutacion objeto identidad tikrakun)
kutiy (
<>
Qaway Pen EncuestaJS-03-EncuestaJS [forked] suqta chinkaywan.
onComplete nina rawrachin, llamk'achiq qhipa rikukuq p'anqap tukukuyninman chayaptin. Chaymi sichus llapan mana hayk'aqpas 100 chimpanchu chaymanta qhaway p'anqa saltasqa, allintaraqmi rawrachin imaraykuchus SurveyJS rikuy atiyta chaninchan manaraq ima “qhipa p'anqa” niyta munan chayta tanteachkaspa. Chaymanta, sender.data llapa kutichiykunata yupasqa chanikunawan kuska (subtotal, impuesto, total) ñawpaq clase pampakuna hina hap'in, chayrayku API carga útil kaqlla kachkan ima RHF laya makiwan huñusqa onSubmit kaqpi. ChaymutationRef patrón kaqlla maymanpas chayawaq maymanpas huk takyasqa ruway kamachiqta necesitanki huk chaninmanta sapa ruwaypi tikraq — mana imapas SurveyJS-específico chaymanta.
React componente manaña ima negocio lógica nisqatapas llapanpichu hap'in. Mana useWatch kanchu, mana JSX condicional kanchu, mana paso yupay kanchu, mana useMemo cadena kanchu, mana superRefine kanchu. React ruwachkan imachus chiqamanta allin kachkan: huk componente ruway chaymanta huk API waqyayman cableado. ¿Imataq React nisqamanta lluqsirqa?
Preocupacion RHF Pila EncuestaJS Rikunalla JSX ramakuna rikukuqSi Derivado valores nisqakuna utilizarQhaway / utilizayMemo expresion nisqa Chawpi chakra kamachiykuna superRefina nisqa Condiciones de esquema nisqa Navegación nisqa paso estado P'anqa rikukuqSi Kamachiy maypi kasqan Willañiqikunapi rakisqa Esquema nisqapi chawpichasqa
Imachus React kaqpi qhipakuchkan chaymanta churay, estilo, cableado apachiy chaymanta app tinkiynin, mayqinchus niyta munan, imakuna React chiqamanta ruwasqa kachkan. Tukuy imapas esquemaman kuyusqa, chaymanta esquema JSON objetolla kasqanrayku, huk willaypa tiyapuyninpi waqaychasqa kanman, ruwana codigoykimanta sapanchasqa versión ruwasqa, utaq ukhu yanapakuywan llamk'achisqa kanman mana mast'ariyta mañaspa. Huk ruru kamachiq mayqinchus umbral tikrayta munan mayqinchus qhaway p'anqata llamk'achin chayta ruwayta atin mana componente llamispa. Chayqa huk significativo operativo chiqan kay equipokunapaq maypi forma comportamiento sapa kuti evolucionan chaymanta mana sapa kutichu ingenierokuna purichisqa. ¿Hayk’aqmi sapa enfoqueta utilizana? Kaypi huk allin kamachiy kachkan, ñuqapaq llamk’an: yuyaykuy formulariota llapanta qulluyta. ¿Imatan chinkachiwaq?
Sichus pantallakuna kanku, componente-wan purichisqa formulariokunata munanki. Sichus negocio lógica kaq, umbrales hina, ramakuna kamachiykuna hina, chaymanta condicional requisitokuna chiqa decisionkuna codificaq hina, huk esquema motorta munanki.
Chaynallataq, sichus ñanniykiman hamuq tikrakuykuna aswanta etiquetakuna, chakrakuna, chaymanta churaymanta kanku, RHF allinta yanapasunki. Sichus paykuna condicionkunamanta, ruwaykunamanta chaymanta kamachiykunamanta kanku mayqinkunatachus ops utaq equipo legalniyki huk martes tardepi mana boletota presentaspa allichayta necesitankuman, SurveyJS kaqwan modelo esquema aswan honrado tupachiy. Kay iskay hamutaykunaqa manam chiqaptachu atipanakuchkanku. Paykunaqa hukniray clase sasachakuykunata allichanku, chaymanta pantayqa karunchanapaq valeqqa abstracción kaqwan mana tupachiymi lógica llasayninwan — huk kamachiy sistemata huk componente hina qhaway imaraykuchus chay riqsisqa yanapakuy, utaq huk política motorman chayay imaraykuchus huk formulario kimsa llamkanakunaman wiñarqa chaymanta huk condicional campota rantirqa. Kaypi ruwasqayku formaqa tiyaykuchkanmi linderopa hichpanpi deliberadamente, complejo suficiente chaynapi chay diferenciata qawachinapaq ichaqa manam chayna extremachu chaymi tupanachiyqa rigged hina sientekun. Yaqa llapan chiqap formulariokuna mana llamk'anayuqña kanku código base kaqpi ichapas chay kikin lindero qayllapi tiyakunku, chaymanta tapuyqa aswanta kanman sichus pipas sutichasqa imachus chiqamanta kasqankuta. React Hook Formulario + Zod nisqawan llamk'achiy mayk'aq:
Formularios nisqakunaqa CRUD nisqamanmi churasqa kanku; Lógica mana ancha hatunchu chaymanta UI-wan purichisqa; Ingenierokuna tukuy comportamientokunata dueñon kanku; Backend chiqappa paqariynin hinallam kachkan.
SurveyJS nisqawan llamk'achiy mayk'aq:
Formulariokuna codificanku negocio decisionkuna; Kamachiykuna UImanta sapanchasqa wiñanku; Lógica rikukuq, uyarinapaq utaq versión nisqayuq kanan tiyan; Mana ingenierokuna comportamientota influyen; Kikin formularioqa achka frontendkunapi purinan tiyan.