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 lekcji chciałbym do naszej aplikacji dodać możliwość pobierania adresu
obrazków z serwera. Do tej pory w tym kursie tego nie robiliśmy, czyli nie korzystaliśmy
z Ajax'a, ale w zasadzie jest to bardzo proste i jest to niezależne można powiedzieć
zupełnie od Vue, ale jest bardzo ciekawa biblioteka, bardzo popularna Axios,
niezależna od Vue i można za jej pomocą wykonywać zapytania Ajax,
ona bazuje na promise, więc będziemy chcieli sobie ją zainstalować, co ważne
można ją również zintegrować z Vue za pomocą takiego pluginu
Axios Vue, jeżeli byś chciał, ale w naszym przypadku nie będzie to konieczne, zainstalujemy
ją z użyciem npm install axios, więc muszę przejść do terminala, jeżeli masz serwer
uruchomiony to Control C zatrzymać i wpisać takie oto polecenie
i to nam się zainstaluje i będziemy to mogli sobie zaimportować, a webpack
zadba o resztę, więc zaraz to powinno
działać. Uruchamiam raz jeszcze ten serwer i będziemy mogli z Axios skorzystać. Bardzo
łatwo, wystarczy napisać axios get, podać adres z którego chcemy coś pobrać
i mamy funkcje then, czyli promise gdzie będziemy mieli obiekt response i response kropka
data, to będą te dane. Jeżeli będzie bład, to wykona się block cache, więc sprawa jest
bardzo prosta, okej i teraz dlaczego ja chcę
to zrobić ten sposób. Po prostu chcę ci to pokazać do tej pory wstawialiśmy te
obrazki tutaj w app w mail w zasadzie
tutaj w app one były wstawione jako taka tablica. Ja bym teraz chciał żeby tej tablicy
tutaj nie było w data, Tylko żeby ta aplikacja mogła przyjąć prop
i żeby to prop to
było właśnie images i żeby to była tablica, taką walidację sobie wykonamy,
pytanie teraz jak tutaj przekazać prop. Możemy to zrobić z głównej aplikacji, czyli
tutaj w main, okej i tutaj gdzie to renderujemy możemy zrobić coś
takiego. Napisać props i przekazać
nazwę tego prop'a, ja tutaj się pospieszyłem, bo nie do końca chcę tutaj przyjmować od razu images,
więc wróćmy jeszcze do tej postaci, którą mieliśmy przed momentem, okej wytnę
sobie tylko te rzeczy, które są tutaj. Chciałbym żeby images to była pusta tablica, a jako
prop chciałbym przyjmować coś innego. Chciałbym, żeby to był adres, z którego sobie to będziemy
mogli pobrać, więc tutaj możemy napisać, że props to będzie
end point i żeby to był string, okej, pospieszyłem
się z myślami, tak będzie w porządku i tutaj będę chciał zaimportować sobie Axios
from axios, jeżeli coś importujemy, co
było zainstalowane z użyciem npm, to nie podajemy tutaj żadnej relatywnej ścieżki tylko
po prostu nazwę i z katalogu node modules będzie to podłączone. No i teraz z tego axiosa
można skorzystać. Mamy pustą tablicę images, która wiemy, że będzie przekazywana
do komponentu slideshow, czyli tam się po prostu nic nie wyświetli.
Sprawdźmy, tak też się dzieje, pokaz zdjęć. Co
my tutaj mamy, zerknijmy tak dokładnie, H1 i nic więcej, bo
mamy puste images, ona jest przekazywane do slideshow. On
tutaj otrzymał ten images, okej. No,
ale tak naprawdę nie wiedział co z tym zrobić, nie potrafię tego przekazać dalej, więc
tak to wygląda. Pytanie czy jakiś błąd się pojawił. Zgadza
się mamy błąd property url undefined, czyli żeby tego błędu nie było,
to może najpierw się tym zajmiemy. Spróbujmy zrobić coś takiego, że tutaj wszystko opleciemy
sobie tagiem template, możesz mieć template w template, czyli tak jak robiliśmy wcześniej
w tym kursie i zróbmy sobie v-if. Błąd się pojawił
dlatego, że że ten slajd próbuje się odwołać do active url, a ta computed property próbuje
to wyliczyć, ale tablica jest pusta i jest problem, więc zrobimy sobie v-if
i tym razem to już nie będzie tak jak wcześniej kiedy mieliśmy żywą templatkę
w DOM, że te elementy tam są później Vue je usuwa. Tutaj jeżeli zrobimy v-if, one
nigdy nie trafiają do DOM'u tak naprawdę i zrobimy sobie users
length, czyli tylko wtedy ten element będzie widoczny. Do
users mamy dostęp, nie jest to images, przepraszam, korzystaliśmy z użytkowników,
więc tak to zapamiętałem, teraz tego błędu
być już nie powinno. Zgadza się, czyli jeżeli tablica na początku będzie pusta nie będzie
błędu, ale ja ją chce uzupełnić wysyłając zapytanie Axios'em. Tylko,
że muszę wiedzieć gdzie go wysłać i stąd nie chcę tutaj na sztywno zapisywać url'a
tylko właśnie chciałem go zrobić w tym miejscu, dlatego tutaj podamy props endpoint
i tutaj będę chciał wstawić taki adres i to powinno nam
zwracać json'a oczywiście potwierdźmy czy na pewno jest adres poprawny. Jak
widzisz tak i zrobiłam mu jeszcze taką jedną rzecz, żeby zasymulować, że to chwilę
trwa. Jeżeli dodamy parametr wait równa się 1, to dwie sekundy serwer
poczeka, zanim nam podeśle te dane, więc chciałbym to zasymulować, bo czasami może to być bardzo szybko
przysyłane i nie będziemy widzieć wszystkich naszych rzeczy, czyli taki endpoint z
głównej instancji trafi do app, które
jest tutaj i to możemy zamknąć a tutaj w app otrzymamy to w props pod
endpoint i teraz w hook'u created będziemy
mogli za pomocą Axios wysłać zapytanie. Axios get this
endpoint i kiedy się uda pobrać
te dane, tutaj będzie funkcja taka strzałkowa, będziemy mieli response, można to zapisać skrótowo
tak i pod res kropka data będą te dane, więc chcę je przepisać do this images,
to będzie już tablica poprawnie ten json przez axios zostanie sparsowany, więc
this images chcę nadpisać tym co będzie w res data. Tyle
wystarczy, żeby wysłać takie zapytanie, natomiast wspomniałem, że można zintegrować axios
z Vue jeszcze bardziej, za pomocą Vue Axios i gdybyś tak zrobił
i ustawił na Vue tutaj w tej głównej aplikacji Vue
kropka use w ten sposób można używać używać plugin'ów, to wtedy w każdym komponencie,
który masz tutaj, w jego metodach mógłbyś korzystać z this http get
i to byłby alias do axios get. Możesz tak zrobić, poczytaj
sobie o tym natomiast tutaj mi wystarczy mieć zaimportowany axios, również to axios
mogę importować w innych komponentach, na przykład tutaj i ważne jest to, że
webpack nie będzie tego w wynikowym build'ie dwa razy wrzucał, tylko zadba o to, żeby axios
znalazło się tam wyłącznie raz, ale będzie działać poprawnie, czyli teraz
kiedy się utworzy taka aplikacja wysyłamy zapytanie pod endpoint i nadpisujemy images. To
wszystko działa reaktywnie, więc kiedy się nadpisze to również tutaj images length się
zmieni i powinno to wszystko zacząć działać poprawnie. Sprawdźmy, odświeżam.
Nic się nie dzieje rzeczywiście i później nam to wskakuje, więc
zrobimy jeszcze jedną kolejną rzecz w tym czasie kiedy nic się nie dzieje, czyli czekamy te
dwie sekundy na serwer. Będę chciał wyświetlić tutaj loader,
okej w jaki sposób możemy to zrobić. Przyjdziemy sobie dla slideshow
i tutaj tą klasę is loading dodawaliśmy i chciałbym
tutaj zrobić jeszcze jedną rzecz, czyli do tej klasy loading, jeżeli is loading, czyli wiem,
że po prostu preload obrazka robimy, bo to było od tego lub not
loaded. Możemy taki warunek zrobić, bo chciałem teraz tutaj dodać coś
takiego właśnie jak loaded i to będzie uznane
za false, również na początku, czyli że jeszcze aplikacja się nie wczytała. Jeszcze
ta tablica przekazana tutaj jest pusta, więc dopiero jak to się zmieni na true to
dopiero wtedy będę chciał zdjąć ten preloader, w
ogóle sprawdźmy jak to będzie wyglądać teraz. Mamy
taki preloander i kiedy się to załaduje to wtedy on powinien zniknąć, ale on nie
znika nigdy, bo nigdy nie zmieniamy tego loaded, więc jak
możemy sprawdzić, że tutaj z tej pustej na początku przekazanej tablicy coś
się zmieniło. Możemy sobie to obserwować, więc
gdybyśmy sobie dodali watch to dodajmy sobie watch,
który będzie obserwował naszą tablice, czyli images. To
jest funkcja i tutaj będzie new value i old value, nie wiem czy to pamiętasz, jak ci to pokazywałem,
czyli nowa wartość, to będzie ta nowa tablica, old value to będzie stara tablica, czyli
jeżeli stara tablica miała length zero, była pusta, a w nowej jest
jakiś length, to znaczy, że została wczytana. Ja sobie tak to wymyśliłem. Być może jest lepszy
sposób, żeby to zrobić i tutaj chciałbym wstawić taki fragment logiki, czyli
jeżeli tak jak mówiłem old value length jest zero, czyli poprzednia tablica miała wartość zero,
a moja ma więcej niż zero teraz, czyli została nadpisana to wtedy dopiero
będę chciał this loaded ustawić na true. Okej,
czekamy dwie sekundy i zniknął nam ten
preloader. Natomiast jest jeszcze jedna bardzo mam taka brzydka rzecz, może tego do końca nie
widzisz, ale w momencie kiedy to zmienimy this loaded na true to
wskakuje nam cała ta aplikacja i pierwszy obrazek, który
jest podłączony. On nie ma tego preload, bo mamy preload kiedy klikniemy strzałkę w prawo. Dopiero
wczytujemy drugi obrazek kiedy on się wczyta to go podstawiamy, a ten jest podstawiany
od razu i to widać, że on tak trochę brzydko wskakuje, zobaczmy i też
możemy na to zareagować oczywiście w nieskończoność nie będziemy rozwijać tej aplikacji, ale
pokażę ci jak ja bym to zrobił. W tym miejscu zanim zmienimy loaded na true to
chciałbym zrobić preload tego pierwszego obrazka i skoro już tutaj sobie zaimportowaliśmy
naszą funkcję pomocniczą to nic nie stoi na przeszkodzie, żeby zrobić preload image. Jako url
przekażemy mu this active url, czyli naszą computed property. Zobacz jak
to się fajnie wszystko składa i kiedy on zostanie wczytany, to
dopiero wtedy ustawię this loaded na wartość true. Super proste rzeczy dzięki
temu że stworzyliśmy taką funkcję pomocniczą. Odświeżam, po dwóch sekundach
mamy dane json i dopiero kiedy później załadujemy pierwszy obrazek to chcę go wstawić
na stronę. Może wizualnie akurat ty w tym kursie nie widzisz, że to jest jakaś duża różnica, ale
przy wolniejszym połączeniu gdybym go zasymulował, byłoby to widać, ten obrazek
się tutaj pojawia dopiero wtedy kiedy został pobrany, więc
tak mogłoby to wyglądać z użyciem Axios i myślę, że to
jest tyle w tej lekcji. Pamiętaj, że możesz
korzystać z dowolnej biblioteki Ajax'owej jakiej chcesz. Po prostu kiedy masz dane przypisz
je do tutaj akurat this images, ale do dowolnej właściwości, a wszystko
będzie reaktywne. Natomiast pamiętaj, że Axios możesz tak jak mówiłem tak skonfigurować,
że w metodach poprzez this http get będzie dostępny.
Natomiast ja nie będę tutaj tego robił. W kolejnej lekcji pokażę ci jeszcze jak do
naszej aplikacji dodać rauter, żeby slajdy, które będziemy zmieniać pokazywały
się również tutaj na pasku.