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
Tą lekcją rozpoczynamy dział o komponentach i jest to jedna z najważniejszych
rzeczy jeśli chodzi o pracę z nowoczesnymi aplikacjami webowymi i
dlatego też Vue.js to wspiera. Chociaż to, co do tej pory widziałeś tym kursie
to już mnóstwo rzeczy które przydadzą ci się w budowaniu różnej
wielkości aplikacji, może prostych widgetów, na twoje strony internetowe. To
dopiero komponenty dają nam niesamowitą moc, dlatego będę chciał ci w tej
i w kilku kolejnych lekcjach pokazać na czym sprawa polega. Zauważ,
że mamy przykład naszego counter'a, który mieliśmy wcześniej. On działa świetnie. Natomiast
chciałbym go przerobić komponent, tak aby można było go wielokrotnie
osadzać i choć ten konkretny przykład może nie jest najciekawszy
jeżeli chodzi o wielokrotne użycie, to na nim doskonale będziesz mógł zobaczyć jak
coś to już znasz, bo ten przykład zakładam, że razem ze mną przerobiłeś, przerobić
na komponent i czym komponenty są. Więc przyjdziemy sobie do kodu. Jest
to przykład w niezmienionej formie, tak jak mieliśmy go wcześniej. Natomiast będziemy go chcieli
przerobić na komponent. Teraz pytanie. Czym jest komponent? Komponent jest
to element HTML można powiedzieć własny, czyli
do tej pory tutaj korzystaliśmy z elementów takich jak na przykład div, znamy je
z języka html. Natomiast możemy utworzyć własny element
i chciałbym go nazwać na przykład eduweb counter,
otworzyć i zamknąć. W kolejnych lekcjach będziemy na nim jeszcze
później pracować. Natomiast chcę kilka słów na ten temat powiedzieć. Ważne
jest to, że my wciąż pracujemy na żywym DOM'ie, czyli ta
templatka jest wczytana przez przeglądarkę, więc przeglądarka taki element zobaczy
zanim Vue zdąży się wczytać i co ważne, nie jest to błędem, czyli
dla przeglądarki ona nie rozumie tego elementu, ale wstawi go do drzewa DOM i nie
będzie go specjalnie jakoś traktować. On będzie traktowany podobnie jak element div. Dlaczego jednak
zrobiłem go tutaj z pauzą? Właśnie z tego powodu, że specyfikacja
HTML i specyfikacja Custom Elements,
jest coś takiego zakłada, że powinniśmy tworząc własne
elementy poprzedzać je jakimś przedrostkiem i pauzą. Z tego powodu nigdy
nie wejdziemy w konflikt z dzisiejszymi lub przyszłym i elementami specyfikacji
HTML, czyli innymi słowy jak będą powstawać elementy takie jak kilka lat
temu powstało na przykład section i tak dalej to na pewno nie będą one z żadnym
przedrostkiem i pauzą są. Stąd jeżeli my będziemy swoje w ten sposób tworzyć nie
będzie problemu. Natomiast co ciekawe to nie będzie dla nas miało znaczenia kiedy ta templatka
nie będzie już żywa w drzewie DOM, ale kiedy będziemy z niej korzystali
później jak się przekonasz przy pracy jeszcze z webpack'iem Vue CLI albo
gdybyś całą tą templatkę zapisał w skrypcie lub w template string'u
wtedy nie ma to do końca znaczenia. Niemniej jednak jest dobrą praktyką, aby nasze
własne komponenty tworzyć w ten sposób. Okej, zatem mamy taki
komponent wstawiliśmy go tutaj i pytanie co dalej, jeżeli odświeżę stronę to Vue mówi, że
nie rozumie takiego customowego elementu jak edu counter, czyli widać
że Vue sobie to próbowało sforsować, ale my jeszcze nie zarejestrowaliśmy żadnego komponentu.
Zróbmy to zatem teraz. Zrobimy
to tutaj i znowu można tak jak filtry czy dyrektywy tworzyć komponenty
globalne, które będą działały w całej aplikacji lub lokalne,
które będą działały tylko tutaj gdzie aplikacja je kontroluje. Na razie
zrobimy sobie komponent globalny. W Vue component wpiszemy
i podajemy jego nazwę będzie to edu counter i tutaj podajemy
obiekt konfiguracyjny i wszystko co do tej pory już wiesz, czyli
ten obiekt konfiguracyjny ci się przyda, dlatego że jest to nie ma dokładnie
to samo z jedną bardzo istotną różnicą. Po pierwsze
tutaj nie podajemy el, bo nie będziemy kontrolować konkretnego elementu
tylko będziemy kontrolować elementy, które będą w templatce. Gdzie ta
templatka jest zaraz zobaczysz, bo o ile tworząc taką instancję naszą
templatką było to co ona kontroluje, o tyle tworząc komponent
on potrzebuje osobnej templatki. Zatem potrzebujemy template
i tutaj możemy podać albo hash i id jakiegoś skryptu
w którym przechowujemy templatkę albo musimy ją tutaj wpisać sposób ręczny, więc ES6
z użyciem template stringu, będzie można ją łatwo wpisać w ten sposób. Witaj, natomiast
w zasadzie zamiast tego wpisanego ręcznie sting'u możemy
tutaj wpisać coś dynamicznego na przykład message. Zaraz sobie do tego przejdziemy i teraz
utworzyli byśmy data. Natomiast jedna kluczowa różnica
jeżeli to zapisze i odświeżę to Vue nam o tym powie, jest taka, że tutaj obiekt
data nie może być zapisany w ten sposób, dlatego że komponentów można tworzyć wiele,
można będzie kilka razy wstawić ten komponent i wszystkie te komponenty przez
to jak działa język JavaScript, dziedziczyłyby jeden obiekt data. Czyli jeżeli w
jednym zmienił message, zmieniłby się we wszystkich. Tutaj nie było z tym problemu,
bo new vue to zawsze była tylko jedna instancja. Tutaj komponentów
może być wiele i z tego powodu data to musi być funkcja zwracająca obiekt i
tutaj dopiero zwracamy obiekt. W ten
sposób ten zwracany obiekt za każdym razem będzie nowy dla każdego nowego komponentu
Vue wykona tę funkcje i tak właśnie działa JavaScript, że ten obiekt
będzie unikalny i tak powinniśmy to robić, więc to jest kluczowa różnica i w
tym obiekcie to co wpiszę to jest dokładnie to co wpisywaliśmy w data w tym
miejscu. Natomiast wszystkie inne rzeczy jak computed i tak dalej możemy tutaj sobie dodawać
normalnie już oprócz tego dlatego, że computed to zawsze są funkcje i nie
będzie tam tego problemu. Wpiszmy message Witaj i po
zapisaniu tego na naszej stronie to Witaj się pojawiło dwa razy i nasz
komponent, zauważ, został podmieniony. Mamy H1 Witaj oraz H1
Witaj dwa razy dokładnie to samo, a samo to edu counter nie istnieje,
więc to nie jest nigdzie osadzone później w drzewie DOM. Niemniej jednak my
będziemy chcieli coś zrobić coś innego, skoro nasz counter przerabiamy, to chciałbym wszystko
co tutaj w nim było, zróbmy to w ten sposób wstawić
sobie do tego komponentu, czyli to będzie jego template i tutaj
robiąc taki template string, wszystkie rzeczy o których mówiłem ci wcześniej, tak
naprawdę nie mają już znaczenia, czyli gdybyśmy tutaj osadzali inne komponenty one
wcale nie muszą być tak jak tutaj z pauzą i wiele innych rzeczy z którymi
mógł być problem, kiedy osadzaliśmy je tutaj w drzewie DOM, że przeglądarka mogła jej nie poprawnie
sprasować. W takim template one już nie mają znaczenia. Okej,
ja będę chciał na razie jeden taki edu counter tutaj wstawić. Natomiast, żeby to wszystko mogło
teraz działać to to co mieliśmy tutaj w data wytnę i wstawię
do data tego oto komponentu i zasadzie wszystkiego metody również,
więc jeżeli zrobimy sobie coś takiego. Tutaj data w naszej instancji
głównej nawet nie jest potrzebne. To powinniśmy mieć komponent,
który powinien działać, okej widzimy, że coś jeszcze tutaj jest nie tak, więc przeczytajmy.
Zgadza się. Super ważna rzecz. Otóż możemy
mieć tylko jeden root element, a tutaj w tej templatce mamy dwa. Jeden i drugi, więc
zawsze musimy to opleść w taki sposób żeby tutaj był tylko jeden główny
element. Dlatego najlepiej jest tutaj dodać sobie na przykład takiego div'a, zobaczymy.
No i teraz wszystko działa poprawnie, jeżeli kliknę start to powinno to
działać dokładnie tak samo jak wcześniej, czyli stworzyliśmy sobie reużywalny komponent,
który można w dowolnych miejscach wstawiać. Jak widzisz odliczanie się zakończyło,
ale to co jest fajne. To teraz możemy sobie skopiować to drugi raz i jeden
uruchomimy w tym miejscu drugi uruchomimy później i każdy z nich ma izolowany
scope, czyli zakres tych zmiennych, które mają w data tych danych i każdy
operuje na swoich własnych niezależnie. Pokażę ci jeszcze jeden ciekawy
trick. Jeżeli chcielibyśmy odsunąć ten element, to możemy tutaj dodać
sobie albo klasę, która potem zostanie dodana do elementu poniżej albo możemy
normalnie przypisać style i co ciekawe wszystkie rzeczy, które robiliśmy do tej pory tutaj
będą działali v-for, bindowanie i tak dalej. Natomiast jeżeli style bym
tutaj dodał na przykład margin top 50 pikseli to
ten element się odsunie, bo okaże się że te style będą przypisane do pierwszego
elementu stempla, czyli dokładnie do tego div'a, w którym to wszystko opletliśmy. Taki
ciekawy trik. Podobnie jeżeli klasy CSS przypiszesz to ona zostanie dodana tutaj. Nawet
jeżeli element, który jest tutaj miałby już swoją klasę, zostaną one po prostu połączone
w jedną. Okej i na sam koniec tej lekcji chcę ci jeszcze tylko pokazać
jedną rzecz. Jak możemy stworzyć komponent lokalny, czyli jeżeli nie chcę żeby on w
globalny, to mogę ten obiekt konfiguracyjny zapisać w jakiejś
zmiennej. Możemy ją nazwać counter i przepisać tutaj teraz
on już nie będzie działał poprawnie, ale wewnątrz instancji, gdzie chcemy korzystać z
komponentu, tutaj ważne żeby jeszcze usunąć ten nawias, możemy zrobić coś
takiego, że napiszemy tutaj components i będzie
to obiekt w którym podajemy nazwy tagu z jakiego chcemy korzystać, czyli edu
counter i dokładnie obiekt, który nas interesuje,
czyli counter. W ten sposób mogę sobie zdefiniować jak się ma nazywać tag,
który wewnątrz mojej aplikacji, czyli tutaj będzie używany i który
komponent ma być do niego przypisany, czyli tutaj jest counter. Cały ten obiekt oczywiście mógł
być wstawione też tutaj, ale lepiej to mieć na zewnątrz, będzie to można importować później i
eksportować no i zobaczymy, to wszystko nam działa, co to ciekawe
możemy tutaj przejść i to narzędzie nam to fajnie pokazuje, który zaznacza
to ten będzie pod vm0 dostępny w konsoli i będę mógł sobie
na nim coś podejrzeć. To są zatem podstawy tworzenia komponentów. Za
moment będziemy je oczywiście rozszerzać o kolejną wiedzę, ale jak
widzisz tak to działa, że możemy stworzyć globalne lub lokalne podajemy
mu jego template i jego data jako funkcję zwracającą obiekt
a później metody czy computed properties jest dokładnie tak samo jak robiliśmy to
do tej pory.