Saltar al contenido

Los composables son una nueva característica de Vue 3 que permiten a los desarrolladores escribir código de manera más clara y concisa. Los composables son funciones que devuelven objetos de composición y se pueden utilizar para encapsular lógica de negocios y comportamiento de componentes.

Por ejemplo, en lugar de tener que escribir todo el código necesario para hacer una llamada a una API en el componente, puedes crear un composable que contenga esa lógica y llamar al composable desde el componente. Esto hace que el código sea más fácil de leer y mantener.

Los composables también se pueden utilizar para crear componentes reutilizables que se pueden importar y utilizar en diferentes partes de la aplicación. Por ejemplo, si tienes un composable que se encarga de hacer una llamada a una API y obtener datos, puedes utilizar ese composable en diferentes componentes para mostrar los datos en diferentes partes de la aplicación.

Composable en Vue 3 para obtener productos

Supongamos que queremos crear un componente que muestre información sobre un producto en nuestra aplicación. Para obtener la información del producto, necesitamos hacer una llamada a una API. En lugar de escribir toda la lógica necesaria para hacer la llamada a la API en el componente, podemos crear un composable que se encargue de esa tarea y llamar al composable desde el componente.

Aquí tienes cómo podría verse este composable en Vue 3:

import { ref } from 'vue'
import axios from 'axios'

export function useProductInfo() 
{
  const productInfo = ref({})
  const isLoading = ref(false)
  const error = ref(null)

  async function fetchProductInfo(productId) 
  {
    isLoading.value = true
    try {
      const response = await axios.get(`/api/products/${productId}`)
      productInfo.value = response.data
    } catch (e) {
      error.value = e
    } finally {
      isLoading.value = false
    }
  }

  return {
    productInfo,
    isLoading,
    error,
    fetchProductInfo
  }
}

El composable useProductInfo utiliza la función "ref" de Vue 3 para crear una variable reactiva que se actualizará automáticamente cuando cambie su valor. También tiene una función asíncrona "fetchProductInfo" que hace una llamada a la API y actualiza la variable "productInfo" con la información del producto obtenida de la respuesta de la API.

Para utilizar este composable en un componente, podemos hacerlo de la siguiente manera:

import { useProductInfo } from '@/composables/useProductInfo'

<script setup>
const { productInfo, isLoading, error, fetchProductInfo } = useProductInfo()

fetchProductInfo(1)
</script>

<template>
  <div v-if="isLoading">Obteniendo información del producto...</div>
  
  <div v-else>
    <div v-if="productInfo">
      {{ productInfo }}
    </div>
    <div v-if="error">
      {{ error }}
    </div>
  </div>
</template>

En este ejemplo, hemos importado el composable "useProductInfo" y lo hemos utilizado en el componente "ProductInfo". Podemos acceder a las variables y funciones del composable como si fueran propiedades y métodos del componente. Por ejemplo, podemos utilizar la función "fetchProductInfo" para hacer la llamada a la API y mostrar la información del producto en el componente.

Composable Paginación en Vue 3

Aquí tienes otro ejemplo de cómo podrías utilizar un composable para implementar un sistema de paginación en una aplicación de Vue 3:

Primero, crearemos un composable que se encargue de obtener los datos de la página actual y los datos de las páginas siguientes:

import { ref } from 'vue'
import axios from 'axios'

export function usePagination(url) 
{
  const page = ref(1)
  const data = ref([])
  const isLoading = ref(false)
  const hasMore = ref(true)
  const error = ref(null)

  async function fetchPage() {
    isLoading.value = true
    try {
      const response = await axios.get(`${url}?page=${page.value}`)
      data.value = [...data.value, ...response.data]
      hasMore.value = response.data.length === 10
      page.value++
    } catch (e) {
      error.value = e
    } finally {
      isLoading.value = false
    }
  }

  return {
    data,
    isLoading,
    hasMore,
    error,
    fetchPage
  }
}

El composable usePagination tiene una función "fetchPage" que hace una llamada a la API y obtiene los datos de la página actual y los datos de las páginas siguientes. También tiene una variable "hasMore" que indica si hay más páginas disponibles para cargar.

A continuación, podemos utilizar este composable en un componente para mostrar los datos y la paginación:

<script setup>
import { usePagination } from '@/composables/usePagination'

const { data: products, isLoading, hasMore, error, fetchPage: fetchProducts } = usePagination('/api/products')

fetchProducts()
</script>

<template>
  <ul>
    <li v-for="product in products" :key="product.id">{{ product.name }}</li>
  </ul>
  <button v-if="hasMore" @click="fetchProducts">Cargar más</button>
</template>

Con este enfoque, podemos implementar la paginación de manera sencilla utilizando composables en Vue 3.


Si quieres seguir aprendiendo más cosas sobre Vue 3 y Composition API, no te pierdas la ruta de aprendizaje.

Rutas de aprendizaje