Contents

Uwolnij się od Vue Prop Drilling dzięki Provide/Inject

Vue oferuje kilka sposobów zarządzania przepływem danych i komunikacją między komponentami. Częstym wyzwaniem dla deweloperów Vue jest prop drilling, w którym dane są przekazywane w dół przez różne warstwy komponentów, co prowadzi do złożonej i mniej łatwej w utrzymaniu bazy kodu.

Vue zapewnia mechanizm provide/inject, który służy jako eleganckie rozwiązanie do zarządzania komunikacją danych między komponentami nadrzędnymi i głęboko zagnieżdżonymi komponentami podrzędnymi dzięki możliwości wstrzykiwania zależności.

Zrozumienie problemu wiercenia perforacji

Przed zbadaniem środków zaradczych oferowanych przez metodologię dostarczania i wstrzykiwania, konieczne jest zrozumienie tej sytuacji. Wiercenie perforacyjne występuje zawsze, gdy istnieje wymóg przesyłania informacji z nadrzędnego komponentu nadrzędnego do wewnętrznie osadzonej jednostki podrzędnej.

Aby elementy pośredniczące w tej hierarchicznej strukturze spełniały swoje zadanie, konieczne jest, aby zarówno odbierały, jak i przesyłały dane, niezależnie od tego, czy je wykorzystują, czy nie. Aby przesłać informacje z elementu nadrzędnego do elementu podrzędnego, należy przekazać te dane jako właściwości do odpowiednich komponentów Vue.

Rozważmy wyżej wspomnianą hierarchiczną strukturę komponentów jako model, który służy do zilustrowania:

⭐ App

⭐ ParentComponent

⭐ ChildComponent

⭐GrandChildComponent

W niektórych przypadkach, gdy dane muszą zostać przesłane z komponentu App do GrandChildComponent, konieczne jest przesłanie tych informacji za pośrednictwemProps, niezależnie od tego, czy te komponenty pośredniczące wymagają takich danych do ich prawidłowego działania. W konsekwencji, praktyka ta może prowadzić do zwiększonego rozrostu kodu i utrudniać proces debugowania.

Co to jest Provide/Inject?

Vue rozwiązuje to wyzwanie za pomocą komponentu dostawcy

Komponent dostawcy służy jako źródło współdzielonych informacji i funkcjonalności dla swoich komponentów potomnych, wykorzystując opcję “provide” do przekazywania takich zasobów swojemu potomstwu. Weźmy na przykład następującą ilustrację komponentu Provider:

 <!-- App.vue -->
<template>
  <div>
    <!-- ... -->
    <ParentComponent/>
  </div>
</template>

<script setup>
import { provide } from 'vue';
import ParentComponent from './components/ParentComponent.vue';

const greeting = 'Hello from Provider';

provide('greeting', greeting);
</script>

Podany fragment opisuje komponent Provider w JavaScript, który dostarcza współdzielony stan lub wartość między jego komponentami potomnymi. Aby komponent mógł otrzymać te współdzielone dane, musi mieć przypisany unikalny identyfikator za pomocą atrybutu “key”. Przypisanie klucza o tej samej nazwie, co dostarczona zmienna, zwiększa ogólną czytelność i łatwość konserwacji bazy kodu.

Komponenty potomne

Dziedziczone lub zagnieżdżone komponenty posiadają zdolność do wykorzystywania i dostarczania danych za pośrednictwem odpowiednich instancji komponentów, które są klasyfikowane jako komponenty potomne. Osiąga się to poprzez wdrożenie niezbędnych kroków opisanych poniżej:

 <script setup>
import { inject } from 'vue';

const injectedData = inject('greeting');
</script>

Komponent potomny przekazuje dostarczone informacje i może je pobrać w swoim układzie jako lokalnie ograniczoną całość.

Rozważmy teraz poniższy obrazek:

/pl/images/screenhot-of-the-four-components-from-app-component-to-the-grandchild-component.jpg

W tym przedstawieniu istnieje struktura organizacyjna składająca się z czterech elementów składowych, rozpoczynająca się od elementu podstawowego działającego jako punkt początkowy. Pozostałe komponenty są ułożone hierarchicznie i kończą się w Podrzędnej Jednostce Potomnej.

Wykorzystując komponent GrandChild jako pośrednika między komponentem App a jego komponentami nadrzędnymi lub podrzędnymi, uzyskuje się bardziej wydajną metodę transmisji danych. Eliminuje to potrzebę przekazywania danych przez komponenty pośrednie, które nie wymagają ich do prawidłowego działania, usprawniając w ten sposób komunikację w aplikacji.

Dostarczanie danych na poziomie aplikacji (globalnym)

Funkcja provide/inject Vue pozwala na dostarczanie danych na poziomie aplikacji, co służy jako powszechna metodologia rozpowszechniania informacji i konfiguracji między różnymi komponentami rozproszonymi w całej aplikacji Vue.

Rozważmy następujący przypadek, w którym dane są dostarczane na całej platformie:

 // main.js

import { createApp } from 'vue'
import App from './App.vue'

const globalConfig = {
  apiUrl: 'https://example.com/api',
  authKey: 'my-secret-key',
  // Other configuration settings...
};

app.provide('globalConfig', globalConfig);

createApp(App).mount('#app')

Rozważmy scenariusz, w którym aplikacja wymaga kompleksowego repozytorium konfiguracji obejmującego różne aspekty, takie jak interfejsy programowania aplikacji (API), dane uwierzytelniające użytkownika i dodatkowe parametry.

Jednym z podejść do osiągnięcia tego celu jest włączenie informacji konfiguracyjnych jako właściwości głównego komponentu, często znajdującego się w pliku main.js, umożliwiając w ten sposób elementom pomocniczym dostęp do nich i ich wykorzystanie.

 <template>
  <div>
    <h1>API Settings</h1>
    <p>API URL: {{ globalConfig.apiUrl }}</p>
    <p>Authentication Key: {{ globalConfig.authKey }}</p>
  </div>
</template>

<script setup>
import { inject } from 'vue';

const globalConfig = inject('globalConfig');
</script>

Wyżej wymieniony komponent wykorzystuje funkcję inject , aby uzyskać dostęp do obiektu globalConfig , który jest dostarczany globalnie przez aplikację. Stosując różne techniki wiązania danych dostępne w Vue, można płynnie pobierać i manipulować dowolnymi właściwościami lub konfiguracjami przechowywanymi w obiekcie globalConfig .

Korzyści i zastosowania Provide and Inject

Dostarczanie usług przez funkcjonalność provide/inject Vue zapewnia kilka korzyści, w tym wydajną komunikację między komponentami i modułowość w tworzeniu aplikacji. Dodatkowo ułatwia współdzielenie danych między różnymi częściami aplikacji, co skutkuje bardziej usprawnioną i zorganizowaną bazą kodu.

Czystszy i bardziej zoptymalizowany pod kątem wydajności kod

Wykorzystując praktykę dostarczania lub wstrzykiwania zależności, możemy wyeliminować wymóg przekazywania przez komponenty pośredniczące danych, które nie są istotne dla ich funkcji. Takie podejście prowadzi do bardziej usprawnionej i łatwiejszej w zarządzaniu bazy kodu poprzez zminimalizowanie nadmiarowych deklaracji właściwości.

System reaktywności Vue został zaprojektowany w taki sposób, że komponenty są aktualizowane tylko wtedy, gdy zachodzą zmiany w powiązanych z nimi zależnościach. Mechanizm provided/inject ułatwia efektywne współdzielenie danych, co skutkuje zwiększoną wydajnością dzięki zminimalizowaniu niepotrzebnych renderowań.

Ulepszona hermetyzacja komponentów

Implementacja provide/inject zwiększa hermetyzację poszczególnych komponentów poprzez wymuszenie, aby komponenty podrzędne zajmowały się wyłącznie informacjami, które celowo wykorzystują. Zmniejsza to zależność tych komponentów od konkretnego układu danych ich elementów nadrzędnych.

Implementując element wyboru daty, który wykorzystuje lokalne preferencje formatowania daty, możliwe jest ustanowienie bardziej wyraźnego rozróżnienia między obawami poprzez dostarczenie tych konfiguracji za pośrednictwem komponentu obejmującego, a nie przekazywanie ich za pośrednictwem props. Takie podejście promuje lepszą spójność i modułowość.

Wstrzykiwanie zależności

Dostarczanie lub wstrzykiwanie zależności poprzez wstrzykiwanie zależności służy jako prosty sposób implementacji takich globalnych usług i konfiguracji, jak klienci API, punkty końcowe, preferencje użytkownika lub magazyny danych, które są łatwo dostępne dla każdego komponentu, który ich potrzebuje. Takie podejście pomaga zachować spójność w całej aplikacji.

Niezbędne punkty do rozważenia podczas korzystania z metody Provide and Inject

Pomimo licznych korzyści, należy zachować ostrożność podczas korzystania z metody dostarczania i wstrzykiwania, aby zapobiec wystąpieniu niezamierzonych konsekwencji.

Wykorzystanie metody provide/inject ma kluczowe znaczenie dla rozpowszechniania istotnych informacji i funkcji, które przechodzą przez całą strukturę hierarchiczną, takich jak konfiguracje lub kluczowe interfejsy API. Jednak nadmierne poleganie na tej metodzie może skutkować zbyt skomplikowanymi powiązaniami między komponentami.

Aby ułatwić zrozumienie i utrzymanie poszczególnych komponentów, szczególnie w środowiskach współpracy, ważne jest udokumentowanie usług świadczonych przez element nadrzędny i zależności wymaganych przez elementy podrzędne.

Zaleca się zachowanie ostrożności podczas ustanawiania zależności kołowych między komponentami, szczególnie w przypadkach, gdy komponent podrzędny dostarcza element, który jest następnie wykorzystywany przez jego komponent nadrzędny. Takie ustalenia mogą skutkować nieprzewidzianymi problemami i nieprawidłowym działaniem.

Czy Provide/Inject jest najlepszą opcją do zarządzania stanem w Vue?

Jedną z godnych uwagi zalet funkcji Vue provide i inject jest ich zdolność do ułatwiania efektywnego zarządzania przepływem danych i stanem aplikacji w różnych komponentach. Korzyści te nie są jednak pozbawione wad, ponieważ wykorzystanie provide i inject może powodować trudności w zakresie debugowania, testowania i utrzymywania złożonych systemów oprogramowania.

Pinia, cenione rozwiązanie do zarządzania stanami dla aplikacji Vue, oferuje kompleksową i dobrze zorganizowaną metodologię obsługi skomplikowanych stanów w tych programach. Scentralizowane repozytorium i bezpieczny typograficznie system dostarczany przez Pinia upraszcza proces tworzenia aplikacji Vue, jednocześnie zwiększając dostępność i wydajność.