vuejs-options-api-vs-composition-api

Options API y Composition API en Vue.js

  • 4 min

En Vue.js, existen dos sintaxis diferentes para crear componentes: la Options API y la Composition API.

  • La Options API es el enfoque tradicional de Vue.js
  • La Composition API es un enfoque más moderno y flexible, introducido en Vue.js 3 💖

Ambas sintaxis pueden convivir en el mismo proyecto. Son totalmente compatibles. Aunque, lo general, es que optemos por una o por otra (por no liar).

En este curso nos centraremos principalmente en la Composition API porque es la forma moderna y recomendada (y además, es la que me gusta a mi).

Pero tenéis que conocer la existencia de ambas, sobre todo porque aún os la vaís a encontrar en muchos tutoriales y librerías.

Así que vamos a ello 👇.

Comparación Options API vs Composition API

Vamos a empezar viendo las ventajas y desventajas de cada una de las sintaxis. En resumen.

CaracterísticaOptions APIComposition API
OrganizaciónPor opciones (data, methods)Por funcionalidad (agrupación)
SimplicidadMás sencillaMás compleja
FlexibilidadLimitadaAlta
ReutilizaciónDifícil (mixins)Fácil (composables)
Uso en proyectosPequeños o medianosGrandes o complejos
CompatibilidadVue 2 y 3Vue 3 (recomendado)

En general, la lógica y organización de la nueva Composition API es mejor. Pero, la sintaxis tradicional de Optional API puede ser más intuitivo para desarrolladores nuevos en Vue.js.

Personalmente, no veo que la Optional API sea mucho más sencilla. Recomiendo ir directamente a por Composition API 🤷.

¿Qué es la Composition API?

La Composition API es la nueva sintaxis introducida en Vue.js 3, que es más moderna y más flexible (introducida para abordar limitaciones de Options Api)

En este enfoque, la lógica se organiza en funciones reutilizables, lo que permite una mejor organización del código y una mayor reutilización de la lógica.

<template>
  <div>
    <p>Contador: {{ count }}</p>
    <button @click="increment">Incrementar</button>
  </div>
</template>

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

const count = ref(0);

function increment() {
  count.value++;
}
</script>

En este ejemplo,

  • La lógica del componente está organizada en funciones.
  • El estado (count) y los métodos (increment) están definidos dentro del setup.

¿Qué es la Options API?

La Options API es la sintaxis clásica de Vue.js para crear componentes en Vue.js, que puede ser más intuitiva para gente que empieza.

En este enfoque, la lógica se organiza en opciones claramente definidas y separadas, como data, methods, computed, watch, y props, etc…

<template>
  <div>
    <p>Contador: {{ count }}</p>
    <button @click="increment">Incrementar</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      count: 0,
    };
  },
  methods: {
    increment() {
      this.count++;
    },
  },
};
</script>

En este ejemplo,

  • La lógica del componente está organizada en las opciones data y methods
  • El estado (count) y los métodos (increment) están definidos dentro de estas opciones.

Migrar de Options API a Composition API

Si en alguno momento te toca migrar un componente de Vue de Options API a Composition API, aquí tienes unas pautas de como hacearlo (y con paciencia).

Primero, importa las funciones que necesites de vue, como ref, reactive, computed, y watch:

import { ref, reactive, computed, watch } from 'vue'

Ahora tendrás que sustituir las opciones por como data, methods, computed y watch por sus equivalentes,

Opciones en Options APIMigración a Composition API
dataMueve las propiedades a ref o reactive
methodsDefine las funciones directamente en <script setup>
computedUsa computed() para definir propiedades computadas
watchUsa watch() para observar cambios
propsUsa defineProps() para definir propiedades
emitUsa defineEmits() para emitir eventos
mounted, created, etc.Usa los hooks onMounted() y onUnmounted()
<script>
export default {
  data() {
    return {
      count: 0
    }
  },
  computed: {
    doubleCount() {
      return this.count * 2
    }
  },
  methods: {
    increment() {
      this.count++
    }
  }
}
</script>
<script setup>
import { ref, computed } from 'vue'

const count = ref(0)

const doubleCount = computed(() => count.value * 2)

function increment() {
  count.value++
}
</script>

No es necesario migrar todo el proyecto de una vez. Puedes migrar componentes individuales a medida que los necesites.