Oblíbené, které zůstanou
V lekci Vypočítané hodnoty a sledování jste ukládali data do localStorage pomocí watch a při spuštění aplikace jste je zase četli. Teď, když data načítáte i v onMounted, se vyplatí ujasnit si, co se čte kdy. Aplikace v tomto cvičení nechá zákazníka označit hvězdičkou oblíbené položky a watch je už ukládá. Chybí jejich čtení, a to stejně jako tehdy, hned při vytvoření refu:
const ulozene = localStorage.getItem("oblibene");
const oblibene = ref(ulozene === null ? [] : JSON.parse(ulozene));getItem() vrátí null, když ještě nic uložené není, a zákazník pak začne s prázdným polem. Jinak z uloženého textu udělá pole JSON.parse().
Proč je nečíst v onMounted jako nabídku? Protože localStorage odpoví hned, zatímco fetch() musí čekat na server. Není důvod čekat, a tak ho čtěte nahoře v <script setup>: když Vue poprvé ukáže stránku, hvězdičky už jsou správně.
Když se tato aplikace spustí, přicházejí její data ze tří míst a ve třech chvílích:
- co je uložené v prohlížeči: hned, když se komponenta vytváří,
- soubor
nabidka.json: chvíli poté, co se komponenta připojí, - zákazník: kdykoli klikne.
Vypočítaná hodnota z dat ze dvou míst je správná v každé chvíli. Názvy oblíbených položek vypočítané z nabidka a oblibene jsou zpočátku prázdné, přestože jejich id už aplikace zná, a objeví se, jakmile dorazí nabídka, a to bez jakéhokoli kódu navíc.
Typické chyby:
JSON.parse()bez kontrolynull:JSON.parse(null)vrátínull, a když šablona čteoblibene.includes(…), stránka skončí chybouTypeError: Cannot read properties of null (reading 'includes'). Vám to funguje, protože už máte něco uložené, ale každému novému zákazníkovi ne.- Uložení dřív než čtení: když ref začne jako
[]awatchs{ immediate: true }ho hned uloží, uložené oblíbené se přepíšou prázdným polem dřív, než si je cokoli přečte.
Jak psát:
Pokyny
- 1
Když se aplikace spustí, přečtěte uložené oblíbené položky a
oblibenenechte začít s nimi. Vyzkoušejte to: označte dvě položky hvězdičkou a klikněte na Spustit. Hvězdičky zůstanou. - 2
Pod nadpisem ukažte názvy oblíbených položek:
Vaše oblíbené: Cappuccino, Mrkvový dort. Vytvořte z nich vypočítanou hodnotu znabidkaaoblibenepomocífilter(),map()ajoin(", ")a odstavec ukažte, jen když je v ní aspoň jeden název.