Sledování návyků

Vítejte v poslední lekci kurzu Vue! V ní krok za krokem postavíte celou aplikaci: sledování návyků. Návyky jsou drobnosti, které chcete dělat každý den, třeba pít dost vody nebo chodit na procházky. Aplikace je vypíše a vy odškrtáte, co jste dnes splnili. Ukazatel průběhu vám ukáže, jak jste daleko, vlastní návyky můžete přidávat a ty, které nechcete, odebírat. A aplikace si všechno pamatuje, dokonce i to, kolik dní v řadě jste splnili všechno.

Využijete to, co jste se naučili v celém kurzu: komponenty s props a událostmi, data ze souboru, vypočítané hodnoty, formulář a composable. Každé cvičení navazuje tam, kde to předchozí skončilo (v editoru je kód, kterým předchozí cvičení skončilo), a přidává jeden kousek.

Plán. Návyky bydlí v App.vue, v refu s polem objektů. Každý návyk má vlastnosti id, nazev, ikona (emoji) a hotovo, která říká, jestli jste ho dnes splnili. Zobrazit jeden návyk má na starosti komponenta na druhé záložce, Navyk.vue. Návyk dostane v props a splněný návyk už umí přeškrtnout: k tomu slouží <li :class="{ hotovo: navyk.hotovo }"> a její <style scoped>.

Když návyk odškrtnete, komponenta Navyk ho sama nezmění. Návyky patří App.vue, a tak komponenta požádá rodiče událostí, stejně jako v lekci Události komponent. Zaškrtávací políčko ukazuje hodnotu pomocí :checked, a když na něj kliknete, obsluha jeho události change vyšle událost prepnout s id návyku:

<input type="checkbox" :checked="navyk.hotovo" @change="emit('prepnout', navyk.id)">

App.vue ji poslouchá pomocí @prepnout="prepni". Funkce prepni(id) najde návyk s tímto id a změní mu hotovo:

function prepni(id) {
    const navyk = navyky.value.find((polozka) => polozka.id === id);
    navyk.hotovo = !navyk.hotovo;
}

Metoda find() vrátí přímo objekt návyku, ne jeho kopii, takže změna jeho hotovo změní návyk v navyky. Vue pak upraví stránku a Navyk návyk přeškrtne. Data tak bydlí na jednom místě a mění se na jednom místě a komponenty je jen zobrazují.

Proč ne v-model="navyk.hotovo" jako v lekci Formuláře? Měnil by data rodiče zevnitř komponenty Navyk a ve větší aplikaci byste brzy nevěděli, kde všude se vaše data mění. Držte se toho, co ukázala lekce Události komponent: data žijí v App.vue a ke komponentě putují v props, a když je potřeba je změnit, komponenta o to požádá událostí.

Pokyny

  1. V App.vue pod existující import přidejte import komponenty (import Navyk from "./Navyk.vue";) a místo komentáře v ul pomocí ní zobrazte každý návyk: <Navyk v-for="navyk in navyky" :key="navyk.id" :navyk="navyk" />. Stránka ukáže tři návyky.

  2. V Navyk.vue přidejte pod defineProps řádek const emit = defineEmits(["prepnout"]); a na začátek prvku label vložte zaškrtávací políčko z ukázky. V App.vue napište pod navyky funkci prepni(id) z ukázky a ke komponentě Navyk přidejte @prepnout="prepni". Klikněte na návyk: přeškrtne se. Klikněte znovu a přeškrtnutí zmizí.