js/validation.js — grynos taisyklės
Kodo stulpelyje — js/validation.js: taisyklės kaip grynos funkcijos. Kiekviena priima reikšmę ir grąžina klaidos tekstą arba null.
Atkreipk dėmesį į modelį — taisyklė yra funkcija, grąžinanti funkciją:
export const minLength = (n, label = 'This field') => (value) =>
value && value.length < n ? `${label} must be at least ${n} characters.` : null;
minLength(3, 'Username') grąžina taisyklę, paruoštą reikšmei. Todėl jas galima komponuoti į masyvą, o validateFields pereina visas ir grąžina pirmą klaidą kiekvienam laukui:
validateFields(
{ email: 'nope', name: '' },
{ email: [required('Email'), email()], name: [required('Name')] }
);
// → { email: 'Please enter a valid email address.', name: 'Name is required.' }
Dvi smulkmenos, kurios daug pasako:
email()irurl()praleidžia tuščią reikšmę (if (!value) return null) — jie tikrina formatą, o privalomumą pridedarequiredatskirai. Todėl „neprivalomas el. paštas, bet jei įrašytas — teisingas" yra tiesiog[email()], o privalomas —[required('Email'), email()].url()naudojanew URL(value), ne regex. Naršyklė moka analizuoti URL geriau nei bet koks tavo šablonas;try/catchpagauna netaisyklingus.
Šios funkcijos — visiškai atsietos nuo DOM. Jas gali testuoti be naršyklės (validateFields(...) grąžina objektą). Būtent todėl validacijos „smegenys" laikomos atskirai nuo formos „kūno" (kitas žingsnis).
Patarimas.
validateFieldspalieka tik pirmą klaidą kiekvienam laukui (break). Vartotojui geriau matyti „El. paštas privalomas", ištaisyti, tada „El. paštas neteisingas" — po vieną, nei visą sąrašą iš karto.