Injeção de dependência no Vue
A comunicação de dados entre componentes é essencial ao escalar uma aplicação Vue. Normalmente utilizamos props para passar informações do elemento pai para o filho, porém em árvores de componentes muito profundas se torna complicado. Imagine um trem no qual o primeiro vagão precisa enviar uma mensagem para uma vagão três posições à frente. Em vez de passar informação de vagão, uma comunicação direta seria mais eficiente. No Vue isso é possível com provide
e inject
, permitindo que um componente disponibilize dados para seus descendentes sem precisar repassá-los manualmente.
// Elemento Pai
<script setup>
import { provide } from 'vue'
provide('message', 'Salve');
const foo = ref('bar');
provide('fooBar', foo);
</script>
// filho 3
<script setup>
import { inject } from 'vue'
const message = inject('message'); // Salve
const fooBar = inject('fooBar'); // bar
</script>
Também tem a possibilidade de o elemento filho alterar o valor do provide, para alterar tem que atribuir o novo valor igualmente a um ref
. Porém é recomendável manter as alterações de estado dentro do elemento provider.
<script setup>
import { inject } from 'vue'
const fooBar = inject('fooBar'); // bar
</script>
<template>
<div>
<button @click="fooBar = 'foo'">{{ fooBar }}</button> // foo
</div>
</template>
Adicionando reatividade
// dentro do elemento provider
<script setup>
import { provider, ref } from 'vue'
const sentimento = ref('raiva');
function alteraSentimento () {
sentimento.value = 'feliz'
}
provide('sentimento',
sentimento,
alteraSentimento
)
</script>
// dentro do component de injeção
<script setup>
import { injection } from 'vue'
const { sentimento, alteraSentimento } = inject('sentimento');
</script>
<template>
<button @click="alteraSentimento">{{ sentimento }}</button>
</template>
Provide
e Inject
é uma ferramenta poderosa para gerenciar dados em componentes profundamente aninhados, resolvendo o props drilling. Embora seja uma solução prática, é importante saber dosar e em alguns casos mais complexos preferir outras abordagens como Pinia e composables.