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
Rzućmy teraz okien w jaki sposób możemy stworzyć kilka slotów i nadać
im odpowiednie nazwy. Ja przerobiłam naszą aplikację troszeczkę
tak żebyśmy ją mogli osadzić i żeby miała troszeczkę więcej struktury. Nazwałem
ten komponent edu app i zauważ, że to co mieliśmy do tej
pory wewnątrz tutaj naszego głównego app teraz tego nie ma, ale
za to osadziłem sobie tutaj edu app i to wszystko znajduje się w tym miejscu, jeżeli
sobie to wyrenderujemy, wygląda to w następujący sposób. Powinno działać tak jak wcześniej
jak widzisz dokładnie tak jest. Natomiast ta struktura została przeniesiona tutaj.
Natomiast teraz chciałbym do tego edu app móc przekazywać kilka
różnych rzeczy. No i pokazałem ci że jeżeli tutaj wpiszę H1, coś
to to się pojawi w tym miejscu w którym wstawimy slot, więc muszę
jakiś slot tutaj wstawić. No właśnie, więc może zróbmy tak, że
w tym miejscu wstawimy sobie slot, to jest to co pokazywałem ci w lekcji poprzedniej. Natomiast
zaraz rozszerzymy tą wiedzę i jeżeli tu coś przekażę,
to to wpadnie do tego slota, czyli powinno to wyglądać tak samo, ale teraz chciałbym dać
sobie jeszcze kilka innych slotów, bo chciałbym na przykład tutaj móc dodawać
jakieś linki, więc wstawimy sobie tutaj kolejny slot, ale
co ważne nie mogę mieć drugiego slota, który tak samo się nazywa, czyli
w zasadzie jest identyczny. Jak widzisz tutaj mamy napisane, że nie może być dwa
razy taki default'owy slot. Natomiast slot to można poprzez
atrybut nadawać nazwy. Jeżeli napiszemy name na przykład header
lub navbar, bo to tutaj będzie tutaj bardziej odpowiednie, to teraz nie powinno
być żadnego błędu. Jak widzisz to co podałem tutaj wpada
do domyślnego slota, czyli tego, który nie ma nazwy. Natomiast jeżeli slot
ma nazwę to możemy coś prostu do niego wyrzucić i dlatego ja będę
chciał sobie taki link jak jest tutaj skopiować i możemy
zrobić coś takiego, że wrzucam tutaj ten link, oczywiście nie
musi mieć tutaj kliknięcia, chciałbym żeby on kierował na przykład do serwisu eduweb.pl, okej.
No i teraz jeżeli nic więcej nie zrobię to on oczywiście wpadnie do domyślnego slota
tutaj, ale mogę mu przypisać atrybut slot i podać
tutaj nazwę na przykład navbar, okej i teraz
wpadnie to dokładnie w to miejsce, które zdefiniowaliśmy w tym miejscu. Natomiast
jeżeli nie chcesz do każdego elementu jeżeli miałbym tutaj więcej linków, nie
chcesz każdemu przepisywać tutaj atrybutu slot lub jeżeli
to dla ciebie wygląda dziwnie to możesz zrobić jeszcze rzecz ciekawszą, moim
zdaniem lepiej to po prostu wygląda tutaj, stworzyć template, jej przypisać slot, a
taką templatką opleść element. Jeżeli jest jeden to mogliśmy do niego przepisać
atrybut, ale jeżeli jest więcej, można je podać w ten sposób i ta templatka
oczywiście sama w sobie zostanie wycięta, czyli jeżeli zajrzymy sobie do wynikowego
kodu wygląda to następująco. No i teraz na przykład możemy stworzyć jeszcze slot tutaj w footerze,
ustawię jego
name na footer i teraz w tym
miejscu mogę coś podać do footer'a. Nie musi to być w tej kolejności oczywiście, ale
jest bardziej jakby logicznie, że od góry do dołu, ale takie templatki
mogą być w dowolnym miejscu, okej, name to będzie footer
i podamy sobie coś takiego. Pamiętaj znowu, że do tego paragrafu
można przypisać name footer i on wpadnie wtedy w odpowiednie miejsce. Oczywiście
tutaj nie będzie name tylko tylko to będzie slot, tak jak zrobiliśmy wyżej. Ja jednak
preferuję taki zapis tę templatkowy, lepiej to wygląda, jak widzisz wynik jest dokładnie
taki sam, ale mamy kontrolę nad tym co tutaj wstawiamy. Czyli
jak widzisz jeżeli slota nie nazwaliśmy, to jest
on domyślnym slotem, tak jak tutaj i wszystko tutaj do niego wpadnie. Jeżeli taki
jeden paragraf jeszcze wstawiłem tutaj poniżej, znowu to dziwnie wygląda, ale Vue to
odpowiedni znak i odpowiednio wstawi do tego domyślnego slota, okej,
oczywiście w tych slotach tak samo jak w lekcji poprzedniej
ci pokazywałem możesz przypisać domyślną wartość, coś tutaj można wstawić. Jeżeli
nic nie zostanie do tego słota przypisane, to będzie to domyślna wartość
wyświetlana. Teraz chciałbym ci pokazać jeszcze jedną rzecz,
bo do tej pory już się pewnie zorientowałeś, bo mówiłem o tym w lekcji poprzedniej, że
nie możemy tutaj wyświetlać rzeczy z tego komponentu, czyli edu app,
jeżeli ma jakąś właściwość ja nie mogę jej tutaj wyświetlić, bo tak naprawdę ja jestem w templatce
rodzica, czyli tej aplikacji. Jeżeli chce się do czegoś odwołać to w tym edu app musiałbym
to zrobić gdzieś tutaj, ale pytanie czy da się jakoś stąd wypchnąć
do góry jakieś dane i wstawić je tutaj, ale wewnątrz tego elementu to jest
ważne, okazuje się, że się da. Natomiast żeby nam to zadziałało to nie możemy
mieć dwóch domyślnych slotów, bo za chwilkę zrobimy taki slot który też będzie
traktowany jako domyślny, więc musimy zrobić taką rzecz, że ten
który był domyślny to przypiszemy mu name, na przykład
main, to co tutaj mieliśmy wstawimy również
do template i tutaj napiszemy slot równa się main. Okej
to powinno działać tak samo. Natomiast teraz przejdziemy do sedna tego
o czym mówię, czyli przyjdziemy sobie do edu app i ja już tutaj
wcześniej jak widzisz dodałem title aplikacja i chciałbym w jaki sposób ten tytuł
nie wyświetlać tutaj wewnątrz, ale chciałbym móc go wypchnąć
gdzieś tutaj na górę, żebym mógł go w jakiś odpowiedni sposób tutaj
wstawić. Okazuje się, że jest to możliwe za pomocą tak zwanego slot-scope. Możemy
tutaj utworzyć templatkę i przypisać jej atrybut slot-scope równa
się i tu możemy napisać nazwy zmiennej, która nas interesuje. Może się ona
nazywać props. Tak też jest dokumentacji i ciekawe jest to, że teraz wewnątrz
tutaj, może na przykład zrobimy H1, możemy
się odwołać do tego props i następnie title. Tak
by to mogło wyglądać, title za moment sobie, że tak powiem wypchniemy do góry.
To props mogłeś nazwać na przykład data, wtedy tu byś się odwoływał data. Natomiast,
jeżeli teraz to odświeżę to w zasadzie nic się nie wydarzy, ale teraz
musimy zrobić jeszcze jedną rzecz, żeby z tego komponentu edu app coś
można było tutaj na zewnątrz wyświetlić. Musimy przejść to jego templatki, na
przykład tutaj, w dowolnym, miejscu w jego templatce i wpiszemy
taki slot, któremu przypiszemy title, właśnie dlatego,
że u góry też zrobiłem title i mogę tutaj podać
dowolną wartość, ale żeby ta wartość była dynamiczna to zbindujemy ten atrybut do
title, czyli do tej właściwości którą przechowuje właśnie tutaj i chociaż to
się wydaje na początku zagmatwane, jeżeli na spokojnie na to spojrzysz, robimy taki slot,
bindujemy atrybut title, tutaj mogę zbindować więcej atrybutów na wartość
w tym przypadku aplikacja i dzięki temu tam gdzie osadziłem edu app, mogę
wewnątrz tego komponenta, komponentu odwołać się do template
slot-scope. Ta nazwa jest dowolna i do tego title będę
mógł się odwołać, odświeżmy i widzimy, że aplikacja tutaj
się pojawiła na samej górze. Natomiast, żeby to lepiej wyglądało to
można byłoby tutaj zrobić sobie jeszcze jakiś element typu container i
tutaj
musiałby mieć jeszcze taką podobną klasę, jak w tym miejscu, czyli w tym przypadku grid lg. Po
odświeżeniu, jak widzisz wygląda to dużo lepiej. Zatem jeżeli będziesz
potrzebował rozłożyć sobie swoją aplikacje i zrobić na przykład header, footer, sidebar
i tak dalej, to już wiesz jak możesz to zrobić za pomocą nazwanych slotów. Natomiast czasami
może zajść taka sytuacja, że chciałbyś również z komponentów wypchnąć coś na
zewnątrz i to będziesz mógł zrobić z użyciem slot-scope, właśnie tak.