Ity lahatsoratra ity dia tohanan'ny SurveyJS Misy modely ara-tsaina zarain'ny ankamaroan'ny mpamorona React nefa tsy miresaka momba izany. Ireo endrika ireo dia heverina ho singa foana. Izany dia midika hoe stack toy ny:
React Hook Form ho an'ny fanjakana eo an-toerana (famerenana kely indrindra, fisoratana anarana amin'ny saha ergonomika, fifandraisana tsy maintsy atao). Zod ho an'ny fanamarinana (fahamarinana fampidirana, fanamarinana sisintany, fanasokajiana azo antoka). React Query ho an'ny backend: fandefasana, andrana indray, caching, sync server, sns.
Ary ho an'ny ankamaroan'ny endrika - ny efijery fidiranao, ny pejin'ny fanovanao, ny CRUD modals anao - tena miasa tsara izany. Ny singa tsirairay dia manao ny asany, mamorona madio izy ireo, ary afaka mandroso amin'ny ampahany amin'ny fampiharana anao izay tena mampiavaka ny vokatrao ianao. Saingy indraindray, ny endrika iray dia manomboka manangona zavatra toy ny fitsipiky ny fahitana izay miankina amin'ny valiny teo aloha, na ny soatoavina azo avy amin'ny sanda telo. Mety ho pejy iray manontolo mihitsy aza izay tokony hatsipy na aseho mifototra amin'ny totalin'ny mihazakazaka. Mitantana ny fepetra voalohany ianao amin'ny fampiasana Watch sy sampana inline, izay tsara. Dia hafa. Avy eo ianao dia tonga any amin'ny superRefine mba hanisy fehezan-dalàna mifanandrify izay tsy azon'ny schema Zod aseho amin'ny fomba mahazatra. Avy eo, manomboka mitete ny lojikan'ny fandraharahana ny fitetezana dingana. Amin'ny fotoana iray, mijery izay naorinao ianao ary mahatsapa fa tsy tena UI intsony ilay endrika. Fanapahan-kevitra bebe kokoa izany, ary ny hazo singa no toerana nitehirizanao azy. Eto no heveriko fa rava ny maodely ara-tsaina ho an'ny endrika ao amin'ny React, ary tena tsy misy diso mihitsy. Ny stack RHF + Zod dia tena tsara amin'ny nanaovana azy. Ny olana dia ny fampiasana azy hatrany hatrany amin'ny teboka izay mifanaraka amin'ny olana ny abstractions satria ny safidy dia mitaky fomba fisainana hafa momba ny endrika. Ity lahatsoratra ity dia momba an'io safidy io. Mba hampisehoana izany dia hanangana endrika mitovy dingana indroa isika:
Miaraka amin'ny React Hook Form + Zod mifandray amin'ny React Query amin'ny fandefasana, Miaraka amin'ny SurveyJS, izay mandray endrika ho angon-drakitra - schema JSON tsotra - fa tsy hazo singa.
Ny fepetra mitovy, ny lojika misy fepetra mitovy, ny antso API mitovy amin'ny farany. Avy eo isika dia hanao sarintany marina izay nifindra sy izay nijanona, ary mametraka fomba azo ampiharina hanapahana izay modely tokony hampiasainao, ary rahoviana. Ny endrika amboarinay:
Ity endrika ity dia hampiasa fikoriana 4 dingana: Dingana 1: Details
Anarana voalohany (takina), Email (takina, endrika manan-kery).
Dingana 2: baiko
Vidiny iray, Isan'ny, tahan'ny hetra, Nalaina: Subtotal, hetra, Total.
Dingana 3: Account & Feedback
Manana kaonty ve ianao? (Eny/Tsia) Raha Eny → solonanarana + tenimiafina dia samy ilaina. Raha Tsia → mailaka efa voaangona ao amin'ny dingana 1.
Naoty fahafaham-po (1–5) Raha ≥ 4 → dia anontanio hoe “Inona no tianao?” Raha ≤ 2 → manontany hoe “Inona no azo hatsaraina?”
Dingana 4: Famerenana
Miseho ihany raha total >= 100 Fandefasana farany.
Tsy tafahoatra izany. Saingy ampy ny mampiharihary ny fahasamihafana ara-javakanto. Fizarana 1: Entin'ny singa (React Hook Form + Zod) Fametrahana npm mametraka react-hook-form zod @hookform/resolvers @tanstack/react-query
Zod Schema Andeha isika hanomboka amin'ny skema Zod, satria matetika no misy ny endriky ny endrika. Ho an'ny dingana roa voalohany - ny antsipiriany manokana sy ny fampidirana baiko - ny zava-drehetra dia tsotra: tady ilaina, isa misy kely indrindra ary enum. Ny ampahany mahaliana dia manomboka rehefa manandrana maneho ny fitsipika misy fepetra ianao.
manafatra { z } avy amin'ny "zod";
export const formSchema = z.object({ firstName: z.string().min(1, "Required"), email: z.string().mail("Invalid invalid"), vidiny: z.number().min(0), quantity: z.number().min(1), taxRate: z.number(), hasAccount:z.enum"(z.enum) tenimiafina: z.string().optional(), fahafaham-po: z.number().min(1).max(5), positiveFeedback: z.string().optional(), improvementFeedback: z.string().optional(),}).superRefine((data. ["username"], hafatra: "Ilaina" }); } raha (!data.password || data.password.length < 6) { ctx.addIssue({ code: "custom", lalana: ["password"], message: "Min 6 characters" } }
raha (data.satisfaction >= 4 && !data.positiveFeedback) { ctx.addIssue({ code: "custom", lalana: ["positiveFeedback"], message: "Mba zarao izay tianao" }); }
raha (data.satisfaction <= 2 && !data.improvementFeedback) { ctx.addIssue({ code: "custom", lalana:["improvementFeedback"], hafatra: "Mba lazao anay izay tokony hohatsaraina" }); }});
karazana fanondranana FormData = z.infer
Mariho fa ny solon'anarana sy ny tenimiafina dia soratana ho safidy () na dia takiana amin'ny fepetra aza izy ireo satria ny skema karazana karazana Zod dia mamaritra ny endriky ny zavatra, fa tsy ny fitsipika mifehy ny sehatra. Ny fepetra takiana dia tsy maintsy miaina ao anatin'ny superRefine, izay mandeha aorian'ny fanamarinana ny endrika ary mahazo ny zavatra feno. Tsy kilema izany fisarahana izany; io ihany no natao ho an'ny fitaovana: ny superRefine dia ny fandehan'ny lojika cross-field rehefa tsy azo aseho ao amin'ny rafitra schema mihitsy. Ny zava-dehibe ihany koa eto dia ny tsy asehon'ity tetika ity. Tsy manana foto-kevitra momba ny pejy izy io, tsy misy foto-kevitra momba ny saha hita amin'ny fotoana inona, ary tsy misy hevitra momba ny fitetezana. Izany rehetra izany dia hipetraka any an-kafa. Form Component
manafatra { useForm, useWatch } avy amin'ny "react-hook-form"; import {zodResolver } avy amin'ny "@hookform/resolvers/zod";import {useMutation} avy amin'ny "@tanstack/react-query";import {useState, useMemo} avy amin'ny "react";import {formSchema, type FormData}
const STEPS = ["details", "order", "kaonty", "review"];
karazana OrderPayload = FormData & { subtotal: isa; hetra: isa; total: isa };
asa fanondranana RHFMultiStepForm() {const [dingana, setStep] = useState(0);
const mutation = useMutation({ mutationFn: async (vola: OrderPayload) => { const res = miandry fetch("/api/orders", { fomba: "POST", lohapejy: { "Content-Type": "application/json" }, vatana: JSON.stringify(payload), }); raha (!res.ok) manipy Error vaovao("Tsy nahomby"); miverina res.json(); }, });
const { Register, Control, HandSubmit, formState: { errors }, } = useForm
miverina (
);}Jereo ny Pen SurveyJS-03-RHF [forked] by sixthextinction. Be dia be ny zava-mitranga eto, ary ilaina ny miadana mba hahitana hoe aiza no niafarany.
Ny soatoavina azo avy amin'izany - subtotal, hetra, total - dia kajy ao amin'ny singa amin'ny alalan'ny useWatch sy useMemo satria miankina amin'ny sandan'ny sehatra mivantana ary tsy misy toerana voajanahary hafa ho azy ireo. Ny fitsipiky ny fahitana momba ny solonanarana, tenimiafina, positiveFeedback, ary improvementFeedback dia miaina ao amin'ny JSX ho fepetra an-tserasera. Ny lojikan'ny dingan-dava — ny pejin'ny famerenana dia tsy miseho raha tsy rehefa tontalin'ny >= 100 — dia tafiditra ao anatin'ny fari-piadidiana showSubmit sy ny fepetran'ny render amin'ny dingana faha-3. Ny Navigation mihitsy dia kaontera useState izay ampitomboinay amin'ny tanana. React Query dia mitantana ny famerenana indray, ny caching ary ny fanafoanana. Ny endrika dia miantso mutation.mutate miaraka amin'ny angona voamarina.
Tsy misy diso izany na iray aza. Mbola idiomatic React ihany ity, ary tena mahomby ilay singa noho ny fomba namerenan'ny RHF. Fa raha omenao olona tsy nanoratra izany ianao ary angataho izy ireo hanazava amin'ny toe-javatra miseho ny pejin'ny famerenana, dia tsy maintsy arahin'izy ireo amin'ny showSubmit, ny dingana faha-3, ary ny lojikan'ny bokotra nav — toerana telo misaraka — mba hananganana fitsipika iray izay azo nambara tamin'ny andalana iray. Ny endrika dia miasa, eny, fa ny fitondran-tena dia tsy tena azo jerena amin'ny maha-rafitra azy. Tsy maintsy tanterahina ara-tsaina. Ny tena zava-dehibe, ny fanovana azy dia mitaky fandraisana anjara amin'ny injeniera. Na dia kely aza, toy ny fanitsiana rehefa miseho ny dingana famerenana, dia midika hoe manova ny singa, manavao ny fanamarinana, manokatra fangatahana misintona, miandry ny famerenana ary mametraka indray. Fizarana 2: Mifototra amin'ny Schema (SurveyJS) Andeha isika hanangana fikoriana mitovy amin'ny fampiasana schema. Fametrahana npm install survey-core survey-react-ui @tanstack/react-query
survey-coreNy motera fampandehanana tsy miankina amin'ny sehatra misy lisansa MIT izay manome hery ny famandrihana endrika an'ny SurveyJS - ny ampahany izay karakaraintsika eto. Mila schema JSON izy io, manangana modely ao anatiny, ary mitantana izay rehetra mety hiaina ao amin'ny singa React anao: fanombantombanana ny fanehoana fahitana, fanaovana kajy ny soatoavina azo avy amin'ny fikajiana, fitantanana ny toetry ny pejy, fanaraha-maso ny fanamarinana, ary manapa-kevitra ny dikan'ny hoe "feno" nomena ny pejy tena naseho.
survey-react-ui Ny sosona UI / rendering izay mampifandray an'io modely io amin'ny React. Izy io dia singa
Izy ireo miaraka dia manome anao fampandehanana amin'ny endriny feno pejy maromaro tsy misy fanoratana andalana iray mifehy ny fikorianan'ny rivotra. Ny endrika schema dia, araka ny voalaza teo aloha, JSON fotsiny - tsy misy DSL na inona na inona. Azonao atao ny mampiditra azy io, manafatra azy avy amin'ny rakitra iray, maka azy amin'ny API, na mitahiry azy ao anaty tsanganana database ary manadio azy amin'ny fotoana fandehanana. Ny endrika mitovy, toy ny angona Ity misy endrika mitovy, amin'ity indray mitoraka ity dia aseho ho zavatra JSON. Ny skema dia mamaritra ny zava-drehetra: rafitra, fanamarinana, fitsipiky ny fahitana, kajy nalaina, fitetezana pejy - ary manolotra izany amin'ny Modely izay manombana izany amin'ny fotoana fandehanana. Toy izao ny endriny feno:
export const surveySchema = { title: "Order Flow", showProgressBar: "top", page: [ {name: "details", singa: [ {karazana: "text", anarana: "firstname", isRequired: true }, {karazana: "text", anarana: "mailaka", inputType: "mailaka", isRequired: true, type: "validator" }] } ] }, { anarana: "baiko", singa: [ { karazana: "soratra", anarana: "vidiny", inputType: "isa", defaultValue: 0 }, { karazana: "soratra", anarana: "habeny", inputType: "isa", defaultValue: 1 }, { karazana: "midina",anarana: "taxRate", defaultValue: 0.1, safidy: [{ value: 0.05, text: "5%" }, {value: 0.1, text: "10%" }, {value: 0.15, text: "15%" } ] }, {karazana: "expression", anarana: "{totality}": "expression", anarana: "tax", expression: "{subtotal} {taxRate}" }, {karazana: "expression", anarana: "total", expression: "{subtotal} + {tax}" } ] }, {name: "kaonty", singa: [ {karazana: "radiogroup", anarana: "manana kaonty", safidy: "Raha misy", "tsy misy anarana:" raha "Eny", "tsy misy anarana" "{hasAccount} = 'Eny'", isRequired: marina }, {karazana: "text", anarana: "password", inputType: "password", visibleIf: "{hasAccount} = 'Eny'", isRequired: marina, validators: [{ type: "text", minLength: 6, text: "Min 6 characters", {karazana 6 isa", {karazana 6 isa", {karazana: tarehintsoratra 6", {karazana: tarehintsoratra 6", {karazana: tarehintsoratra 6", }] 1, rateMax: 5 }, {karazana: "commentaire", anarana: "positiveFeedback", visibleIf: "{satisfaction} >= 4" }, {karazana: "comment", anarana: "improvementFeedback", visibleIf: "{satisfaction} <= 2" } ] }, {name: "review", >: [name: "{0}", >: ]};
Ampitahao amin'ny dikan-teny RHF mandritra ny fotoana fohy.
Lasa ny sakana superRefine izay mitaky ny solonanarana sy tenimiafina. visibleIf: "{hasAccount} = 'Eny'" miaraka amin'ny isRequired: ny true dia miara-miasa amin'ireo olana roa ireo, eo amin'ny saha, izay andrasanao hahitana azy ireo. Ny rojo useWatch + useMemo izay nanao kajy ny totalin'ny totalin'ny totalin'ny hetra, ny hetra ary ny totaliny dia nosoloina saha fitenenana telo izay mifampiresaka amin'ny anarana. Ny fepetran'ny pejy famerenana, izay ao amin'ny dikan-teny RHF dia tsy azo amboarina afa-tsy amin'ny alàlan'ny fanaraha-maso amin'ny showSubmit, ny sampana rendering dingana 3. Ary farany, ny lojikan'ny bokotra nav dia fananana iray hita ao amin'ny zavatra pejy.
Toy izany koa ny lojika. Soa ihany fa ny tetika dia manome azy toerana hipetrahana amin'ny toerana hita maso mitokana, fa tsy miparitaka manerana ny singa. Mariho koa fa ny skema dia mampiasa karazana: 'expression' ho an'ny subtotal, hetra, ary total. Ny teny dia vakiana fotsiny ary ampiasaina indrindra hanehoana sanda voaisa. Ny SurveyJS koa dia manohana karazana: 'html' ho an'ny votoaty static, fa ho an'ny soatoavina kajy, ny fitenenana no safidy tsara. Ankehitriny ho an'ny lafiny React. Famerenana sy fandefasana Tena tsotra. Wire onComplete amin'ny API-nao toy izany koa - amin'ny alalan'ny useMutation na tsotra:
manafatra { useState, useEffect, useRef } avy amin'ny "react";import {useMutation} avy amin'ny "@tanstack/react-query";import { Model } avy amin'ny "survey-core"; import { Survey } avy amin'ny "survey-react-ui";import "survey-core/survey-core.css";
asa fanondranana SurveyForm() {const [modely] = useState(() => Modely vaovao(surveySchema));
const mutation = useMutation({ mutationFn: async (data) => { const res = miandry fetch("/api/orders", { fomba: "POST", lohapejy: { "Content-Type": "application/json" }, vatana: JSON.stringify(data), }); raha (!res.ok) manipy Error vaovao("Tsy nahomby"); miverina res.json(); }, });
const mutationRef = useRef(mutation); mutationRef.current = mutation; useEffect(() => { const handler = (mpanefa) => mutationRef.current.mutate(sender.data);model.onComplete.add(handler);return () => model.onComplete.remove(handler); }, [modely]); // ref misoroka ny fisoratana anarana indray ny mpitantana isaky ny render (miovaova ny maha-izy azy)
miverina (
<>
Jereo ny Pen SurveyJS-03-SurveyJS [forked] by sixtheextinction.
onComplete mirehitra rehefa tonga amin'ny faran'ny pejy hita farany ny mpampiasa. Ka raha tsy miampita 100 mihitsy ny totaliny ary adino ny pejy famerenana, dia mbola mirehitra tsara izy io satria ny SurveyJS dia manombana ny fahitana alohan'ny hanapahana hevitra hoe inona no dikan'ny "pejy farany". Avy eo, ny sender.data dia mirakitra ny valiny rehetra miaraka amin'ny sanda kajy (subtotal, hetra, total) ho sahan'ny kilasy voalohany, noho izany dia mitovy amin'ny dikan-teny RHF nanangona tanana tao amin'ny onSubmit ny entana API. nyNy maodelin'ny mutationRef dia mitovy amin'izay ho tratrarinao na aiza na aiza ilanao mpitantana hetsika maharitra amin'ny sanda miova isaky ny render - tsy misy SurveyJS manokana momba izany.
Ny singa React dia tsy misy lojika fandraharahana intsony. Tsy misy fampiasanaWatch, tsy misy JSX misy fepetra, tsy misy counter counter, tsy misy rojo fampiasanaMemo, tsy misy superRefine. Ny React dia manao izay tena mahamety azy: mamadika singa iray ary mampifandray izany amin'ny antso API. Inona no niala tamin'ny React?
fiahiana RHF Stack SurveyJS Visibility JSX sampana visibleIf Soatoavina azo mampiasaWatch / useMemo fitenenana Fitsipika an-kianja superRefine Fepetra schema Fikarohana fanjakana dingana Pejy hita raha Fitsipika toerana Nozaraina manerana ny rakitra Hiverina any amin'ny schema
Ny mijanona ao amin'ny React dia ny fandrindrana, ny styling, ny fandefasana tariby, ary ny fampidirana fampiharana, izany hoe ny zavatra tena natao ho an'ny React. Ny zavatra hafa rehetra dia nifindra tao amin'ny schema, ary satria ny schema dia zavatra JSON fotsiny, dia azo tehirizina ao amin'ny angon-drakitra, nadika tsy miankina amin'ny kaody fampiharana anao, na ovaina amin'ny alàlan'ny fitaovana anatiny nefa tsy mila fametrahana. Ny mpitantana ny vokatra izay mila manova ny tokonam-baravarana izay manetsika ny pejy famerenana dia afaka manao izany tsy mikasika ilay singa. Fahasamihafana manan-danja eo amin'ny asa izany ho an'ny ekipa izay mivoatra matetika ny fitondran-tena ary tsy entin'ny injeniera foana. Rahoviana no hampiasaina ny fomba fiasa tsirairay? Ity misy fitsipika tsotra izay mety amiko: alaivo sary an-tsaina ny famafana tanteraka ny endrika. Inona no ho very?
Raha efijery izany dia mila endrika entin'ny singa ianao. Raha lojikan'ny fandraharahana, toy ny tokonam-baravarana, ny fitsipiky ny sampana, ary ny fepetra takiana izay mametraka fanapahan-kevitra tena izy, dia mila motera schema ianao.
Torak'izany koa, raha momba ny etikety, saha, ary firafitra ny fanovana ho avy aminao, dia hanompo anao tsara ny RHF. Raha mikasika ny fepetra, ny vokatra ary ny fitsipika mety ilain'ny ops na ny ekipanao ara-dalàna izy ireo amin'ny talata tolakandro nefa tsy mametraka tapakila, dia ny maodely schema miaraka amin'ny SurveyJS no mety kokoa. Ireo fomba roa ireo dia tsy tena mifaninana amin'ny tsirairay. Miresaka karazana olana samihafa izy ireo, ary ny fahadisoana tokony hialana dia ny tsy fitovian'ny abstraction amin'ny lanjan'ny lojika - ny fitondrana rafitra fitsipika ho toy ny singa iray satria io no fitaovana mahazatra, na mahatratra motera politika satria ny endrika iray dia nitombo ho dingana telo ary nahazo sehatra misy fepetra. Ny endrika natsanganay teto dia nipetraka teo akaikin'ny sisin-tany niniana, saro-takarina mba hampiharihary ny fahasamihafana fa tsy dia tafahoatra loatra ka toa ho voafitaka ny fampitahana. Ny ankamaroan'ny endrika tena izy izay nanjary tsy azo ampiasaina ao amin'ny codebase-nao dia mety mipetraka eo akaikin'io sisintany io ihany, ary ny fanontaniana dia matetika raha misy olona nanonona ny tena izy. Ampiasao ny React Hook Form + Zod rehefa:
Ny endrika dia mitodika amin'ny CRUD; Ny lojika dia marivo ary entin'ny UI; Ny injeniera dia manana ny fitondran-tena rehetra; Backend dia mijanona ho loharanon'ny fahamarinana.
Ampiasao ny SurveyJS rehefa:
Forms encode ny fanapahan-kevitra momba ny raharaham-barotra; Mivoatra tsy miankina amin'ny UI ny fitsipika; Ny lojika dia tokony ho hita, azo jerena, na misy dikan-teny; Ny tsy injeniera dia misy fiantraikany amin'ny fitondran-tena; Ny endrika mitovy dia tsy maintsy mandeha amin'ny frontend maro.