Bryt deg fri fra Vue Prop Drilling Med Provide/Inject

Vue tilbyr flere måter å administrere dataflyt og kommunikasjon mellom komponenter. En vanlig utfordring som Vue-utvikler er propellboring, hvor du sender data gjennom ulike lag med komponenter, noe som fører til en kompleks og mindre vedlikeholdbar kodebase.

Vue tilbyr forsynings-/injeksjonsmekanismen, en ren løsning for propellboring. Provide/inject hjelper til med å administrere datakommunikasjon mellom foreldre og dypt nestede barnekomponenter.

Forstå problemet med propellboring

Før du går i dybden med gi/injiser-løsningen, er det viktig å forstå problemet. Prop-drilling skjer når du trenger å sende data fra en overordnet komponent på toppnivå ned til en dypt nestet underordnet komponent.

De mellomliggende komponentene i dette hierarkiet må motta og videreformidle data, selv om de ikke bruker dem selv. For å overføre data fra en overordnet komponent til en underordnet komponent, må du sende disse dataene som rekvisitter til Vue-komponentene dine.

Tenk på følgende komponenthierarki som et eksempel:

Anta at data fra app-komponenten må nå GrandChildComponent. I så fall må du sende den gjennom de to mellomkomponentene ved hjelp av rekvisitter, selv om disse komponentene ikke trenger selve dataene for å fungere korrekt. Dette kan føre til oppblåst kode som er vanskeligere å feilsøke.

Hva er å gi/injisere?

Vue løser dette problemet med provide/inject-funksjonen, som lar en overordnet komponent gi data eller funksjoner til sine etterkommerkomponenter, uansett hvor dypt nestet de er. Denne løsningen forenkler datadeling og forbedrer kodeorganisering.

  Hva betyr "FOMO", og hvordan bruker du det?

Leverandørkomponent

En leverandørkomponent har til hensikt å dele data eller metoder med sine etterkommere. Den bruker alternativet for å gjøre disse dataene tilgjengelige for barna sine. Her er et eksempel på en leverandørkomponent:

 
<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>

Denne kodeblokken viser en leverandørkomponent, App, som gir en hilsenvariabel til alle dens etterkommerkomponenter. For å angi en variabel, må du angi en nøkkel. Å sette nøkkelen til samme navn som variabelen bidrar til å holde koden vedlikeholdbar.

Etterkommerkomponenter

Etterkommere komponenter er komponenter i en nestet struktur. De kan injisere og bruke de oppgitte dataene i sin komponentinstans. Slik gjøres det:

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

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

Den etterkommer-komponenten injiserer de oppgitte dataene og kan få tilgang til dem i sin mal som en lokalt definert variabel.

Tenk nå på bildet nedenfor:

I dette bildet kan du se et hierarki av fire komponenter, som begynner med en rotkomponent som fungerer som utgangspunkt. De andre komponentene hekker i hierarkiet, og ender i GrandChild-komponenten.

GrandChild-komponenten mottar dataene som App-komponenten gir. Med denne mekanismen på plass kan du unngå å sende data gjennom komponentene overordnet og underordnet, siden disse komponentene ikke trenger dataene for å fungere korrekt.

Levere data på app (globalt) nivå

Du kan gi data på appnivå med Vues provide/inject. Dette er et vanlig bruksområde for å dele data og konfigurasjon på tvers av forskjellige komponenter i Vue-applikasjonen din.

  Hva er en sublimasjonsskriver og hva kan du gjøre med en?

Her er et eksempel på hvordan du kan oppgi data på appnivå:

 

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

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

app.provide('globalConfig', globalConfig);

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

Anta at du har en applikasjon som krever et globalt konfigurasjonsobjekt som inneholder Application Programming Interface (API)-endepunkter, brukerautentiseringsinformasjon og andre innstillinger.

Du kan oppnå dette ved å oppgi konfigurasjonsdataene på toppnivåkomponenten, vanligvis i main.js-filen din, slik at andre komponenter kan injisere og bruke dem:

 <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>

Komponenten ovenfor bruker injeksjonsfunksjonen for å få tilgang til globalConfig-objektet, som appen tilbyr på globalt nivå. Du kan få tilgang til alle egenskaper eller innstillinger fra globalConfig ved å interpolere eller binde disse egenskapene med forskjellige databindingsteknikker i Vue i komponenten.

Fordeler og bruk av Provide and Inject

Her er noen fordeler og viktige bruksområder for å tilby/injisere-funksjonen når du lager nettapplikasjoner i Vue.

Renere og mer ytelsesoptimalisert kode

Ved å bruke provide/inject fjerner du behovet for mellomkomponenter for å overføre data de ikke bruker. Dette resulterer i renere og mer vedlikeholdbar kode ved å redusere unødvendige rekvisitterklæringer.

Vues reaktivitetssystem sørger også for at komponenter bare gjengis når deres avhengigheter endres. Provide/inject lar data deles effektivt, noe som kan føre til ytelsesoptimaliseringer ved å redusere unødvendig gjengivelse.

  Hvilken er bedre i 2023?

Forbedret komponentinnkapsling

Gi/injiser fremmer bedre komponentinnkapsling. Underordnede komponenter trenger bare å bekymre seg for dataene de bruker eksplisitt, noe som reduserer deres avhengighet av den spesifikke datastrukturen til overordnede komponenter.

Vurder en datovelgerkomponent som er avhengig av lokaliserte datoformatinnstillinger. I stedet for å overføre disse innstillingene som rekvisitter, kan du gi dem i den overordnede komponenten og injisere dem bare i datovelgerkomponenten. Dette fører til en klarere separasjon av bekymringer.

Dependency Injection

Provide/inject kan tjene som en enkel form for avhengighetsinjeksjon, som gjør globale tjenester og innstillinger – som API-klienter, endepunkter, brukerpreferanser eller datalagre – lett tilgjengelige for enhver komponent som trenger dem. Dette sikrer konsistente konfigurasjoner på tvers av appen din.

Viktige punkter å vurdere når du bruker Provide and Inject

Mens gi/injeksjonsmekanismen gir mange fordeler, bør du bruke den forsiktig for å unngå uønskede bivirkninger.

  • Bruk gi/injiser for å dele viktige data eller funksjoner som trengs på tvers av et komponenthierarki som konfigurasjon eller API-nøkler. Overbruk av det kan gjøre komponentforholdene dine for komplekse.
  • Dokumenter hva leverandørkomponenten gir og hvilke etterkommerkomponenter som skal injiseres. Dette hjelper deg med å forstå og vedlikeholde komponentene dine, spesielt når du jobber i team.
  • Vær forsiktig med å lage avhengighetsløkker, der en underordnet komponent gir noe som en overordnet komponent injiserer. Dette vil føre til feil og uventet oppførsel.

Er Gi/Injiser det beste alternativet for statlig ledelse i Vue?

Provide/inject er en annen nyttig funksjon i Vue for å administrere dataflyt og tilstand gjennom komponentene. Provide/inject kommer med sin del av ulemper. Gi/injiser kan føre til utfordringer med feilsøking, testing og vedlikehold av store applikasjoner.

Å bruke Pinia, Vues offisielle rammeverk for statsadministrasjon, ville være best for å håndtere komplekse tilstander i Vue-applikasjonen din. Pinia tilbyr en sentralisert butikk og typesikker tilnærming til statlig administrasjon, noe som gjør utviklingen av Vue-apper mer tilgjengelig.