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
Mam nadzieję, że jesteś razem ze mną na bieżąco, ta lekcja będzie na pewno krótsza
niż poprzednia. Dodamy sobie po prostu preloader zdjęć. Nie musielibyśmy tego
robić, ale skoro budujemy dosyć ciekawą aplikację dlaczego by nie. Widzi,
że ta aplikacja działa. Natomiast, jeżeli tutaj sobie w network zaznaczymy disable cache, odświeżamy
tą aplikację, tylko pierwsze zdjęcie się wczytało. Wszystko z pamięci podręcznej jest czyszczone,
jeżeli jest ta opcja, to jeżeli wybiorę sobie połączenie slow 3g i wczytam
kolejny obrazek, to jeżeli ja kliknę, to tak naprawdę my tutaj czekamy i jak
widzisz w network to widać. W zasadzie musielibyśmy zaznaczyć all albo
samo images, widzielibyśmy, że ten obrazek jest popierany i to chwilę trwa dopiero później
jest podmieniony. Ja chciałbym tutaj dodać preloader. Jeżeli ktoś ma wolniejsze połączenie
tutaj wrócimy do online żeby mieć szybkie to wtedy będziemy chcieli wyświetlić
taki preloader. No i teraz pytanie w jaki sposób można to zrobić. Chciałbym
najpierw w ogóle stworzyć sobie funkcję, która pozwala mi pozwoli mi wczytywać
obrazki. Będzie niezależna od Vue i chciałbym tutaj w src
utworzyć sobie katalog helpers, czyli jesteśmy w 55 src
helpers i helpers.js Chciałbym
mieć taką funkcję. Z niej mogę eksportować wiele różnych funkcji, takich pomocniczych,
będziemy mieli jedną, więc chciałbym zrobić export function reload
image, ona otrzyma url i chciałbym
tutaj zrobić rzecz następującą, otwórz nową promise, więc
tutaj widzisz, korzystamy z ES6, jeżeli znasz ten zapis to świetnie, na
początek może zanim stworzę promise, to jeszcze z użyciem const, stworzymy sobie
obrazek document create element w przeglądarce internetowej
stworzy mi obrazek i on nam posłuży do tego żeby wykonać preload, czyli
chciałbym mu przypisać atrybut src na url
przekazany do tej funkcji i wtedy przeglądarka mimo tego, że go nigdzie nie ma na stronie zacznie
pobierać ten obrazek i kiedy go pobierze to na tym obrazku
wykona się zdarzenie onload i będziemy
wiedzieli, że on jest pobrany i nic z nim kompletnie nie będziemy robić, ale wtedy wiemy, że możemy
ten sam url przypisać na stronę do dowolnego obrazka i przeglądarka drugi raz go
nie będzie pobierać z internetu, bo ma go już w pamięci podręcznej, ale musimy to zrobić w
jakiś inny sposób, to znaczy w ES6 chciałbym móc dać
znać z tej funkcji kiedy się uda taki obrazek pobrać. Dlatego,
że stworzymy sobie promise za pomocą new promise. Zapis EcmaScript6. Tutaj
będzie funkcja, która przyjmuje dwie funkcje resolve
i reject i w momencie kiedy wykonamy resolve to tak jakbyśmy dali znać,
że udało się coś z tej funkcji i wyrzucić, że generalnie, żeby był sukces
i to będzie asynchroniczne po jakimś czasie, więc ja chcę tutaj do tego obrazka przypisać
zdarzenie onload i kiedy ono się wykona. Wykonamy sobie
taką funkcję tutaj strzałkową na to zdarzenie, to chciałbym zrobić jeśli resolve i nic
nie muszę dalej przekazywać, ale możemy przekazać url tego obrazka, który właśnie się wczytał. Natomiast gdyby
był jakiś błąd, czyli img onerror. To są zdarzenia z przeglądarki po prostu, czyli
kiedy przeglądarka wczyta taki obrazek to odpali takie zdarzenie. Stąd ja mogę coś zrobić
kiedy to zdarzenie zostanie odpalone, zrobie reject z tym obrazkiem i
dopiero tutaj w momencie kiedy przypisuje do tego obrazka atrybut
src na url, przeglądarka zaczyna go pobierać. Kiedy go pobierze. Może
to być za trzy sekundy. Wykona zdarzenie onload, a ono wywoła reject,
która tutaj z prop mi zostanie przekazana, więc ostatnią rzeczą, którą chcę zrobić to zwrócić
promise z całego tego wyrażenia z całej tej funkcji. Chcę
zwrócić ten promise i tyle będziemy robić tutaj w helpers. Chcę sobie teraz tę
funkcję zaimportować w innym pliku i będę mógł ją wtedy wywołać w ten sposób, preload images, preload image.
Przekazać tutaj jakiś url. Ona zwraca promise, więc na promise mogę
się odwołać then i przepisać moją funkcję, która ma się wykonać wtedy,
kiedy ta promise zrobi resolve, czyli kiedy ten obrazek się wczyta, dopiero wtedy wykona
się to co będzie w bloku then podane jako moja funkcja, więc może to być po kilku sekundach. Wyeksportowałem
to z helpers, więc wrócimy sobie tutaj i będę chciał to zaimportować,
import i skoro to był nazywany import to nie był default, to
musimy go za pomocą takich nawiasów tutaj importować i podać dokładną nazwę preload image
i skąd chcemy to zaimportować. Jeden katalog wyżej z
komponentów helpers i helpers.js, ale
nie muszę pisać js, tutaj webpack sobie z tym poradzi, więc generalnie co ja zrobiłem.
Otóż mam dostęp do funkcji preload image w zupełnie innym pliku. No i o to nam
chodziło i teraz będę chciał właśnie wykonać to tutaj w change slide i
co dokładnie tutaj będziemy chcieli zrobić. Będę
chciał zrobić rzecz taką, że zanim przepiszę to active
to będę chciał ten obrazek pobrać, czyli będę
chciał mieć pewność, bo przypisanie active, przypomnę ci tylko co ono robiło jeżeli
przy piszemy this active równa się index, to tak naprawdę w tym pliku zostanie
podmieniony url i musimy poczekać aż ten obrazek się wczyta, bo przeglądarka otrzyma
taki url. Natomiast, jeżeli wykona mają funkcje preload image i wcześniej sobie go pobiorę. Moja promise
da mi znać, że jest zcache'owany ten obrazek to, jeżeli do tego wtedy przepisze
url, przeglądarka wczyta go z z pamięci podręcznej. Dlatego będę tutaj
chciał zrobić taką rzecz, preload image url, żeby mu przekazać,
to odwołam się do this images index i URL,
bo tam są obiekty, pamiętaj. Moja funkcja preload image zwraca promise, a skoro
zwraca promise to mogę do then przypisać co ma się wydarzyć kiedy
będzie tam resolve, czyli kiedy wykona się onload. Otrzymam tutaj url, które akurat
nie jest mi potrzebny, ale tak sobie zapisałem ten plik jak widziałeś,
tą funkcję, że zwraca mi z powrotem ten url i chcę wykonać taką
oto funkcje strzałkową. Tutaj dopiero chcę ustawić this active
na index. Kiedy ten obrazek na pewno jest już pobrany. Okej,
zobaczmy teraz jak to będzie wyglądać. Przechodzimy w to miejsce i zwolnimy
sobie połączenie internetowe. Klikam
dalej, preload się pewnie wykona i tutaj będziemy mogli zobaczyć, że active to jest cały czas
zero. Dopiero jak się wykona ten preload, teraz się to zmieniło na 1
i obrazek się wczytał od razu. Natomiast, żeby to było widać to będę chciał
tutaj jeszcze manipulować jedną rzeczą. Mianowicie w data dodamy sobie coś takiego jak is loading
i będzie to domyślnie miało wartość false. Natomiast w momencie kiedy
będziemy chcieli podmienić obrazek to this loading czy is
loading ustawimy na true, a kiedy on się wczyta, ustawimy
to z powrotem na false i teraz
za pomocą tego będzie mogli manipulować klasami CSS naszej templatce tutaj,
aby pokazać loader. No i teraz w jaki sposób
to zrobimy. Ja sobie tutaj wrzucę klasę. W zasadzie
ona działa ze spectre CSS, więc nie będziemy musieli tego robić. Zbindujemy tylko tutaj klasę,
czyli chcę przypisywać klasę, przypominam ci jak to działało, która się nazywa loading i
jeżeli is loading ma wartość true. Pytanie
czy to nam wystarczy. Sprawdźmy. Tutaj sobie odznaczę
z powrotem na online, żeby to szybko załadować i teraz zmienię z powrotem
na slow 3g, wciskam i jak widzisz taki mały
preloaderek się tutaj pojawił, bo ta kasa została dodana, więc chciałbym jeszcze wyszarzyć
może ten główny komponent, który tutaj mieliśmy i zrobimy to
w taki sposób, że tutaj do tego elementu chcę zbindować klasę i to
cię może zaskoczy, ale to nam powinno zadziałać. Będę chciał tutaj zbindować
sobie klasę dimmed, jeżeli is loading, bo
wiemy, że wewnątrz tego sllide nie mamy dostępu do is loading. Musiałbym to jako property przekazywać.
Natomiast, jeżeli przypiszemy do custom elementu, czyli do komponentu klasy, ona
powinna zostać przypisana bezpośrednio do pierwszego elementu w templatce tego slide, więc
przejdźmy sobie do slide i pierwszym elementem jest ten figure, czyli on po dostać klasę dimmed. Zatem
tutaj możemy na tą klasę zareagować w style, zrobimy sobie
może scoped i napiszemy dimmed. Jeżeli
jest dimmed to niech ma opacity pół i jeszcze
może do tego figure, przypiszemy transition
opacity zero dwie sekundy ease
in. Okej, zobaczymy czy to ma sens. Odświeżę tutaj raz
jeszcze tylko ważne żeby sobie to zmienić na online, żeby to nie trwało wiecznie ten
pierwszy obrazek, zmieniamy i działa jak widzisz pięknie. Teraz
ten preloader widać, bo wewnętrzny element otrzymał klasę dimmed, więc powinno
to zadziałać poprawnie. Tutaj transition jak zwykle napisałem źle, ale
jeżeli to napiszemy poprawnie to wtedy to będzie dużo ładniej wyglądać. Okej,
super. No i ostatnią rzeczą, którą chciałbym tutaj zrobić to to, że kiedy obrazek się wczytuje
kolejny, bo chciałbym żeby nie można było klikać na te przyciski, więc chciałbym żeby one
były wyłączone. Nic prostszego, mamy już taką funkcję
tutaj is loading i jest to w zasadzie nawet nie funkcja, tylko właściwość,
więc do naszych przycisków tutaj, gdzie robiliśmy disabled, wystarczy że dodamy taki
warunek. Jeżeli jesteśmy na końcu lub is loading i podobnie
zrobimy tutaj, okej zapisuje,
odświeżam tutaj raz jeszcze, zmieniając na online. Odświeżyło
się, zmieniam na slow 3g, klikam kolejny, przyciski są wyłączone, bo
is loading ma wartość true, to się nam wczytuje, kiedy się wczyta one oczywiście się
odblokują, obrazek wskakuje od razu, no i jak widzisz wszystko działa
jak należy. Znowu sporo rzeczy tutaj zrobiliśmy, prześledź sobie to na spokojnie,
natomiast w kolejnej lekcji będziemy jeszcze kontynuować pracę nad tym
ciekawym projektem.