vue

30 out 2024

Um papo sobre composables e provide/inject

Na semana passada, falei sobre como evitar o prop drilling. Hoje, vamos focar em composables e composition API, mais especificamente no uso do provide/inject dentro deles e algumas outras considerações.

No exemplo do código abaixo, trago o uso do provide dentro de um composable. Nesse caso, temos basicamente uma função que faz uma requisição onMounted e disponibiliza o estado para qualquer componente descendente que precise dele. Em outras palavras, todo componente abaixo de onde esse composable foi chamado tem acesso aos dados via inject.

import { ref, provide, onMounted } from "vue"
import { myService } from "./services"

export function useUser() {
  const user = ref(null)
  const loading = ref(true)

  provide("get-user", { user, loading })

  const getUser = async () => {
    try {
      loading.value = true
      const response = await myService.getUser()
      user.value = response
    } catch (error) {
      console.error(error)
    } finally {
      loading.value = false
    }
  }

  onMounted(() => getUser())

  return { user, loading }
}

Supondo que a função getUser seja chamada dentro de um layout, todo componente rendizado em um slot, por exemplo, tem acesso à ref de user e loading. Assim, podemos exibir um estado de loading enquanto o usuário é carregado ou validado.

Dessa forma, centralizamos a lógica de estado e requisição, tornando a manutenção e organização do código mais simples.

Algo que demorei um pouco pra entender de fato é que composables não são somente funções para reutilização de código. Eles também podem ser extraídos para organização de features. À medida que a complexidade dos componentes cresce, acabamos com códigos grandes demais para entender. A composition API oferece muita flexibilidade para organizar essa bagunça em funções menores, baseadas em aspectos lógicos da aplicação. Depois de entender isso… 🤯

Outra estratégia (a que acabo usando mais) é exportar a função do composable, nesse caso, getUser, e chamar dentro da screen. Assim posso decidir entre client side ou server side rendering, dependendo do caso de uso e se estou ou não usando o Nuxt. O legal é saber da flexibilidade no uso dos composables e como podemos aumentar o encapsulamento de código utilizando eles.

E você, como tem usado composables e provide/inject dentro do Vue?