Tema
/
Interneto svetainių kliento dalies kūrimas JS

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() ir url() praleidžia tuščią reikšmę (if (!value) return null) — jie tikrina formatą, o privalomumą prideda required atskirai. Todėl „neprivalomas el. paštas, bet jei įrašytas — teisingas" yra tiesiog [email()], o privalomas — [required('Email'), email()].
  • url() naudoja new URL(value), ne regex. Naršyklė moka analizuoti URL geriau nei bet koks tavo šablonas; try/catch pagauna 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. validateFields palieka 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.