od Podstaw
7 godz. 6 min · Vue.js · Full-stack i Programowanie
Piotr PalarzWeb DeveloperAby zacząć korzystać z Vue, wystarczy dodać do strony jeden element <script> i zacząć rozszerzać HTML o nowe możliwości prezentacji danych, które w całości kontrolujemy z poziomu kodu JavaScript. Najlepsze jest jednak to, że gdy dane się zmienią, Vue odzwierciedli wszystkie zmiany na stronie. Koniec zatem z odwoływaniem się z poziomu kodu JavaScript do elementów z drzewa DOM i "ręczną" ich manipulacją!Czy łatwość użycia Vue oznacza, że jest to framework prosty i nienadający się do budowania ambitnych aplikacji internetowych? Absolutnie nie! Jeżeli potrafisz korzystać z workflow opartego na webpacku, znasz nową składnię ES6 i chcesz swoje projekty dzielić na wiele uporządkowanych plików - możesz w ten sposób pracować. Jeśli jednak przy innych frameworkach przytłoczyły Cię wszystkie dodatkowe narzędzia i nie potrafiłeś się skupić na najważniejszym, czyli poznawaniu frameworka, to tutaj tego problemu nie doświadczysz.
W kursie tym krok po kroku poznasz ten lekki, acz potężny framework. Zaczniemy od instalcji i obowiązkowego projektu "Hello World!". Dowiesz się czym jest "Virtual DOM" i dlaczego Vue z niego korzysta. Następnie zobaczysz jak kontrolować wybraną część strony internetowej za pomocą metod, właściwości i dynamicznych atrybutów. Aby zrozumieć reaktywność Vue, przyjrzymy się konstrukcjom języka JavaScript, które ją umożliwiają.
Aby aplikacja mogła być interaktywna, nie może być obojętna na działania użytkownika. Z tego powodu zobaczysz, jak przypisywać obsługę zdarzeń, takich jak np. kliknięcie, jak do funkcji przekazywać parametry oraz jak korzystać z natywnego obiektu Event. Nie zabraknie również informacji o tym, jak modyfikować obsługę zdarzeń tak, by np. przechwycić jednoczesne wciśnięcie wybranej kombinacji klawiszy.Jak się przekonasz, dyrektywy Vue pozwolą Ci na manipulację nie tylko zachowaniem, ale i wyglądem elementów HTML. Omówimy dokładnie jak kontrolować przypisywane klasy CSS, a także liniowe style. Wszystko to oczywiście na praktycznych przykładach! Poznasz również sposoby warunkowego wyświetlania elementów, a także iteracji. Już na tym etapie będziesz gotowy do stworzenia swojego pierwszego, praktycznego projektu. Będzie do Counter, a zatem licznik odliczający od 10 do 0. Jeśli kiedykolwiek korzystałeś z biblioteki jQuery, zobaczysz totalnie inne podejście - proste i czytelne.
W jednym z rozdziałów kursu omówimy dokładnie techniki pracy z formularzami. Zobaczysz jak przechwytywać wpisywane przez użytkownika dane, na wszystkich rodzajach pól, jakie oferuje język HTML. Abyś wszystko jak najlepiej zrozumiał, spróbujemy wspólnie zaimplementować tzw. dwukierunkowe wiązanie danych, które Vue oferuje za pomocą jednej dyrektywy.Z kursu dowiesz się także czym są oraz jak tworzyć własne filtry, jak odwoływać się do elementów z drzewa DOM, gdy jest to konieczne, a także co oferują nam własne dyrektywy.
Jedną z największych zalet frameworka Vue.js jest możliwość tworzenia komponentów. Są to własne elementy HTML, które możemy umieszczać w wybranych miejscach naszej aplikacji. Element taki to jednak nie tylko wygląd, który definiujemy za pomocą szablonu, ale także (a może i przede wszystkim) logika, kontrolowana z poziomu kodu JavaScript.Zobaczysz jak zarejestrować własny komponent lokalnie oraz globalnie, jak sprawić, aby był reużywalny, przyjmując różne dane oraz jak komunikować się pomiędzy komponentami, by aplikacja pozostawała w synchronizacji. W tym celu omówimy dwa kierunki komunikacji, najpierw rodzic-dziecko, a później dziecko-rodzic. Na tym etapie wykonamy bardzo ciekawy, praktyczny projekt. Będzie to tabela napędzana danymi. Każdy wiesz tabeli prezentował będzie dane jednej osoby, a kliknięcie ikony kosza pozwoli na jej usunięcie. Ikona edycji zaś, zamieni wiesz w pola input, za pomocą których zaktualizujemy dane. W projekcie tym wykorzystamy niemal całą wcześniej zdobytą wiedzę!
Vue.js oferuje możliwość animowania elementów, kiedy są one pokazywane lub ukrywane. I omówienia tego tematu nie mogło również zabraknąć w tym kursie. Poznasz sposoby na animowanie elementów w użyciem CSS, zobaczysz jak animować podmianę jednego komponentu na drugi, a także jak uzyskać taki efekt dla listy elementów. Mając już wiedzę z zakresu tworzenia własnych komponentów, stworzymy wspólnie element, który pozwoli na animację innych, zawartych w nim elementów. W tym celu zintegrujemy nasz komponent z biblioteką animate.css.
Przez większą część kursu pracować będziemy pisząc kod JavaScript w standardzie ES5, a więc tym najpopularniejszym. Nie będziemy również korzystać z żadnych skomplikowanych narzędzi. Wszystko to po to, abyś mógł jak najlepiej zrozumieć sedno Vue.js, a nie zastanawiać się, który zapis jest specyficzny dla tego frameworka, a który to część nowego standardu JavaScript lub syntactic sugar dodany przez narzędzie uruchamiane z poziomu terminala.Nie oznacza to jednak, że z Vue nie da się pracować w sposób nowoczesny! Oczywiście jest taka możliwość i doskonale się o tym przekonasz. W jednym z rozdziałów kursu omówimy narzędzie vue-cli, które pozwoli nam przygotować startowy projekt nowej aplikacji, a także środowisko skonfigurowane z użyciem webpack'a, które umożliwi nam wydajną pracę. Na tym etapie zobaczysz, że komponentu Vue można tworzyć w zupełnie oddzielnych plikach z rozszerzeniem .vue, gdzie umieścimy zarówno szablon jak i logikę komponentu, a także (opcjonalnie) jego style CSS.Kurs ten zwieńczymy stworzeniem nowoczesnej aplikacji, wykorzystując najnowszy zapis ES6 i workflow stworzony z użyciem vue-cli. Projektem tym będzie Slideshow, a więc galeria zdjęć. Stworzymy od podstaw kilka komponentów, dodamy własny preloader obrazów, a także możliwość pobierania listy obrazów z serwera. Do tego celu wykorzystamy popularną bibliotekę axios, która umożliwia łatwe wykonywanie zapytań HTTP. Pod koniec dodamy do naszej aplikacji również routing, aby na pasku adresu odzwierciedlać aktualnie wyświetlany obraz, a także umożliwić nawigację za pomocą przycisków "Wstecz" i "Do przodu" dostępnych w przeglądarce internetowej. To zadanie ułatwi nam bardzo popularny plugin dla Vue, który nazywa się vue-router. Zobaczysz jak go zainstalować, a także skonfigurować. Następnie omówimy dynamiczne parametry, które odczytamy w komponencie. Finalnie zaktualizujemy adres URL z poziomu kodu JavaScript.Ostatnim krokiem jaki wykonamy, będzie stworzenie builda produkcyjnego naszej aplikacji, który gotowy będzie do na stronę internetową.
Kurs ten jest dla wszystkich osób, które znają już język JavaScript i sposoby na pracę z Obiektowym Modelem Dokumentu. Aby go rozpocząć, nie jest wymagana znajomość innych frameworków, ale taka wiedza na pewno nie zaszkodzi, a pomoże lepiej zrozumieć te zagadnienia, które są dla nich wspólne. Nie jest również wymagana wiedza z zakresu EcmaScript 6 czy webpack'a, lecz na pewno będzie pomocna w ostatim rozdziale tego kursu. Nieważne zatem czy Vue.js będzie pierwszym frameworkiem, który poznasz, czy będzie to odskocznia od React'a czy Angulara - na pewno to narzędzie Cię zaskoczy!
Vue.js 2.5.x
Kontynuujemy temat komponentów i chciałbym ci w tej lekcji pokazać w jaki
sposób można je troszeczkę zcustomizować, czyli chciałbym móc się osadzać
tak jak tutaj to zrobiłem, ale żeby każdy się zachowywał troszeczkę inaczej albo po
prostu posiadał troszkę inne dane, bo komponenty możesz stworzyć dowolne
to może być jakaś lista. To może być jakiś komponent generujący tabelę, ale może
chciałbyś żeby każdy z nich otrzymywał inne dane. Na początek w naszym kantorze chciałbym
zrobić coś takiego, żeby na przykład ten counter odliczał od dziesięciu a ten od 5.
Czyli mam jakieś reużywalny komponent. Bardzo łatwo mogę go osadzać w taki
sposób, co ważne mógłbym go w pętli v-for też wyświetlać przekazywać mu unikalne
dane to wszystko co do tej pory widziałeś na normalnych elementach, zadziała
też tutaj. Natomiast na początek pokażę ci jak przekazać tak zwane prop,
więc chciałbym do tego komponentu przekazać init value, żeby
to zrobić musimy do komponentu dodać i init value. Może
to być oczywiście dowolna nazwa tego oto atrybutu i jeżeli tutaj przekażę
to zostanie to przekazana do tego komponentu. Natomiast będzie to
przekazane jako string. Jeżeli chcę, żeby to była liczba, to muszę
skorzystać z bindowania tak jak to robiliśmy do tej pory i wtedy, jeżeli przekazuje liczbę
jest to traktowane jako wyrażenie JavaScript'owe. Będzie to przekazane jako number. Jeżeli
binduje to też wtedy mógłbym zrobić init value i z naszej głównej aplikacji, gdybyśmy
tutaj w data mieli limit value. Zostałoby to przekazane, czyli na razie nic o czym
byś nie wiedział. Natomiast warto wiedzieć, że jeżeli nie zbindujemy tylko przekażemy dosłownie,
to wtedy 10 będzie stringiem. Dlatego chcę to zrobić w ten sposób i również
na tym drugim komponencie chciałbym przekazać init value jako
wartość 5 i teraz pytanie brzmi w jaki sposób wewnątrz naszego
komponentu. W jego logice odebrać sobie tą wartość i odpowiednią przypisać
przejdziemy sobie tutaj gdzie tworzymy nasz komponent i mamy teemplate, mamy data
i tak dalej, ale oprócz tego możemy podać tablicę props i
ona jest bardzo ważna, bo jeżeli tego nie zrobimy, to nie będzie błędy, ale
to co jest tutaj nie zostanie w żaden sposób zinterpretowane wewnątrz. Więc
wewnątrz komponentu musimy powiedzieć jakie propsy można do niego przekazywać.
Dlatego ja tutaj napiszę init value. Można to zapisać w ten
sposób, mimo tego, że tutaj zrobiłem z pauzą i dlaczego zrobiłem z pauzą. Bo
jesteśmy tutaj w obiektowym modelu dokumentu i mamy pewnego
rodzaju ograniczenia. Między innymi takie, że jeżeli
zapiszemy atrybut w ten sposób, to on będzie i tak potraktowany jako lowercase
i jeżeli tutaj będę chciał go odebrać w ten sposób to mi to
nie zadziała, a jeżeli go zapiszemy z pauzą u góry to
tutaj init value możemy odczytać w taki oto sposób i zostanie do poprawnie przypisane. Tych
ograniczeń nie ma. Jeżeli to co mamy w tym miejscu nie byłoby na żywo w drzewie DOM, ale
byłoby templatką jakiegoś innego komponentu, czyli jak na przykład tutaj lub
jeżeli app, która jest w tym miejscu miałby swoją templatkę nie na
żywo w drzewie DOM, ale na przykład w tag'u script czy właśnie tak jak ci pokazywałem
wcześniej w przypadku aplikacji również w template, tak jak w komponentach to działa
i jeśli jednak jesteśmy na żywo w drzewie DOM, musimy to zapisywać
w takiej notatki kebab-case to się nazywa, czyli małymi literami i z
pauzami, a wewnątrz komponentu można to odczytać w ten sposób, usuwając
pauzę, powiększając kolejną literę, czyli
jest po prostu notacja Camel Case i teraz pytanie.
Jeżeli zrobimy coś takiego, gdzie mogę tutaj wewnątrz odczytać init value czy powinienem
podać to data? Nie, okazuje się że init value będzie od razu do nas dostępne
poprzez this init value, dokładnie tak samo jak byśmy dodali tutaj to data, więc
możemy sobie z tego skorzystać. Tylko chciałbym teraz
do naszego counter'a przypisać to init value, więc jak
możemy to zrobić. Sposoby są dwa. Możemy skorzystać z lifecycle hook'a, created, czyli
kiedy ten komponent zostanie utworzony to możemy powiedzieć discounter równa
się this init value, czyli to przekazane przez parametr i wtedy
ten Counter zostanie już ustawiony nie na wartość 10 jak to zrobiliśmy tutaj, ale
na wartość jaka została przekazana. Okej tylko, że później na końcu.
Być może pamiętasz kiedy zakończyło się to nasze odliczanie to
chciałem zresetować counter na początkową wartość więc będę musiał tutaj
już nie przepisywać na sztywno 10, ale this init value, czyli
tą wartość początkową. Zobaczymy czy ma to sens, odświeżam
i jak widzisz teraz nam to zadziałało poprawnie. To gdzie przekazaliśmy 10
jest 10, a tutaj 5 i one mają tak jak ci wspominałem w lekcji poprzedniej izolowany
zakres, izolowany scope, więc każdy ma swoją wartość counter i będzie
to działać ten sposób, czyli stworzyliśmy sobie komponenty, które mogą być w ten
sposób reużywalne i mogą mieć unikalne dane. Jak widzisz tak
to działa. Natomiast jest jeszcze inny sposób na to, żeby do counter przypisać
init value. Nie musimy tego robić tutaj, bo z uwagi na fakt, że data
jest funkcją, a nie tak jak mieliśmy w przypadku aplikacji tutaj bezpośrednio obiektem,
to w takiej funkcji już mogę skorzystać z this, dlatego counter mogę ustawić na this init value
bezpośrednio w tym miejscu, na aplikacji by nam to nie zadziałało, ale tutaj ta funkcja
jest wykonywana później kiedy ten obiekt jest już utworzony, a więc this poprawnie na
niego kieruje i po odśnieżeniu będzie to działać dokładnie w taki sam sposób. Co
ważne takich propsów możesz przekazywać, więcej i jeżeli je tutaj przekażesz to
oczywiście musisz je też tutaj zarejestrować w tej tablicy i wtedy bez problemu
będziesz mógł z nich korzystać w tym miejscu. Natomiast na tym będziemy się jeszcze skupiać w kolejnych
lekcjach.