Español

Explora a fondo la Composition API de Vue.js 3. Aprende a crear aplicaciones Vue.js reutilizables, mantenibles y testeables con ejemplos prácticos y mejores prácticas para desarrolladores de todo el mundo.

Composition API de Vue.js 3: Una Inmersión Profunda para Desarrolladores Globales

Vue.js se ha convertido rápidamente en una opción popular para crear aplicaciones web modernas, gracias a su curva de aprendizaje accesible y sus potentes características. Vue.js 3 lleva esto más allá con la introducción de la Composition API, una nueva forma de organizar la lógica de tus componentes. Esta inmersión profunda proporciona una guía completa para entender y utilizar la Composition API de manera efectiva, equipándote con las habilidades para construir aplicaciones Vue más mantenibles, reutilizables y testeables.

¿Qué es la Composition API?

La Composition API es un conjunto de APIs que nos permiten crear componentes de Vue utilizando funciones importadas en lugar de declarar opciones. Esencialmente, te permite agrupar lógica relacionada, sin importar dónde aparezca en la plantilla. Esto contrasta con la Options API (data, methods, computed, watch), que te obliga a organizar el código según estas categorías predefinidas. Piensa en la Options API como una forma de organizar tu código por *lo que es* (datos, método, etc.), mientras que la Composition API te permite organizar el código por *lo que hace*.

El núcleo de la Composition API gira en torno a la función setup(). Esta función es el punto de entrada para utilizar la Composition API dentro de un componente. Dentro de setup(), puedes definir estado reactivo, propiedades computadas, métodos y hooks de ciclo de vida utilizando funciones "componibles" (composables).

¿Por qué usar la Composition API?

La Composition API ofrece varias ventajas sobre la tradicional Options API, particularmente para aplicaciones más grandes y complejas:

Entendiendo los Conceptos Fundamentales

Vamos a sumergirnos en los conceptos clave que sustentan la Composition API:

1. setup()

Como se mencionó anteriormente, setup() es el punto de entrada para usar la Composition API. Es una opción del componente que se ejecuta antes de que se cree el componente. Dentro de setup(), defines el estado reactivo, las propiedades computadas, los métodos y los hooks del ciclo de vida, y luego devuelves un objeto que contiene los valores que quieres exponer a la plantilla.

Ejemplo:

import { ref } from 'vue'

export default {
  setup() {
    const count = ref(0)

    const increment = () => {
      count.value++
    }

    return {
      count,
      increment
    }
  }
}

En este ejemplo, estamos usando ref para crear una variable reactiva llamada count. También definimos un método llamado increment que aumenta el valor de count. Finalmente, devolvemos un objeto que contiene count e increment, lo que los hace disponibles en la plantilla del componente.

2. Estado Reactivo con ref y reactive

La Composition API proporciona dos funciones principales para crear estado reactivo: ref y reactive.

Ejemplo usando ref:

import { ref } from 'vue'

export default {
  setup() {
    const message = ref('Hola, Vue!')

    const updateMessage = (newMessage) => {
      message.value = newMessage
    }

    return {
      message,
      updateMessage
    }
  }
}

Ejemplo usando reactive:

import { reactive } from 'vue'

export default {
  setup() {
    const state = reactive({
      name: 'John Doe',
      age: 30
    })

    const updateName = (newName) => {
      state.name = newName
    }

    return {
      state,
      updateName
    }
  }
}

3. Propiedades Computadas con computed

Las propiedades computadas son valores que se derivan de otro estado reactivo. Se actualizan automáticamente cada vez que sus dependencias cambian. La función computed toma una función "getter" como argumento y devuelve un ref reactivo de solo lectura.

Ejemplo:

import { ref, computed } from 'vue'

export default {
  setup() {
    const firstName = ref('John')
    const lastName = ref('Doe')

    const fullName = computed(() => {
      return `${firstName.value} ${lastName.value}`
    })

    return {
      firstName,
      lastName,
      fullName
    }
  }
}

En este ejemplo, fullName es una propiedad computada que depende de firstName y lastName. Cada vez que firstName o lastName cambien, fullName se actualizará automáticamente.

4. Observadores (Watchers) con watch y watchEffect

Los observadores te permiten reaccionar a los cambios en el estado reactivo. La Composition API proporciona dos formas principales de crear observadores: watch y watchEffect.

Ejemplo usando watch:

import { ref, watch } from 'vue'

export default {
  setup() {
    const count = ref(0)

    watch(
      count,
      (newValue, oldValue) => {
        console.log(`El contador cambió de ${oldValue} a ${newValue}`)
      }
    )

    const increment = () => {
      count.value++
    }

    return {
      count,
      increment
    }
  }
}

Ejemplo usando watchEffect:

import { ref, watchEffect } from 'vue'

export default {
  setup() {
    const message = ref('Hola')

    watchEffect(() => {
      console.log(`El mensaje es: ${message.value}`)
    })

    const updateMessage = (newMessage) => {
      message.value = newMessage
    }

    return {
      message,
      updateMessage
    }
  }
}

5. Hooks del Ciclo de Vida

La Composition API proporciona acceso a los hooks del ciclo de vida del componente a través de funciones que comienzan con on, como onMounted, onUpdated y onUnmounted. Estas funciones toman un "callback" como argumento, que se ejecutará cuando se active el hook del ciclo de vida correspondiente.

Ejemplo:

import { onMounted, onUnmounted } from 'vue'

export default {
  setup() {
    onMounted(() => {
      console.log('Componente montado')
    })

    onUnmounted(() => {
      console.log('Componente desmontado')
    })

    return {}
  }
}

Creando Funciones "Componibles" (Composables)

El verdadero poder de la Composition API proviene de la capacidad de crear funciones "componibles" reutilizables. Una función "componible" es simplemente una función que encapsula una pieza de lógica de componente y devuelve estado reactivo y funciones que pueden ser utilizadas en múltiples componentes.

Ejemplo: Vamos a crear una función "componible" que rastrea la posición del ratón:

import { ref, onMounted, onUnmounted } from 'vue'

export function useMousePosition() {
  const x = ref(0)
  const y = ref(0)

  const updatePosition = (event) => {
    x.value = event.clientX
    y.value = event.clientY
  }

  onMounted(() => {
    window.addEventListener('mousemove', updatePosition)
  })

  onUnmounted(() => {
    window.removeEventListener('mousemove', updatePosition)
  })

  return {
    x,
    y
  }
}

Ahora, puedes usar esta función "componible" en cualquier componente:

import { useMousePosition } from './useMousePosition'

export default {
  setup() {
    const { x, y } = useMousePosition()

    return {
      x,
      y
    }
  }
}

Ejemplos Prácticos y Casos de Uso

Exploremos algunos ejemplos prácticos de cómo se puede utilizar la Composition API en escenarios del mundo real:

1. Obtención de Datos

Crear una función "componible" para obtener datos de una API es un caso de uso común. Esto te permite reutilizar la misma lógica de obtención de datos en múltiples componentes.

import { ref, onMounted } from 'vue'

export function useFetch(url) {
  const data = ref(null)
  const error = ref(null)
  const loading = ref(true)

  onMounted(async () => {
    try {
      const response = await fetch(url)
      data.value = await response.json()
    } catch (err) {
      error.value = err
    } finally {
      loading.value = false
    }
  })

  return {
    data,
    error,
    loading
  }
}

Luego puedes usar esta función "componible" en tus componentes de esta manera:

import { useFetch } from './useFetch'

export default {
  setup() {
    const { data, error, loading } = useFetch('https://api.example.com/data')

    return {
      data,
      error,
      loading
    }
  }
}

2. Validación de Formularios

La validación de formularios es otra área donde la Composition API puede ser muy útil. Puedes crear funciones "componibles" que encapsulen la lógica de validación y reutilizarlas en diferentes formularios.

import { ref } from 'vue'

export function useValidation() {
  const errors = ref({})

  const validateField = (fieldName, value, rules) => {
    let error = null
    for (const rule of rules) {
      if (rule === 'required' && !value) {
        error = 'Este campo es obligatorio'
        break
      } else if (rule === 'email' && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
        error = 'Formato de email inválido'
        break
      }
    }

    if (error) {
      errors.value[fieldName] = error
    } else {
      delete errors.value[fieldName]
    }
  }

  return {
    errors,
    validateField
  }
}

Uso en un componente:

import { useValidation } from './useValidation'
import { ref } from 'vue'

export default {
  setup() {
    const { errors, validateField } = useValidation()
    const email = ref('')

    const validateEmail = () => {
      validateField('email', email.value, ['required', 'email'])
    }

    return {
      email,
      errors,
      validateEmail
    }
  }
}

3. Gestión de Autenticación de Usuarios

La lógica de autenticación a menudo puede ser compleja y duplicada en múltiples componentes. La Composition API te permite crear una función "componible" que encapsule toda la lógica de autenticación y proporcione una API limpia para que la usen tus componentes.

Ejemplo: (Simplificado)

import { ref } from 'vue'

export function useAuth() {
  const isLoggedIn = ref(false)
  const user = ref(null)

  const login = async (username, password) => {
    // Simular llamada a la API
    await new Promise(resolve => setTimeout(resolve, 1000))
    isLoggedIn.value = true
    user.value = { username }
  }

  const logout = async () => {
    // Simular llamada a la API
    await new Promise(resolve => setTimeout(resolve, 1000))
    isLoggedIn.value = false
    user.value = null
  }

  return {
    isLoggedIn,
    user,
    login,
    logout
  }
}

Mejores Prácticas para Usar la Composition API

Para aprovechar al máximo la Composition API, considera las siguientes mejores prácticas:

Errores Comunes y Cómo Evitarlos

Aunque la Composition API ofrece muchos beneficios, también hay algunos errores comunes que debes tener en cuenta:

La Composition API y los Equipos Globales

La Composition API fomenta la colaboración dentro de equipos de desarrollo globales al promover:

Conclusión

La Composition API de Vue.js 3 es una herramienta poderosa que puede mejorar significativamente la organización, la reutilización y la capacidad de prueba de tus aplicaciones Vue. Al comprender los conceptos fundamentales y seguir las mejores prácticas descritas en esta inmersión profunda, puedes aprovechar la Composition API para construir aplicaciones más mantenibles y escalables para una audiencia global. Adopta la Composition API y libera todo el potencial de Vue.js 3.

Te animamos a experimentar con la Composition API en tus propios proyectos y a explorar las vastas posibilidades que ofrece. ¡Feliz programación!

Composition API de Vue.js 3: Una Inmersión Profunda para Desarrolladores Globales | MLOG