MVOP3 WBI
Bc. Matěj Cajthaml ©
Smíchovská střední průmyslová
škola a gymnázium
Tvorba takové stránky v čistém JS by bylo těžké.
Jaké je řešení?
Webové frameworky
Vue lze instalovat & používat jako Node.js balíček... to je zvláštní, ne?
Prozatím v .HTML souboru pomocí JS skriptu.
Vue používá jazyk velmi podobný HTML pro tvorbu šablon.
v-v-bindv-bind:smth se dává jméno atributu, kterému
bude nastavena hodnotav-bind:class, v-bind:style, ...
v-if
v-modelinput, textarea, select
Vytvořte webovou aplikace, ve které bude jeden input. Když do daného inputu napíšete Kočka, na stránce se zobrazí kočka. Když do něj napíšete pohádku, zobrazí se pohádka.
Při tvorbě cyklů je nutné nastavovat pomocí v-bind:key klíč jednotlivého předmětu — často index.
Proč?
data — data, které lze používat v šabloněcreated() — funkce, která se zavolá po tom, co je daná Vue
instance vytvořenamounted() — funkce, která se zavolá po tom, co se daná Vue
instance vykreslí do stránkydestroyed() — funkce, která se zavolá po tom, co se daná Vue
instance zrušíupdated() — funkce, která se zavolá po tom, co se něco ve Vue
instanci změní
e
Vytvořte Vue aplikaci na evidenci jmen koček. Jména koček budeme moci přidávat (musí být unikátní) a odebírat. Prazdné jméno nepůjde přidat.
Vytvořte Vue aplikaci na evidenci jmen koček. Jména koček budeme moci přidávat (musí být unikátní) a odebírat. Prazdné jméno nepůjde přidat.
Některé zápisy direktiv se často opakují a dlouhé názvy nejsou zrovna přehledné.
Místo v-bind:attr="value" můžeme psát :attr="value".
Místo v-on:event="fnc" můžeme psát @event="fnc".
Upravte práci ze začátku hodiny Otázky tak, aby:
Proč jsme začali využívat Vue?
npm create vite@latestnpm installCo znamená sestavit projekt?
package.json i node_modules
index.htmlpublic/src/src/assetssrc/componentssrc/App.vuesrc/main.js.vuetemplate, script a nepovinně
styleMůžeme tedy definovat data, methods, mounted a další.
componentsimport JmenoKomponenty from './JmenoKomponenty.vue'
<JmenoKomponenty></JmenoKomponenty>
dev — spuštění (development)npm run devbuild — sestavenínpm run builddist.vue tag style vedle tagů
template a scriptscoped
props — vlastnostiString, Number, Object
computed — vypočítané proměnnéformátovací proměnné, když nechceme upravovat předešlé data
Společně si vyzkoušíme, jak se dá použít TypeScript ve Vue.
Jak předáme data z rodičovské komponenty do potomka?
props
props
Jak předáme data z potomka do rodičovské komponenty?
.$emit(name, data)v-on:name nebo @name zachytit naší událost pojmenovanou name
Hodí se události i na jiné věci než předávání si informací?
Jaké jsou nevýhody tohoto systému?
Nutné: použití komponent, událostí k předávání informací o notifikaci
Jak předáme data z potomka do rodičovské komponenty?
Příště: kompozice a lepší systém k ukládání dat ve velkých aplikacích.
$emit(name, data)@name="fnc()"Jaký problém má tento způsob předávání dat?
data, methods, ...)setup<script setup>
V dokumentaci Vue najdete všechny stránky přeložené
do Composion API.
Díky dobré rozšiřitelnosti komponent vznikl různé projekty s různými komponenty pro Composion API, jako je např. VueUse.
Pomocí Vue 3 a Composition API vytvořte formulář pro přidávání blogových příspěvků a jejich zobrazení.
Jaký je rozdíl mezí ref a reactive v Composition API?
Options API zůstává ve Vue a neplánuje se odstraňovat.
Jaké jsou nevýhody systému Options API?
Často kombinujeme Composition API s Options API, proč?
Jakými způsoby můžeme v komponentě uchovávat data?
app.use(createPinia())/stores/store
setupstore
Tento store může používat jakákoliv komponenta.
npm create vite@latestnpm a vlastně konfigurujemePředěláme úkol Logování do Vuexu.
Co máme ve Pinia ukládat?
Co nemáme ve Pinia ukládat?
Uloží se data, když se znova přenačte stránka?
Lze řešit problém předávání dat mezi komponentami jednodušeji?
Příště vícestránkové aplikace!
watchersNa co by se mohli sledovače hodit?
Kde na svém portálu používám sledovače?
sassstále můžeme využívat scoped
Problém v SASS: v komponentách se špatně hledají soubory na importování.
assets si můžeme vytvořit SASS souborymain.js
Zkuste si ve Vue zapnout SASS a vytvořit si základní strukturu. Tedy, soubor na proměnné, jednotlivé komponenty či sekce. Společně soubory nalinkujte a zapněte. Vaše styly otestujte.
style<template> pomocí v-bind
views/router/index.jsmain.jsrouter/index.js
router-viewApp.vue si můžeme představit jako obal na celou stránkuCo se tedy v App.vue má nacházet?
router-link
Jak se tyto zápisy liší?
Co se stane, když je parametr definován ale nepošleme ho?
this.$router — samotný router, nastavení, přesměrování, ...this.$route — aktuální stránka (routa)this.$route.params (objekt) můžeme číst jednotlivé parametryuseRoute a useRouterthis.$router.push(data) můžeme přesměrovat stránku/user/1{ name: "user", params: { id: 1 }}this.$router.replacethis.$router.goHistory modes)
#, např. #/user/1/profile/, např. /user/1/profileNormální
mód potřebuje další nastavení serveru, které například není možné.
Když klikneme na odkaz z Routeru, přenačte se stránka odznova?
Jak si lze mezi jednotlivým stránkami předávat data?
Vytvořte (použijte) projekt, ve kterém bude jedna stránka (routa) s jedním parametrem. Do komponenty stránky přidejte jeden text (hodnota parametru) a dvě tlačítka, kde každé bude ukazovat na aktuální stránku ale s různými parametry.
Co se stane, když budeme klikat na tlačítka? Bude se daná komponenta znovu vytvářet?
Jak lze upravit komponentu, aby reagovala na změny?
router-viewroutes/index.js v childrenKde se tyto vnořené routy hodí?
DOM ve Vue nepoužíváme. Proč?
.vue nejsou v prohlížeči zobrazitelnénpm run dev nám při změně naší aplikaci sestaví znovunpm run buildpublic/index.html s odkazy na JS balíčky
Sestavená aplikace neobsahuje nepoužíváne assety a celkově věci pro development.
Když aplikaci sestavíme, Vue automaticky počítá, že se bude nacházet na hlavní složce domény
— https://smth.cz/. Toto chování lze změnit.
V hlavní složce založíte soubor vue.config.js ve kterém nastavíte následující:
Pokud používáte vue-router a máte nastavený jiný mód než hash, je
nutné nastavit správně server, aby Vaše požadavky uměl zpracovat.
Mód history je modernější a lepší pro SEO. Na mém hostingu či na GitHub Pages to
nelze nastavit.
Děkuji za pozornost!