20 mar 2025·6 min czytania

Architektura formularzy we Vue 3 dla aplikacji biznesowych: wzorce wielokrotnego użytku

Architektura formularzy we Vue 3 dla aplikacji biznesowych: komponenty pól wielokrotnego użytku, czytelne reguły walidacji i praktyczne sposoby wyświetlania błędów serwera przy każdym polu.

Architektura formularzy we Vue 3 dla aplikacji biznesowych: wzorce wielokrotnego użytku

Dlaczego kod formularzy się rozpada w prawdziwych aplikacjach biznesowych

Formularz w aplikacji biznesowej rzadko pozostaje mały. Zaczyna się jako "tylko kilka pól", potem rozrasta się do kilkudziesięciu pól, sekcji warunkowych, uprawnień i reguł, które muszą być zgodne z logiką backendu. Po kilku zmianach produktu formularz nadal działa, ale kod zaczyna sprawiać wrażenie kruchego.

Architektura formularzy we Vue 3 ma znaczenie, ponieważ to właśnie tam kumulują się „szybkie poprawki”: jeszcze jeden watcher, jeszcze jeden specjalny przypadek, jeszcze skopiowany komponent. Działa dzisiaj, ale z czasem trudniej zaufać kodowi i go zmieniać.

Znaki ostrzegawcze są znajome: powtarzające się zachowania pól na różnych stronach (etykiety, formatowanie, znaczniki wymagane, podpowiedzi), niespójne umiejscowienie błędów, reguły walidacji rozproszone po komponentach oraz błędy z backendu sprowadzone do ogólnego powiadomienia typu toast, które nie mówi użytkownikowi, co poprawić.

Te niespójności to nie tylko kwestie stylu kodu. Przeradzają się w problemy UX: ludzie ponownie wysyłają formularze, rośnie liczba zgłoszeń do wsparcia, a zespoły unikają pracy z formularzami, bo coś może się zepsuć w ukrytym przypadku brzegowym.

Dobre podejście sprawia, że formularze są nudne — w najlepszym znaczeniu tego słowa. Przy przewidywalnej strukturze możesz dodawać pola, zmieniać reguły i obsługiwać odpowiedzi serwera bez przerabiania wszystkiego.

Potrzebujesz systemu formularzy, który zapewnia ponowne użycie (jedno pole zachowuje się tak samo wszędzie), przejrzystość (reguły i obsługa błędów łatwe do przeglądnięcia), przewidywalne zachowania (touched, dirty, reset, submit) oraz lepszy feedback (błędy po stronie serwera pojawiają się przy dokładnie tych polach, które wymagają uwagi). Poniższe wzorce skupiają się na komponentach pól do ponownego użycia, czytelnej walidacji i mapowaniu błędów serwera na konkretne pola.

Prosty model mentalny struktury formularza

Formularz, który przetrwa próbę czasu, to mały system z wyraźnymi częściami, a nie stos inputów.

Pomyśl w czterech warstwach, które komunikują się w jednym kierunku: UI zbiera dane, stan formularza je przechowuje, walidacja tłumaczy, co jest nie tak, a warstwa API ładuje i zapisuje.

Cztery warstwy (i co każda z nich kontroluje)

  • Komponent pola (Field UI component): renderuje input, etykietę, podpowiedź i tekst błędu. Emituje zmiany wartości.
  • Stan formularza: przechowuje wartości i błędy (oraz flagi touched i dirty).
  • Reguły walidacji: czyste funkcje, które czytają wartości i zwracają komunikaty o błędach.
  • Wywołania API: ładują dane początkowe, wysyłają zmiany i tłumaczą odpowiedzi serwera na błędy przypisane do pól.

To rozdzielenie utrzymuje zmiany w ryzach. Gdy pojawia się nowe wymaganie, aktualizujesz jedną warstwę, nie łamiąc pozostałych.

Co powinno być w polu, a co w formularzu nadrzędnym

Komponent pola wielokrotnego użytku powinien być nudny. Nie powinien znać Twojego API, modelu danych ani reguł walidacji. Ma tylko wyświetlać wartość i pokazywać błąd.

Formularz nadrzędny koordynuje resztę: które pola istnieją, gdzie przechowywane są wartości, kiedy walidować i jak wysyłać.

Prosta zasada pomaga: jeśli logika zależy od innych pól (np. "Województwo" jest wymagane tylko, gdy "Kraj" to US), trzymaj ją w formularzu nadrzędnym lub warstwie walidacji, nie w komponencie pola.

Gdy dodanie nowego pola jest naprawdę małym wysiłkiem, zwykle dotykasz tylko domyślnych wartości lub schematu, markup miejsca, gdzie pole się pojawia, i reguł walidacji dla pola. Jeśli dodanie jednego inputu wymusza zmiany w niepowiązanych komponentach, granice są niejasne.

Komponenty pól wielokrotnego użytku: co standaryzować

Gdy formularze rosną, najszybszy zysk to przestać budować każde pole jak jednorazowy przypadek. Komponenty pól powinny być przewidywalne. To sprawia, że są szybkie w użyciu i łatwe do sprawdzenia.

Praktyczny zestaw budulców:

  • BaseField: wrapper dla etykiety, podpowiedzi, tekstu błędu, odstępów i atrybutów dostępności.
  • Komponenty kontrolne: TextInput, SelectInput, DateInput, Checkbox itd. Każdy skupia się na kontrolce.
  • FormSection: grupuje powiązane pola z tytułem, krótką pomocą i spójnymi odstępami.

Dla propsów trzymaj mały zestaw i egzekwuj go wszędzie. Zmiana nazwy prop'a w 40 formularzach boli.

Te propriety zwykle się od razu zwracają:

  • modelValue i update:modelValue dla v-model
  • label
  • required
  • disabled
  • error (pojedyńczy komunikat lub tablica, jeśli wolisz)
  • hint

Sloty to miejsce, gdzie pozwalasz na elastyczność bez łamania spójności. Trzymaj układ BaseField stabilny, ale pozwól na małe wariacje, jak akcja po prawej stronie ("Wyślij kod") lub ikona po lewej. Jeśli wariacja pojawia się dwa razy, zrób zeń slot zamiast rozgałęziać komponent.

Standaryzuj kolejność renderowania (etykieta, kontrolka, podpowiedź, błąd). Użytkownicy skanują szybciej, testy są prostsze, a mapowanie błędów serwera staje się prostsze, bo każde pole ma jedno oczywiste miejsce do wyświetlania komunikatów.

Stan formularza: values, touched, dirty i reset

Większość błędów formularzy w aplikacjach biznesowych nie dotyczy inputów. Wynika ze rozproszonego stanu: wartości w jednym miejscu, błędy w innym i przycisk reset, który działa tylko w połowie. Czysta architektura formularza we Vue 3 zaczyna się od jednego spójnego kształtu stanu.

Po pierwsze, wybierz schemat nazewnictwa kluczy pól i trzymaj się go. Najprostsza zasada: klucz pola równa się kluczowi w payloadzie API. Jeśli Twój serwer oczekuje first_name, klucz formularza też powinien być first_name. Ta mała decyzja upraszcza walidację, zapisywanie i mapowanie błędów serwera.

Trzymaj stan formularza w jednym miejscu (composable, store Pinia lub komponencie rodzicu) i pozwól, aby każde pole czytało i zapisywało przez ten stan. Płaska struktura działa dla większości ekranów. Przechodź do zagnieżdżenia tylko, gdy API jest naprawdę zagnieżdżone.

const state = reactive({
  values: { first_name: '', last_name: '', email: '' },
  touched: { first_name: false, last_name: false, email: false },
  dirty: { first_name: false, last_name: false, email: false },
  errors: { first_name: '', last_name: '', email: '' },
  defaults: { first_name: '', last_name: '', email: '' }
})

Praktyczny sposób myślenia o flagach:

  • touched: czy użytkownik wszedł w interakcję z tym polem?
  • dirty: czy wartość różni się od wartości domyślnej (lub ostatnio zapisanej)?
  • errors: jaki komunikat użytkownik powinien teraz widzieć?
  • defaults: do czego resetujemy?

Zachowanie reset powinno być przewidywalne. Gdy ładujesz istniejący rekord, ustaw zarówno values, jak i defaults z tego samego źródła. Wtedy reset() może skopiować defaults z powrotem do values, wyczyścić touched, wyczyścić dirty i wyczyścić errors.

Przykład: formularz profilu klienta ładuje email z serwera. Jeśli użytkownik go edytuje, dirty.email staje się true. Jeśli kliknie Reset, email wróci do załadowanej wartości (a nie pustego ciągu), a ekran znów będzie wyglądał czysto.

Reguły walidacji, które pozostają czytelne

Spraw, by formularze znów były przewidywalne
Zbuduj produkcyjny przepływ formularzy ze spójnymi polami, walidacją i obsługą błędów serwera.
Wypróbuj AppMaster

Czytelna walidacja to nie tyle kwestia biblioteki, ile sposobu zapisu reguł. Jeśli możesz przejrzeć pole i zrozumieć jego reguły w kilka sekund, kod formularza pozostaje wygodny w utrzymaniu.

Wybierz styl reguł, którego się trzymajecie

Większość zespołów wybiera jeden z tych podejść:

  • Reguły przy polu (per-field rules): reguły żyją blisko użycia pola. Łatwe do szybkiego sprawdzenia, świetne dla małych i średnich formularzy.
  • Reguły w schemacie (schema-based rules): reguły w jednym obiekcie lub pliku. Dobre, gdy wiele ekranów współdzieli ten sam model.
  • Hybryda: proste reguły przy polach, współdzielone lub złożone reguły w centralnym schemacie.

Cokolwiek wybierzesz, trzymaj nazwy i komunikaty reguł przewidywalne. Kilka powszechnych reguł (required, length, format, range) bije długą listę jednorazowych helperów.

Pisz reguły jak proste zdania

Dobra reguła czyta się jak zdanie: "Email jest wymagany i musi wyglądać jak email." Unikaj sprytnych jednowierszowych konstrukcji, które ukrywają intencję.

Dla większości formularzy biznesowych zwracanie jednej wiadomości na pole na raz (pierwsze niepowodzenie) utrzymuje UI spokojnym i pomaga użytkownikom szybciej naprawiać błędy.

Częste reguły przyjazne dla użytkownika:

  • Required tylko wtedy, kiedy pole rzeczywiście musi być wypełnione.
  • Length z realistycznymi liczbami (np. 2 do 50 znaków).
  • Format dla emaila, telefonu, kodu pocztowego, bez nadmiernie restrykcyjnych regexów odrzucających prawdziwe dane.
  • Range typu "data nie w przyszłości" lub "ilość między 1 a 999."

Uczyń asynchroniczne sprawdzenia oczywistymi

Walidacja asynchroniczna (np. "nazwa użytkownika zajęta") robi się myląca, jeśli uruchamia się po cichu.

Wywołuj sprawdzenia po blur lub po krótkiej pauzie, pokazuj wyraźny stan "Sprawdzam..." i anuluj lub ignoruj przestarzałe żądania, gdy użytkownik dalej pisze.

Zdecyduj, kiedy walidacja ma się uruchamiać

Czas uruchamiania jest równie ważny co reguły. Przyjazne dla użytkownika ustawienie to:

  • On change dla pól, które korzystają z live feedback (np. siła hasła), ale rób to delikatnie.
  • On blur dla większości pól, aby użytkownik mógł pisać bez ciągłych błędów.
  • On submit dla całego formularza jako ostatnia linia obrony.

Mapowanie błędów serwera na właściwe pole

Utrzymaj czytelną walidację
Centralizuj reguły i procesy, aby zmiany produktowe nie rozrzucały poprawek po komponentach.
Wypróbuj teraz

Sprawdzanie po stronie klienta to tylko połowa historii. W aplikacjach biznesowych serwer odrzuca zapisy z powodów, których przeglądarka nie zna: duplikaty, sprawdzenia uprawnień, nieaktualne dane, zmiany stanu i więcej. Dobry UX formularza polega na zamienieniu tej odpowiedzi w jasne komunikaty obok właściwych inputów.

Znormalizuj błędy do jednego wewnętrznego kształtu

Backendy rzadko zgadzają się co do formatu błędów. Niektóre zwracają pojedynczy obiekt, inne listy, jeszcze inne zagnieżdżone mapy kluczy pól. Przekształć wszystko, co dostaniesz, do jednego wewnętrznego kształtu, który formularz potrafi wyrenderować.

// what your form code consumes
{
  fieldErrors: { "email": ["Already taken"], "address.street": ["Required"] },
  formErrors: ["You do not have permission to edit this customer"]
}

Utrzymaj kilka reguł:

  • Przechowuj błędy pól jako tablice (nawet jeśli jest tylko jedna wiadomość).
  • Konwertuj różne style ścieżek do jednego (kropkowa notacja działa dobrze: address.street).
  • Trzymaj błędy niezwiązane z polami oddzielnie jako formErrors.
  • Zachowaj surowy payload serwera do logów, ale go nie renderuj.

Mapuj ścieżki z serwera na klucze pól

Trik polega w dopasowaniu "ścieżki" serwera do kluczy w Twoim formularzu. Zdecyduj klucz każdego pola (np. email, profile.phone, contacts.0.type) i trzymaj go.

Następnie napisz mały mapper obsługujący typowe przypadki:

  • address.street (notacja kropkowa)
  • address[0].street (nawiasy dla tablic)
  • /address/street (styl JSON Pointer)

Po normalizacji, <Field name="address.street" /> powinien móc czytać fieldErrors["address.street"] bez wyjątków.

Wspieraj aliasy, gdy trzeba. Jeśli backend zwraca customer_email, a UI używa email, trzymaj mapowanie jak { customer_email: "email" } podczas normalizacji.

Błędy polowe, błędy formularza i fokusowanie

Nie każdy błąd należy do jednego pola. Jeśli serwer zwraca "Limit planu przekroczony" lub "Wymagana płatność", pokaż to ponad formularzem jako komunikat ogólny.

Dla błędów konkretnego pola pokaż wiadomość przy inpucie i poprowadź użytkownika do pierwszego problemu:

  • Po ustawieniu błędów serwera znajdź pierwszy klucz w fieldErrors, który istnieje na renderowanym formularzu.
  • Przewiń do niego i ustaw fokus (używając refa dla każdego pola i nextTick).
  • Wyczyść błędy serwera dla pola, gdy użytkownik zacznie je edytować ponownie.

Krok po kroku: jak połączyć architekturę w całość

Formularze pozostają spokojne, gdy wcześnie zdecydujesz, co należy do stanu formularza, UI, walidacji i API, a następnie połączysz je kilkoma małymi funkcjami.

Sekwencja, która działa w większości aplikacji biznesowych:

  • Zacznij od jednego modelu formularza i stabilnych kluczy pól. Te klucze stają się kontraktem między komponentami, walidatorami i błędami serwera.
  • Stwórz jeden wrapper BaseField dla etykiety, tekstu pomocy, znacznika "wymagane" i wyświetlania błędów. Trzymaj komponenty input małe i spójne.
  • Dodaj warstwę walidacji, którą można uruchomić per pole i zwalidować wszystko przy submit.
  • Wyślij do API. Jeśli się nie powiedzie, przetłumacz błędy serwera na { [fieldKey]: message }, aby właściwe pole pokazało odpowiedni komunikat.
  • Trzymaj obsługę sukcesu oddzielnie (reset, toast, nawigacja), aby nie przeciekała do komponentów i walidatorów.

Prosty punkt startowy dla stanu:

const values = reactive({ email: '', name: '', phone: '' })
const touched = reactive({ email: false, name: false, phone: false })
const errors = reactive({}) // { email: '...', name: '...' }

Twój BaseField otrzymuje label, error i ewentualnie touched i renderuje komunikat w jednym miejscu. Każdy komponent input tylko wiąże wartość i emituje aktualizacje.

Dla walidacji trzymaj reguły blisko modelu używając tych samych kluczy:

const rules = {
  email: v => (!v ? 'Email jest wymagany' : /@/.test(v) ? '' : 'Wprowadź poprawny adres email'),
  name: v => (v.length < 2 ? 'Imię jest za krótkie' : ''),
}

function validateAll() {
  Object.keys(rules).forEach(k => {
    const msg = rules[k](values[k])
    if (msg) errors[k] = msg
    else delete errors[k]
    touched[k] = true
  })
  return Object.keys(errors).length === 0
}

Kiedy serwer odpowie błędami, zmapuj je używając tych samych kluczy. Jeśli API zwraca { "field": "email", "message": "Already taken" }, ustaw errors.email = 'Already taken' i oznacz pole jako touched. Jeśli błąd jest globalny (np. "permission denied"), pokaż go ponad formularzem.

Scenariusz przykładowy: edycja profilu klienta

Umieść logikę w jednym miejscu
Użyj drag-and-drop do procesów biznesowych, by utrzymać logikę formularzy przejrzystą i łatwą do zmiany.
Twórz procesy

Wyobraź sobie ekran dla administratora, gdzie agent wsparcia edytuje profil klienta. Formularz ma cztery pola: name, email, phone i role (Customer, Manager, Admin). Jest mały, ale pokazuje typowe problemy.

Reguły po stronie klienta powinny być jasne:

  • Name: wymagane, minimalna długość.
  • Email: wymagany, poprawny format email.
  • Phone: opcjonalny, ale jeśli wypełniony, musi pasować do akceptowanego formatu.
  • Role: wymagane i czasami warunkowe (tylko użytkownicy z odpowiednimi uprawnieniami mogą przypisać Admin).

Spójny kontrakt komponentu pomaga: każde pole otrzymuje aktualną wartość, tekst błędu (jeśli jest) i kilka booleans jak touched i disabled. Etykiety, markery wymaganych pól, odstępy i styl błędów nie powinny być wymyślane na każdym ekranie od nowa.

Teraz przepływ UX. Agent edytuje email, przechodzi do następnego pola i widzi komunikat pod polem Email, jeśli format jest niepoprawny. Poprawia go, klika Zapisz, a serwer odpowiada:

  • email już istnieje: pokaż pod polem Email i ustaw fokus na to pole.
  • phone nieprawidłowy: pokaż pod Phone.
  • permission denied: pokaż komunikat ogólny nad formularzem.

Jeśli przechowujesz błędy w kluczach odpowiadających nazwom pól (email, phone, role), mapowanie jest proste. Błędy pól trafiają przy inputy, błędy formularza trafiają do dedykowanej sekcji wiadomości.

Typowe błędy i jak ich unikać

Standaryzuj UI pól
Zaprojektuj wspólne layouty pól raz, a potem używaj ich na wszystkich ekranach formularzy.
Buduj teraz

Trzymaj logikę w jednym miejscu

Kopiowanie reguł walidacji do każdego ekranu wydaje się szybkie, dopóki polityka nie się zmieni (reguły hasła, wymagane ID podatkowe, dozwolone domeny). Trzymaj reguły scentralizowane (schemat, plik z regułami, wspólna funkcja), a formularze korzystają z tego samego zestawu.

Unikaj też pozwalania niskopoziomowym inputom na zbyt wiele. Jeśli Twój <TextField> wie, jak wywołać API, ponawiać próby przy błędach i parsować payload błędu serwera, przestaje być wielokrotnego użytku. Komponenty pól mają renderować, emitować zmiany wartości i wyświetlać błędy. Wywołania API i logikę mapowania trzymaj w kontenerze formularza lub composable.

Symptomy mieszania odpowiedzialności:

  • Ten sam komunikat walidacji jest zapisywany w wielu miejscach.
  • Komponent pola importuje klienta API.
  • Zmiana jednego endpointu psuje kilka niepowiązanych formularzy.
  • Testy wymagają montowania połowy aplikacji, żeby sprawdzić jedno pole.

Pułapki UX i dostępności

Jedno ogólne powiadomienie „Coś poszło nie tak” to za mało. Ludzie muszą wiedzieć, które pole jest nieprawidłowe i co dalej robić. Użyj bannerów dla błędów globalnych (brak sieci, brak uprawnień), a błędy serwera mapuj do konkretnych inputów, żeby użytkownicy mogli szybko reagować.

Problemy z ładowaniem i podwójnym wysłaniem tworzą mylące stany. Przy submit:

  • zablokuj przycisk submit,
  • wyłącz pola, które nie powinny się zmieniać podczas zapisu,
  • pokaż wyraźny stan zajętości.

Upewnij się, że reset i anulowanie przywracają formularz do czystego stanu.

Podstawy dostępności, których łatwo pominąć:

  • Każde pole ma widoczną etykietę (nie tylko placeholder).
  • Błędy są powiązane z polami przy pomocy właściwych atrybutów aria.
  • Fokus przechodzi do pierwszego nieprawidłowego pola po submit.
  • Pola z disabled są naprawdę nieaktywne i poprawnie ogłaszane.
  • Nawigacja klawiaturą działa w całym formularzu.

Szybka lista kontrolna i kolejne kroki

Zanim wypuścisz nowy formularz, przejdź szybką listę kontrolną. To łapie drobne luki, które potrafią później generować zgłoszenia do wsparcia.

  • Czy każde pole ma stabilny klucz, który odpowiada payloadowi i odpowiedzi serwera (włącznie ze ścieżkami zagnieżdżonymi jak billing.address.zip)?
  • Czy możesz wyrenderować dowolne pole używając jednej spójnej API komponentu pola (wartość w, zdarzenia na zewnątrz, błąd i podpowiedź jako input)?
  • Przy submit: czy walidujesz raz, blokujesz podwójne submity i ustawiasz fokus na pierwszym nieprawidłowym polu, aby użytkownicy wiedzieli, od czego zacząć?
  • Czy potrafisz pokazać błędy we właściwym miejscu: przy polu (obok inputu) i na poziomie formularza (ogólny komunikat, gdy potrzeba)?
  • Po sukcesie: czy resetujesz stan poprawnie (values, touched, dirty), aby następna edycja zaczynała się czysto?

Jeśli na którekolwiek pytanie odpowiesz "nie", napraw to najpierw. Najczęstszy ból formularzy to niedopasowanie: nazwy pól odpływają od API albo błędy serwera wracają w kształcie, którego UI nie potrafi powiązać.

Jeśli budujesz narzędzia wewnętrzne i chcesz przyspieszyć, AppMaster (appmaster.io) stosuje te same fundamenty: utrzymuj spójne UI pól, centralizuj reguły i procesy oraz spraw, by odpowiedzi serwera pojawiały się tam, gdzie użytkownicy mogą na nie zareagować.

FAQ

Kiedy przestać tworzyć jednorazowe pola i przejść na komponenty pól wielokrotnego użytku?

Standaryzuj je, gdy zauważysz powtarzające się etykiety, podpowiedzi, oznaczenia "wymagane", odstępy i styl błędów na różnych stronach. Jeśli jedna „mała” zmiana oznacza edycję wielu plików, wspólny wrapper BaseField i kilka spójnych komponentów wejściowych szybko zaoszczędzą czas.

Jaką logikę umieszczać w komponencie pola, a co w komponencie rodzicu?

Pozostaw komponent pola prostym: renderuje etykietę, kontrolkę, podpowiedź i błąd oraz emituje aktualizacje wartości. Logikę zależną od wielu pól, reguły warunkowe i wszystko, co zależy od innych wartości, umieść w komponencie rodzica lub warstwie walidacji, aby pole pozostało wielokrotnego użytku.

Jak wybierać klucze pól, aby walidacja i mapowanie błędów serwera pozostały proste?

Używaj stabilnych kluczy, które domyślnie pasują do payloadu API, np. first_name lub billing.address.zip. Dzięki temu walidacja i mapowanie błędów serwera są proste, bo nie tłumaczysz nazw między warstwami.

Jakiego stanu formularza naprawdę potrzebuję (values, touched, dirty, defaults)?

Prosty domyślny kształt stanu to jeden obiekt trzymający values, errors, touched, dirty i defaults. Gdy wszystko czyta i zapisuje przez tę samą strukturę, reset i submit zachowują się przewidywalnie i unikasz błędów typu „pół-resetu”.

Jaki jest najczystszy sposób implementacji Reset w formularzu do edycji?

Ustaw values i defaults z tych samych załadowanych danych. Funkcja reset() powinna skopiować defaults z powrotem do values i wyczyścić touched, dirty i errors, tak aby UI wyglądał czysto i odpowiadał ostatnim danym z serwera.

Jak utrzymać czytelność reguł walidacji wraz ze wzrostem formularza?

Zacznij od reguł jako prostych funkcji indeksowanych tymi samymi kluczami pól co stan formularza. Zwracaj jedną, jasną wiadomość na pole (pierwsze niepowodzenie), aby UI pozostało spokojne, a użytkownik wiedział, co poprawić.

Kiedy powinna działać walidacja: on change, on blur czy on submit?

Waliduj większość pól na blur, a przy submit sprawdź wszystko jako ostateczną kontrolę. Używaj walidacji „on change” tylko tam, gdzie naprawdę pomaga (np. siła hasła), aby użytkownicy nie byli karani błędami podczas pisania.

Jak obsługiwać asynchroniczną walidację, np. „email już zajęty”, bez irytowania użytkowników?

Uruchamiaj asynchroniczne sprawdzenia po blur lub po krótkim debounce, pokazuj jasny stan „sprawdzam...” i anuluj/ignoruj przestarzałe żądania, aby wolne odpowiedzi nie nadpisywały nowszych danych i nie tworzyły mylących błędów.

Jaki jest najlepszy sposób normalizacji błędów po stronie serwera dla UI?

Znormalizuj każdy format backendu do jednej wewnętrznej struktury, np. { fieldErrors: { klucz: [wiadomości] }, formErrors: [wiadomości] }. Używaj jednego stylu ścieżek (kropkowa notacja działa dobrze), żeby pole address.street zawsze mogło czytać fieldErrors['address.street'] bez wyjątków.

Jak wyświetlać błędy i ustawić fokus na odpowiednim polu po submit?

Pokaż błędy globalne nad formularzem, a błędy polowe przy konkretnych inputach. Po nieudanym submit'cie ustaw fokus na pierwszym polu z błędem i usuń serwerowy błąd tego pola, gdy użytkownik zacznie je edytować ponownie.

Łatwy do uruchomienia
Stworzyć coś niesamowitego

Eksperymentuj z AppMaster z darmowym planem.
Kiedy będziesz gotowy, możesz wybrać odpowiednią subskrypcję.

Rozpocznij