Miniatura artykułu

Vue 3 - Teleport

5 minut

Skopiuj link

Data publikacji: 11/27/2023, 8:51:16

Ostatnia aktualizacja: 4/19/2024

Wprowadzenie

Teleport to jedna z kluczowych nowości wprowadzonych w Vue 3, która pozwala deweloperom na przenoszenie części szablonów komponentów do innych miejsc w DOM, zachowując przy tym całą reaktywność i zachowanie Vue. Rozwiązuje to szereg problemów, z którymi programiści borykali się od dawna, takich jak wyświetlanie modali, toastów czy tooltipów, które z natury wymagają, by były renderowane poza swoim rodzimym kontekstem komponentu.

Teleport

Często spotkamy się z problemem, gdzie chcemy wyświetlić jakąś zawartość użytkownikowi w osobnym oknie (dialog, toast, tooltip), jednocześnie zachowując logikę odpowiedzialną za wyświetlanie i przekazanie odpowiednich danych.

Składnia

Teleport jest wbudowanym komponentem, który używa specjalnego tagu <teleport>. Jego składnia jest prosta i wymaga określenia atrybutu to, który wskazuje selektor CSS miejsca docelowego w DOM.

W powyższym przykładzie, jako miejsce wystąpienia przykładowej zawartości wskazujemy body, zauważ, że jest to oznaczenie tagu body. Gdybyś chciał wyświetlić zawartość w innym, określonym przez Ciebie miejscu, np. tworząc dodatkowy <div> w pliku index.html o id="modal", możesz to oczywiście zrobić, lecz wtedy Twój teleport, powinien wskazywać na element o id="modal", co podczas wybierania precyzujemy poprzez #

Jak działa "pod maską"?

Podstawowa idea działania jest stosunkowo prosta – Vue renderuje zawartość komponentu <teleport> nie w miejscu jego deklaracji w szablonie, lecz w lokalizacji wskazanej przez atrybut to. Cały proces jest obsługiwany przez Vue, co oznacza, że pomimo fizycznego przeniesienia elementów w inne miejsce w drzewie DOM, reaktywność danych i zachowanie komponentu pozostaje nienaruszone.

Dzieje się tak, ponieważ Vue traktuje teleportowaną zawartość jako fragment swojego wirtualnego DOM i nadal zarządza nim w standardowy sposób. To pozwala na bezproblemowe użycie wszystkich standardowych funkcjonalności, takich jak wiązanie danych czy obsługa zdarzeń, bez obawy o utratę kontekstu.

Zastosowanie

Kiedy, możemy chcieć użyć teleportu? Poniżej wymienię kilka najbardziej popularnych i praktycznych zastosowań:

  • modal - klasyczny przykład komponentu, który chcemy wyrenderować w taki sposób, aby uniknąć problemów z CSS. Zazwyczaj chcemy, aby był on wyświetlony razem z backdropem przysłaniającym resztę aplikacji i wymagającym interakcji od użytkownika. Teleport pozwoli Ci przenieść przygotowany komponent w odpowiednie miejsce, np. body lub inny przygotowany przez Ciebie kontener do tego przeznaczony. Przykłady podane w sekcji dotyczącej składni, idealnie to przedstawiają.

  • dropdown - znany także jako rozwijane menu lub lista rozwijana, to komponent, który pozwala użytkownikowi na wybór jednej z wielu opcji. Dropdown jest standardowym elementem formularzy, gdzie użytkownik może wybrać wartość z listy. Mogą być również używane do nawigacji, prezentując listę możliwych do przejścia miejsc w aplikacji (tak jak w menu nawigacyjnym).

  • powiadomienia - tworzenie globalnego systemu powiadomień staje się dużo prostsze z użyciem teleportu. Możesz dynamicznie przenosić powiadomienia do globalnego kontenera przeznaczonego na powiadomienia, niezależnie od tego, gdzie w aplikacji są wywoływane.

Oczywiście istnieje wiele innych zastosowań, ale główne założenie jest takie samo. Celem jest przechwycenie teleportowanej zawartości i umieszczeniu jej w pożądanym miejscu, bardzo często wyodrębniając do osobnego kontenera, aby nie zaburzyć layout aplikacji.

Zachowanie

Wcześniej wspominałem, że zachowanie komponentu pozostaje nienaruszone, chcę to nieco rozwinąć. Generalnie chodzi o to, że zmiany w danych są na bieżąco odzwierciedlane w miejscu docelowym, dzięki czemu stan aplikacji pozostaje spójny.

Przeniesione komponenty wciąż mają dostęp do swojego lokalnego stanu, props, slotów i zdarzeń, co pozwala na ich normalne funkcjonowanie, nawet po przeniesieniu do innej części DOM.

Jeśli chodzi o routing np. zarządzany przez Vue Router, warto zwrócić uwagę na zarządzanie historią i stanem podczas nawigacji między różnymi widokami.

Teleport wspiera także animacje Vue, pozwalając na płynne dodawanie i usuwanie przenoszonych komponentów z użyciem elementu <transition>.

Podsumowanie

W odpowiednich rękach, Teleport może posłużyć, jako bardzo dobre rozwiązanie do tworzenia czystych, reaktywnych i dostępnych interfejsów.

Zachęcam do eksperymentowania z Teleportem, aby w pełni wykorzystać jego potencjał i znaleźć nowe, kreatywne sposoby na rozwiązywanie typowych problemów w Twoich aplikacjach. W końcu, najlepsze praktyki i najbardziej efektywne zastosowania rodzą się z praktycznego doświadczenia i ciągłego uczenia się.

Avatar: Maciej Mikołajczak

Front-end Developer

Maciej Mikołajczak

mcj.mikolajczak@gmail.com

Podziel się na

Dodaj komentarz

Komentarze (0)

Brak komentarzy