Tema
/
Interneto svetainių kliento dalies kūrimas JS
📖 Teorija

Skausmo vaistas: subscribe ir notify

Prisimink 8 pamokos pabaigą. toggleFavorite turėjo perpiešti tris vaizdus ranka:

renderGallery(...);      // ♡ užpildymas
renderCollection();      // eilutė
renderHome();            // skaitiklis

O removeFromCollection pamiršo renderGallery() — ir ♡ liko užpildytas ant nuotraukos, kurios kolekcijoje jau nebuvo. Ekranas tyliai melavo. Ir esmė buvo ne neatidumas: struktūriškai kiekvienas veiksmas privalėjo žinoti visus vaizdus, o niekas to neužtikrino.

Štai vaistas. Vietoj to, kad veiksmas kviestų kiekvieną vaizdą, būsena paskelbia „aš pasikeičiau" vieną kartą, o vaizdai patys į tai reaguoja. Tai — pub/sub (publish/subscribe), o realizacija stebina savo mažumu:

const listeners = new Set();

export function subscribe(fn) {          // vaizdas: „praneškit man, kai pasikeis"
  listeners.add(fn);
  return () => listeners.delete(fn);     // grąžinam atsisakymo funkciją
}

function notify() {                       // veiksmas: „aš pakeičiau — atsinaujinkit"
  listeners.forEach(fn => fn(state));
}

Dabar toggleFavorite susitraukia iš trijų perpiešimų į vieną:

export function toggleFavorite(pic) {
  // ...pakeičiam favorites...
  persistFavorites();
  notify();                              // ← viskas. Vaizdai atsinaujina patys.
}

„Pamiršto perpiešimo" klaida tampa neįmanoma — nebėra ko pamiršti. Nauji veiksmai (removeFavorite, updateFavorite) tiesiog kvies notify() ir niekada neminės jokio vaizdo.

Antra tema — išsaugojimas. Mėgstamiausius laikysim localStorage: JSON.stringify rašant, JSON.parse skaitant. Bet localStorage gali nepavykti (sugadintas JSON, išsemta kvota, privatus naršymas jį išjungia visai), tad apsisaugosim — kad programa nelūžtų, o tik prarastų išsaugojimą.