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
Okej, jesteśmy w kolejnej lekcji i tutaj znajoma
już dla nas aplikacja, czyli counter, który przygotowaliśmy wcześniej. Będę chciał go
przepisać z użyciem tego nowoczesnego workflow i pokażę ci jak możemy to
zrobić i że rzeczywiście ma to wiele swoich zalet. Sprawdźmy czy tylko
to wszystko działa, okazuje się że jak najbardziej jest w porządku, więc
mamy to wszystko w jednym pliku. Ja chcę przejść teraz do katalogu
52 i tutaj wykonaj u siebie Vue init webpack
lub skorzystaj z plików źródłowych do tego kursu. Ja już to zrobiłem i tutaj do tego katalogu
skopiowałem właśnie ten conter żebyśmy się mogli nim posiłkować, więc pozostało
nam uruchomić npm run dev, żeby uruchomić serwer i powinno
to wszystko tutaj się skompilować i tutaj możemy odświeżyć. Mamy tę startową
aplikację. Natomiast ja będę chciał się jej teraz pozbyć, przejdźmy do katalogu 52
i od razu sobie usuniemy część rzeczy, assets jest nam
zbędne. Chcę usunąć wszystko to co będzie nam po prostu przeszkadzać, components
Hello World usuwam okej i mamy
tutaj app. Będę chciał Większość rzeczy tutaj usunąć, w zasadzie usunę
wszystko. Zmienię sobie tutaj tylko indentację na
4 spacje, okej i mamy tutaj main i jeszcze
jedna rzecz, o której ci nie powiedziałem w lekcji poprzedniej, bo być może zastanawiasz się
gdzie jest jakiś główny plik html'owy, do którego to wszystko jest wczytywane, bo tutaj
ta główna aplikacja ten główny plik mówi, że jego elementem
w drzewie DOM będzie app i pytanie gdzie to jest. Jest tutaj główny plik w tym
katalogu index.html i tutaj właśnie to app będzie podmienione. Co
ważne cały ten div, on będzie podmieniony, a nie do niego będzie coś wstawiane. W tym
miejscu zostaną przez webpack'a automatycznie załadowane skrypty, tutaj style
i tak dalej, więc nie musimy się tym martwić, ale ten plik możemy sobie oczywiście zmodyfikować.
No i ja chciałbym to teraz zrobić. Przejdziemy sobie do naszego counter'a. Tutaj
mamy cały nasz kod. Style pozostawię w ten sposób, nie będziemy
z użyciem webpack'a ich importować, okej. Skopiuję
to wszystko i wstawiam do pliku index, w to miejsce. Natomiast
teraz będę chciał się sukcesywnie pozbywać pewnych rzeczy. Po
pierwsze nie potrzebujemy skryptu Vue, bo on jest zainstalowany dla nas z użyciem npm
już automatycznie. Reszta może tutaj pozostać, zmienimy sobie tylko nazwę
na 52 i będziemy chcieli się powoli pozbywać tych rzeczy,
czyli naszą templatką dla aplikacji było wszystko to co widzisz w tym
miejscu, czyli w zasadzie teraz ja chciałbym to wyciąć, a wstawimy
sobie tutaj tylko div'a app, bo on jest konieczny po to, że kiedy
webpack-dev-server to wszystko uruchomi i to do tego div'a app zostanie
wczytane właśnie to, co jest z tym miejscu, czyli wyrenderowana templatka zaimportowana
z pliku app, który jest tutaj, ale ważne żebyśmy na stronie w tym
pliku mieli właśnie id, czyli Vue będzie kontrolować wszystko, co będzie w tym elemencie, więc
przejdźmy do tego app, tutaj i od podstaw pokażę ci,
jak tworzy się takie jednoplikowe komponenty. Po pierwsze tworzymy element template i
w nim będziemy stawiać wszystko. Drugim elementem będzie script, gdzie będzie
logika i możemy stworzyć jeszcze style, ale style nie będą nam na razie potrzebne. Jeszcze
będziemy później z nich korzystać, ale na razie nie i całą logikę czy
całą templatkę naszej aplikacji wklejam w to miejsce, okej i tutaj
nie ma znaczenia, że identyfikator to też jest app, a że drugi jest taki na stronie, bo
to zostanie w całości zamienione, ale tutaj nie musi być app. Możesz to nazwać jak tylko chcesz,
może tutaj w ogóle nie być identyfikatora. Pamiętaj jednak, że w templatce musi być
jeden root element, czyli ten musi być jeden, nie moglibyśmy mieć obok
siebie form tych br'ek i edu counter. Okej, czyli coś tutaj już
powiedzmy ma sens. Wstawiliśmy sobie to w to miejsce, ale jak zapisze
to będzie nam generowało masę błędów, jeżeli tutaj spróbujemy odświeżyć. Vue nam te
błędy pokazuje, oczywiście tutaj z Vue w wersji developmenckiej, więc wszystkie błędy
są wyświetlane. Natomiast błędy pewnie się domyślasz skąd się biorą. Nie
mamy tutaj init value, nie mamy wielu innych rzeczy, bo musimy sobie je dodać, więc
jak to zrobić. Przejdźmy do tego miejsca, gdzie była główna aplikacja, to jest
ta instancja i spróbujmy wszystko stąd skopiować, a tutaj
usuniemy, bo ten plik nie powinien mieć tego kodu, który się tutaj znajduje. Zaraz
go usuniemy w całości i ten obiekt wstawiamy
w to miejsce i eksportujemy go z tego pliku jako Default, Export
Default w ten sposób i to oznacza, że w pliku, w którym
importujemy app vue, czyli tutaj, będzie
zaimportowany jakby ten komponent app przepuszczony jeszcze przez Vue loader, aby odpowiednio
templatki były skompilowane i tak dalej, ale w ten sposób byśmy to robili. Z tym, że
teraz już nie będzie el, bo jeżeli tworzymy komponenty, czyli pliki z rozszerzeniem Vue i nie
podajemy do jakiego elementu mają być zamontowane, dokładnie tak samo jak robiliśmy z komponentami. Pamiętasz,
że tylko główna aplikacja była gdzieś podmontowana, a komponenty miały
swój template, w który wstawialiśmy tutaj pisząc po prostu właściwość template. Teraz ten
template znajduje się po prostu tutaj w osobnym elemencie, który ma ładny syntax highlighting
i tak dalej, więc to usuwamy. Data, z uwagi na fakt, że tak naprawdę
my teraz jesteśmy w komponencie, to musi być funkcja, więc to musi być funkcja,
która zwraca taki obiekt, pamiętaj. Dokładnie
ta sama zasada, która była przy komponentach. Natomiast z uwagi na fakt, że jesteśmy
w EcmaScript6 tak naprawdę, czyli webpack będzie nam kompilował ten kod, to
mogę stworzyć krótszy zapis i to jest dokładnie to samo, zwracamy
sobie stąd data, methods i components pozostaje
bez zmian. Natomiast teraz jeżeli tutaj mówimy że pod edu counter ma być komponent counter
to nie istnieje, więc będzie błąd. Skąd my to możemy tutaj wziąć. Otóż komponenty
będziemy chcieli sobie zaimportować, bo co my teraz zrobiliśmy. Wszystko
zrobiliśmy w ten sposób, żeby tutaj nie było błędów, bo mamy in value, mamy
wszystkie te rzeczy, ale nie mamy komponentu, więc tutaj możemy zrobić import, w EcmaScript6
i będę chciał sobie zaimportować counter from i ścieżka relatywnie
do tego pliku app do katalogu komponent, gdzie go utworzymy, to ten
sam katalog, czyli kropka slash components i następnie
counter. Nie musimy podawać rozszerzenia vue, ale można
to robić i zaimportujemy sobie to, co ten plik będzie eksportował jako default
i zapiszemy pod nazwą counter, którą przekażemy w to miejsce, więc teraz musimy utworzyć taki
plik, czyli katalog 52 src components
counter vue. W nim
znowu będzie template, ale to co ważniejsze to będzie script i export default
i tutaj będzie obiekt. Jaki obiekt zapytasz. Przejdziemy
sobie do tego pliku index, który mieliśmy i cały nasz komponent, który jest w tym miejscu, ja
stąd zabieram i z tym samym możemy już usunąć to, co tutaj było, a
stąd będę go po prostu eksportował, z tym
że teraz on nie będzie miał template podany w ten sposób i też by nam to nie zadziałało, bo pamiętasz
już pewnie poprzedniej lekcji, że wybrałem wersję Vue bez kompilatora templatek i to
by nam nie zadziałało, ale kompilator templatek działa na tych templatkach, bo jest załadowany jako
osobny w ogóle loader, więc to sobie musimy wyrzucić, ale wycinając,
tutaj data od razu już mamy zrobione tak jak powinno być, w komponencie
wszystkie inne rzeczy są w porządku, nic nie musimy zmieniać i templatkę umieszczamy
w tym miejscu, okej.
No i teraz skoro go wyeksportowaliśmy, w app vue go zaimportowaliśmy,
można go tutaj przekazać i to nam powinno w jakiś sposób
już działać. Widzimy, że pojawia się jakiś błąd, warto sobie tutaj przeczytać,
fajnie błędy są wyświetlane, również w konsoli, bo on będzie podobny. Widzę, że
gdzieś zabrakło przecinka, dokładnie tutaj, okej to
się odświeżyło. Wow i nawet prawdopodobnie będzie działać, jak widzisz
już nam to wszystko działa poprawnie, zobaczmy
czy odliczanie się zakończy to się odblokuje, tak jest. Natomiast
pokażę ci jedną fajną rzecz, że jeżeli nie chcesz nazywać tego
komponentu edu counter tutaj, tylko chciałbyś skorzystać na przykład małej litery counter
albo z wielkiej, to tutaj nie ma znaczenia, to
mógłbyś tutaj napisać counter równa
się counter, ale w EcmaScript6 można zrobić coś takiego i jeżeli
zrobimy coś takiego to jest dokładnie taki zapis. Czy jeśli chciałbym
nazwać komponent counter, tutaj z niego korzystać, może być mała litera, może być wielka, a do
niego przypisać komponent pod zmienną counter to w ES6 jest taki skrót, że w
obiekcie wstawiamy coś takiego i to dokładnie jest rozwijane to counter dwukropek counter,
więc często się z tym spotkasz i to oznacza, że możemy z takiego tutaj komponentu
korzystać i tutaj tej templatce nie ma tych wszystkich ograniczeń, które były w żywej
templatce w DOM'ie, czyli tutaj nie musimy mieć z pauzą tych komponentów nazwanych
i tak dalej. Możemy komponent od razu domknąć i to wszystko będzie działać poprawnie,
nie przekazujemy mu żadnej treści do slota, więc mogę go po prostu domknąć, tutaj to
powinno być automatycznie odświeżane, ale dla pewności odświeżę i jak
widzisz, to wszystko działa poprawnie. Myślę zatem,że na tym etapie widzisz,
jakie są tutaj zalety korzystania z tego w ten sposób.. Po
pierwsze możemy korzystać z nowego zapisu ES6, który jest kompilowany automatycznie
za nas. Po drugie bardzo wygodnie sobie od separujemy komponenty, mamy template,
super się tutaj pracuje. Tutaj jest logika tego komponentu, mogę sobie zaimportować co chce.
Może jakiś funkcje pomocnicze, jakieś inne rzeczy z których bym tutaj korzystał i dodatkowo
można tutaj jeszcze przepisać style, ale tym zajmiemy się w kolejnej lekcji. Możemy
te komponenty dzielić na różne pliki. Myślę, że naprawdę widzisz jaka
jest przewaga tego, wobec tego co robiliśmy prosto tutaj w przeglądarce, chociaż
te skrypty, które tutaj wpisywaliśmy można było oczywiście odseparować do
osobnych skryptów i jakoś tutaj podłączyć lub jeżeli masz jakiś swój własny workflow, czy
z użyciem gulp'a czy z webpack'a czy jakikolwiek inny, mogłeś sobie bez problemu
z tego korzystać. Natomiast w webpack'u fajne jest to, że mamy Vue loader,
który pozwala nam takie jednoplikowe komponenty odpowiednio zamieniać na kod
JavaScript i wszystko to później działa poprawnie, a więc bardzo wygodnie się tutaj pracuje. To zatem
tyle w tej lekcji, w kolejnej rzucimy jeszcze okiem na pracę ze stylami CSS w tych jednoplikowych
komponentach.