Contents

Liberte-se da perfuração de prumos Vue com Provide/Inject

O Vue oferece várias formas de gerir o fluxo de dados e a comunicação entre componentes. Um desafio comum como programador Vue é o prop drilling, em que os dados são transmitidos através de várias camadas de componentes, o que leva a uma base de código complexa e de menor manutenção.

O Vue fornece o mecanismo provide/inject, que serve como uma solução elegante para gerenciar a comunicação de dados entre componentes pai e filhos profundamente aninhados por meio de seus recursos de injeção de dependência.

Entendendo o problema da perfuração de prumos

Antes de explorar as soluções oferecidas pela metodologia de fornecimento e injeção, é imperativo compreender a situação em questão. A perfuração ocorre sempre que existe a necessidade de transmitir informações de um componente pai de nível superior para uma entidade filha intrinsecamente incorporada.

Para que os elementos intermédios desta estrutura hierárquica cumpram o seu objetivo, é necessário que recebam e transmitam dados, independentemente de os utilizarem ou não. Para transferir informações de um elemento pai para um elemento filho, é necessário fornecer esses dados como propriedades aos seus respectivos componentes Vue.

Considere a estrutura hierárquica de componentes acima mencionada como um modelo, que serve para ilustrar:

⭐ App

⭐ ParentComponent

⭐ ChildComponent

⭐GrandChildComponent

Em certos casos em que os dados devem ser transmitidos de um componente App para um GrandChildComponent, é necessário transmitir essas informações viaProps, independentemente de esses componentes intermediários necessitarem ou não de tais dados para sua funcionalidade adequada. Consequentemente, esta prática pode resultar num aumento do inchaço do código e dificultar o processo de depuração.

O que é Provide/Inject?

O Vue resolve esse desafio por meio do componente provedor

Um componente provedor serve como fonte de informações e funcionalidades compartilhadas para seus componentes filhos, utilizando a opção “provide” para transmitir esses recursos para seus descendentes. Veja, por exemplo, a seguinte ilustração de um componente provedor:

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

A passagem dada descreve um componente provedor em JavaScript, que fornece um estado ou valor compartilhado entre seus componentes filhos. Para que um componente receba estes dados partilhados, tem de lhe ser atribuído um identificador único utilizando o atributo “chave”. Ao atribuir a chave com o mesmo nome que a variável fornecida, melhora a legibilidade geral e a facilidade de manutenção da base de código.

Componentes descendentes

Os componentes herdados ou aninhados possuem a capacidade de utilizar e fornecer dados através das respectivas instâncias de componentes, que são classificadas como componentes descendentes. Isto é conseguido através da implementação dos passos necessários descritos abaixo:

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

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

O componente descendente incorpora as informações fornecidas e pode recuperá-las no seu layout como uma entidade delimitada localmente.

Agora, considere a imagem abaixo:

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

Nesta representação, existe uma estrutura organizacional composta por quatro elementos constituintes, começando por um elemento fundamental que funciona como ponto de partida. Os restantes componentes estão dispostos hierarquicamente e culminam na entidade Descendência Subordinada.

Ao utilizar o componente GrandChild como intermediário entre o componente da aplicação e os seus componentes pai ou filho, consegue-se um método mais eficiente de transmissão de dados. Isto elimina a necessidade de os dados serem passados através de componentes intermédios que não necessitam deles para uma funcionalidade adequada, simplificando assim a comunicação dentro da aplicação.

Fornecimento de dados ao nível da aplicação (global)

A funcionalidade de fornecer/injetar do Vue permite o fornecimento de dados ao nível da aplicação, que serve como uma metodologia predominante para a disseminação de informações e configurações entre vários componentes intercalados na aplicação Vue.

Considere a seguinte instância em que os dados são fornecidos em toda a plataforma:

 // 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')

Considere um cenário em que uma aplicação necessita de um repositório de configuração abrangente que engloba várias facetas, como interfaces de programação de aplicações (APIs), credenciais de autenticação do utilizador e parâmetros adicionais.

Uma abordagem para conseguir isso é incorporar as informações de configuração como uma propriedade do componente primário, frequentemente encontrado no arquivo main.js, permitindo assim que elementos subsidiários acessem e utilizem essas informações.

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

O componente acima mencionado utiliza a função inject para obter acesso ao objeto globalConfig , que é fornecido globalmente pela aplicação. Utilizando várias técnicas de ligação de dados disponíveis no Vue, é possível obter e manipular sem problemas quaisquer propriedades ou configurações armazenadas no objeto globalConfig .

Benefícios e utilizações de Provide e Inject

O fornecimento de serviços pela funcionalidade provide/inject do Vue permite várias vantagens, incluindo a comunicação eficiente entre componentes e a modularidade no desenvolvimento de aplicações. Além disso, facilita a partilha de dados entre diferentes partes de uma aplicação, resultando numa base de código mais simplificada e organizada.

Código mais limpo e optimizado em termos de desempenho

Ao utilizar a prática de fornecer ou injetar dependências, podemos eliminar a necessidade de os componentes intermediários transmitirem dados que não são relevantes para a sua função. Essa abordagem leva a uma base de código mais simplificada e gerenciável, minimizando declarações de propriedade redundantes.

O sistema de reatividade do Vue foi concebido de forma a que os componentes sejam actualizados apenas quando existem alterações nas suas dependências associadas. O mecanismo provided/inject facilita a partilha eficiente de dados, resultando num desempenho melhorado através da minimização de renderizações desnecessárias.

Encapsulamento aprimorado de componentes

A implementação de fornecer/injetar aprimora o encapsulamento de componentes individuais, exigindo que os componentes filhos se preocupem apenas com as informações que utilizam intencionalmente. Isto reduz a dependência destes componentes em relação à disposição particular dos dados dos seus elementos-mãe.

Ao implementar um elemento de seleção de datas que utiliza preferências de formatação de datas específicas da localidade, é possível estabelecer uma distinção mais pronunciada entre as preocupações, fornecendo estas configurações através do componente englobante, em vez de as transmitir viaprops. Esta abordagem promove uma maior coesão e modularidade.

Injeção de dependências

O fornecimento ou injeção de dependências através da injeção de dependências serve como um meio simples para implementar serviços e configurações globais como clientes API, pontos finais, preferências do utilizador ou armazenamentos de dados, que estão prontamente acessíveis a qualquer componente que deles necessite. Esta abordagem ajuda a manter a consistência em toda a aplicação.

Pontos essenciais a considerar ao usar Provide and Inject

Apesar de seus inúmeros benefícios, é preciso ter cuidado ao empregar o método de provisão e injeção para evitar consequências indesejadas.

A utilização de provide/inject é crucial na disseminação de informações vitais e funcionalidades que atravessam toda uma estrutura hierárquica, como configurações ou APIs chave. No entanto, a dependência excessiva deste método pode resultar em inter-relações demasiado complexas entre componentes.

Para facilitar a compreensão e a manutenção de componentes individuais, particularmente em ambientes colaborativos, é importante documentar os serviços fornecidos pelo elemento principal e as dependências exigidas pelos seus elementos subordinados.

É aconselhável ter cuidado ao estabelecer dependências circulares entre componentes, particularmente nos casos em que um componente filho fornece um elemento que é posteriormente utilizado pelo seu componente pai. Tais disposições podem resultar em problemas imprevistos e mau funcionamento.

Provide/Inject é a melhor opção para gerenciamento de estado em Vue?

Uma vantagem notável fornecida pelos recursos provide e inject do Vue é sua capacidade de facilitar o gerenciamento eficiente do fluxo de dados e do estado da aplicação em vários componentes. No entanto, estes benefícios não são isentos de desvantagens, uma vez que a utilização de provide e inject pode apresentar dificuldades em termos de depuração, teste e manutenção de sistemas de software complexos.

Pinia, uma solução de gestão de estados estimada para aplicações Vue, oferece uma metodologia abrangente e bem estruturada para lidar com estados complexos nestes programas. O repositório centralizado e o sistema tipograficamente seguro fornecido pela Pinia simplificam o processo de criação de aplicações Vue, melhorando a acessibilidade e a eficiência.