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
W tej i w kolejnej lekcji stworzymy praktyczny projekt takiej tabeli, która
będzie wyświetlała listę użytkowników. Będzie można ich usuwać oraz w
kolejnej lekcji również edytować. Zobaczysz w jaki sposób tutaj połączyć
wiedzę, którą do tej pory zdobyłeś, więc zaczniemy od stworzenia własnego
komponentu, ale pokażę ci najpierw co mamy. Mamy główną instancję aplikacji
i ona ma tablice users. Taką, którą już do tej pory widziałeś
i teraz tu jest templatka żywa, czyli w drzewie DOM
właśnie tej głównej aplikacji i będziemy chcieli sobie tych użytkowników tutaj moc
wyświetlać, ale chciałbym to zrobić w taki sposób żebyśmy mieli komponent, który
się będzie nazywał edu user i będziemy chcieli te komponenty w pętli wyświetlać,
dlatego stworzymy sobie taki komponent. Możemy za pomocą Vue komponent, będzie
on wtedy globalny edu user. Okej i
jeżeli zrobimy to w ten sposób to wiesz, że tutaj będziemy mogli wpisywać edu
user. Okej,
no i każdy taki edu user będzie miał template. Korzystam
z zapisu EcmaScript6 żebyśmy mogli tutaj w template stringu fajnie to sformatować i
chciałbym żeby tam było TR, zaraz będziemy to rozwijać,
zobaczysz jakie problemy napotkamy i skoro tutaj mamy TH,
jak widzisz 4 razy, to będę miał chciał mieć również
4 razy TD, okej i na razie tutaj
nic nie stawiam, ale chciałbym to wyrenderować, zobaczmy czy nam się uda, okej.
Teoretycznie powinno to działać, ale jak jest w rzeczywistości tbody
jest puste. Mógłbyś zapytać dlaczego tak się stało. Dlaczego TR pojawiło
się w tym miejscu. Dzieje się tak dlatego, że nasza templatka tutaj
jest żywa, jest osadzona w drzewie DOM zanim w ogóle Vue zostanie wczytane
na stronie. Jest to dla nas problemem. Problemem takim, że pewne
elementy nie mogą być w innych. Na przykład w liście ul mogą być tylko elementy li. Mówimy
bezpośrednich dzieciach i w tbody mogą być tylko elementy tr,
a my dodaliśmy tutaj taki element. No i teraz pytanie czy coś z tym można zrobić
czy nie. Bo ten problem byłby rozwiązany, ja wielokrotnie właśnie ci mówiłem
o tym, że jest różnica pomiędzy żywą templatką a templatka, która jest jako string
w tag'u script lub tutaj w czymś takim. Różnica jest taka, że
tutaj nie byłoby z tym problemu. Czyli gdyby nasza główna aplikacja templatka
miała tutaj osadzoną poprzez template, moglibyśmy skorzystać z takiego zapisu, Vue by to
sparsowało. Natomiast, jeżeli te elementy się pojawiają właśnie tutaj w drzewie
DOM, to przeglądarka jest wyrzuca i wyrzuciła je przed tabelę, a później
dopiero Vue zamieniło się na tr, dlatego się pojawiły w taki sposób. W związku
z tym twoje pytanie pewnie brzmi czy można coś z tym zrobić, nie przenosząc całej
tej templatki do takiej właściwości template czy w jakiś inny
sposób do stringu. Można, możemy tutaj skorzystać z tr, czyli
z takiego elementu, który wiemy, że jest obsługiwany przez przeglądarkę poprawnie. Natomiast w
taki sposób, w tym sposobie jak skorzystać z naszego edu
user, wystarczy, że tutaj dodamy atrybut is edu-user
i vue potraktuje to w ten sposób, że całość zostanie
jakby zamieniona, w taki sposób jakbyśmy tam podali edu user jako tag. To jak
to zrobiłem przed momentem, ale sama przeglądarka nie będzie narzekać, zobacz. Teraz jeżeli
odświeżymy, ja już widzę, że jest w porządku i mamy tutaj tbody i wszystkie
te elementy się pojawiły, czyli ten tr jakby w
całości został wyrzucony i zastąpiony templatką, w której jest właśnie nowe TR, bo
wiem, że docelowo tutaj musi być TR, bo inaczej przeglądarka tego nie zinterpretuje poprawnie, więc
ten TR to jest naprawdę tak naprawdę ten z wewnątrz, który jest tutaj. Okej, więc
pierwszy problem za nami rozwiązany. Jak widzisz, on się pojawia tylko wtedy jeżeli
ta templatka jest żywa w obiektowym modelu dokumentu. Teraz
zatem będziemy chcieli wykonać tutaj pętle, więc zrobimy sobie v-for
i może nawet zrobię to w tym miejscu albo nie. Zróbmy tak,
bo będziemy dodawać jeszcze kilka innych rzeczy, v-for user in users
przypominam, że chodzi o tę tablicę users i będziemy chcieli przekazać
do tego komponentu chociaż jest to TR, ale napisaliśmy tutaj is edu user, więc
jest to komponent, do którego prop możemy przekazywać tak samo jak wcześniej w przypadku edu counter
i tutaj będę chciał przekazać sobie user, czyli binduje
to na wartość user, czyli właśnie tą z tej iteracji i
jeszcze index nie będzie interesował więc w zasadzie zróbmy to w ten sposób index
user chce nam przekazać i index zbindujemy
na wartość index, więc to nam wpadnie do komponentu, a więc nasz komponent byłoby
miło, gdyby przyjmował to w props. Moglibyśmy
tutaj wykonać walidacje, że user to musi być obiekt, na przykład. Ja dla uproszczenia tego
robił nie będę, w prawdziwej aplikacji bym to zrobił. Podam tylko tutaj te, które przyjmujemy
i wiemy, że będziemy mogli poprzez this user this index się do tego odwoływać,
okej i mając to możemy sobie uzupełnić naszą templatkę w tym
miejscu, czyli co będziemy chcieli mieć w pierwszym td, sprawdźmy jak to wygląda
tutaj. Liczba porządkowa, no właśnie, więc tutaj sobie wyświetlimy właśnie ten
indeks, który przekazaliśmy jako prop. W następnym
będziemy chcieli podać imię i nazwisko. Jak tutaj wygląda mamy full name
od razu, więc możemy podać, pamiętajmy że jest to user, przekazaliśmy
cały obiekt jako user właśnie w prop, więc muszę tutaj napisać user full
name, okej, sprawdzimy czy to ma sens. Wygląda
na to, że tak. W liczbie porządkowej dodamy sobie jeszcze tutaj wartość
1, odświeżam. Jest w porządku. No
i może jeszcze tak jak mieliśmy wcześniej w przykładzie po prostu kropkę. Kolejna rzecz, która nas interesuje
Jest to wiek, więc napiszemy user age
i ostatnia rzecz to będzie przycisk do usuwania. Tutaj będę chciał
sobie wstawić przycisk tak to będzie wyglądać, będzie to
przycisk, który będzie miał w środku ikonę delete, czyli taki kosz i
po kliknięciu na ten przycisk chciałbym usunąć dany wiersz, czyli będę chciał
w jakiś sposób komunikować do góry z tego właśnie komponentu,
który tutaj będzie osadzany, komunikować do głównej aplikacji, bo to ona przechowuje
te dane, że usunęliśmy jakiś element tablicy i że również to
powinno tutaj zostać odzwierciedlone, bo ta templatka tutaj która renderuje tabelę, tak
naprawdę ona jest zarządzana przez główną aplikacje, czyli
przez instancje, która jest tutaj na samym dole, dlatego będę chciał zrobić taką rzecz,
że tutaj dodamy sobie kliknięcie do tego oto przycisku i w
tym kliknięciu wywołam metodę remove i przekażemy jej
user id, ci użytkownicy mają unikalne id, jak
widzisz, tylko ważne jest to że ta metoda się wykona oczywiście
na instancji tego komponentu, czyli nie gdzieś na zewnątrz, a więc musimy tutaj mieć method
i taką metodę remove musimy
sobie tutaj dodać, ona będzie otrzymywała parametr, czyli właśnie ten id i stąd
jak się być może domyślasz będziemy chcieli wyemitować zdarzenie do
góry, więc napiszemy sobie this emit remove
i podamy to id. No i teraz będziemy polegać na tym, że główna
instancja będzie na każdym z takich elementów nasłuchiwać. Może jeszcze
zróbmy taką rzecz, że połamiemy sobie to na wiele linii, nie jest to błędem
a będzie nam łatwiej to wszystko przepisywać i przepiszemy zdarzenie remove,
to które wyemitowaliśmy z dołu i tutaj też nazwiemy sobie
je remove, te nazwy są przypadkowe, że one są takie same, tak mi
jest wygodniej. Możesz to nazwać jak chcesz, bo na tym etapie tutaj wszystkie te nazwy
i wszystkie te wartości odnoszą się do głównej aplikacji, która jest w tym miejscu, a więc
jej metody musimy nazywać remove, ona
też otrzyma id. Okej, ale ona ma już dostęp do tej tablicy bezpośrednio,
więc będzie mogła znaleźć taki element i go
usunąć i teraz problem, który pojawił jest taki, że mamy tą tablicę
i chciałbym po niej przeliterować. Znaleźć taki obiekt, który ma id
równa się na przykład 2. Zwrócić jego index, czyli to jest 01. No
i metodą splice, tak jak to robiliśmy wcześniej usunąć ten element, więc trochę
kodu musielibyśmy napisać. Z tego powodu podłączyłem biblioteka lodash, która
nam to zadanie maksymalnie uprości i zrobimy
coś takiego napiszemy i tak żeby znaleźć ten index i biblioteką lodash odwołamy
się do find index. Mówimy gdzie chcemy szukać, czyli this users
i teraz na podstawie jakich kryteriów. Tutaj można podać tablice mówiąc,
że id ma być równe takie jak to przekazane id i zostanie
nam zwrócony index właśnie tego elementu w tej tablicy, a kiedy
już to będziemy mieli to this users splice. Pamiętaj, że splice jest to
metoda opakowana przez Vue żeby Vue wiedziało kiedy z niej korzystamy. Będę
chciał usunąć element pod indeksem index i od niego jeden element do przodu,
czyli tak naprawdę ten element zaczynamy na indeksie i jeden element usuwamy. No
i to powinno nam wystarczyć. Odświeżmy i
teraz może tutaj zamknę i jak widzisz ja klikam na jakiś element,
to on jest poprawnie usuwany. Emitujemy to zdarzenie i te elementy są
usuwane. Tutaj moglibyśmy jeszcze zapytać o to co wcześniej, czyli v-if, jeżeli
nie ma żadnych elementów i v-else, teraz już tego nie będę dodawał,
ale tutaj można to zrobić, żeby taki element wtedy nie był widoczny, więc jak
widzisz w ten sposób możemy się w ogóle komunikować i działa nam to poprawnie. Natomiast
chciałem dodać jeszcze jedną ciekawa rzecz, mianowicie drugi przycisk do edycji, który jeśli
klikniemy, to pojawi się tutaj pole gdzie będziemy mogli zmienić Jan oraz
tutaj wiek i zrobimy to sobie z lekcji kolejnej.