Choć od dawna HTML5 udostępnia nam możliwość walidowania formularzy za pomocą atrybutów na polach takich jak required, min, max, minlength czy maxlength, to rozwiązanie rzadko kiedy jest wystarczające. Nie mamy chociażby możliwości stylowania popupu informującego o błędzie walidacji, nie możemy zmienić też tekstu błędu. Dodatkowo, wygląda on różnie w różnych przeglądarkach.
Co prawda, CSS dostarcza pseudoklasy związane z walidacją, opisane np tutaj: Styling Form Inputs in CSS With :required, :optional, :valid and invalid i na ich podstawie, budując skomplikowane selektory możnaby kolorować pola, wyświetlać użytkownikowi błędy itd jednak nadal potrzebujemy walidacji w JS choćby wtedy, gdy chcemy sprawdzić coś niestandardowego jak UUID.
Biblioteka Yup służy do budowania schematów walidacji obiektów oraz parsowania jednych obiektów na drugie. Choć naturalnym miejscem jej użycia są walidacje formularzy, nie jest do tego ograniczona – walidować i parsować można np dane z API backendowego, ponieważ Yup waliduje bezpośrednio obiekt z danymi, nie ma powiązania z np DOMem.
Zastosowanie biblioteki
Prosta walidacja true / false
Jeżeli interesuje nas tylko to, czy wartość przechodzi walidację czy nie, możemy użyć metody isValid.
Za pomocą tej metody możemy walidować zarówno proste wartości:
Funkcja isValid zwraca Promise, z wynikiem walidacji, w poście używana jest składnia async/await ponieważ wsparcie przeglądarek jest już wystarczające: https://caniuse.com/#search=await. Tak wygląda porównanie ze składnią klasyczną:
Jeżeli chcemy dostać szczegółową informację które pola mają błędy i jakie to są błędy, należy użyć metody validate. W przypadku gdy nie ma błędów zwróci ona obiekt który został przekazany.
Jeżeli występują błędy oraz przy założeniu że ustawimy opcję abortEarly na false aby wykonała się walidacja całego obiektu zamiast wyrzucać błąd przy pierwszym błędzie, zostanie rzucony błąd zawierający tablicę errors z tekstami błędów oraz tablicę inner, która zawierać będzie obiekty szczegółowo opisujące błąd:
Choć kod może wydać się nieco zawiły, robi prostą rzecz:
Mapowanie wyciąga z rozbudowanej struktury zwróconej przez bibliotekę pola które nas interesują, czyli nazwę pola oraz treść wiadomości
Reduce tworzy obiekt, którego kluczami są nazwy pól a wartościami treści wiadomości, tak by struktura ta dała się łatwo użyć przy wyświetlaniu wiadomości o błędzie
Rezultat wywołania tego kodu będzie następujący:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
{
name:"name must be at least 3 characters",
age:"age must be greater than or equal to 18"
}
{
name:"name must be at least 3 characters",
age:"age must be greater than or equal to 18"
}
{
name:"name must be at least 3 characters",
age:"age must be greater than or equal to 18"
}
Własne teksty dla błędów walidacji
Biblioteka Yup dostarcza predefiniowane wiadomości dla błędów, można je jednak zmienić:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
yup.setLocale({
string: {
min: 'Provide at least ${min} characters, please'
}
});
yup.setLocale({
string: {
min: 'Provide at least ${min} characters, please'
}
});
yup.setLocale({
string: {
min: 'Provide at least ${min} characters, please'
}
});
Nie musimy nadpisywać wszystkich tekstów – jeżeli nie podaliśmy wiadomości dla jakiegoś błędu, zostanie użyta wartość domyślna dostarczona przez bibliotekę. Efekt wywołania powyższego kodu po aktualizacji tekstów będzie następujący:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
{
name:"Provide at least 3 characters, please",
age:"age must be greater than or equal to 18"
}
{
name: "Provide at least 3 characters, please",
age: "age must be greater than or equal to 18"
}
{
name: "Provide at least 3 characters, please",
age: "age must be greater than or equal to 18"
}
Formularz ten zawiera dwa pola, name oraz age. Poza ustawianiem wartości gdy użytkownik coś wpisuje, czyszczone są również błędy formularza – jest to dość popularna praktyka.
Jeżeli walidacja nie rzuci żadnym błędem, wtedy dane są wyświetlane w okienku. Jeżeli natomiast poleci błąd, dane są przetwarzane na przyjaźniejszą postać oraz na ich podstawie wyświetlane są wiadomości dla użytkownika:
Biblioteka Yup w wydatny sposób pomoże nam z walidacją formularzy. Obsługa zagnieżdżeń uprości walidację skomplikowanych obiektów, przydatna jest też możliwość podmiany tekstów na własne.