Skip to content

Latest commit

 

History

History
322 lines (250 loc) · 11.2 KB

File metadata and controls

322 lines (250 loc) · 11.2 KB

Vue.js Intermedio: Composition API

Composition API

Vue Ready LICENSE GitHub

Vue.js

Acerca de

Con la llegada de Vue 3, se ha introducido una nueva API de composición que nos permite reutilizar código y crear componentes más pequeños y reutilizables. En este curso, aprenderemos a utilizar la nueva API de composición para crear componentes más pequeños y reutilizables.

Composition API

La Composition API es la nueva forma en Vue.js desde la versión 3 para crear nuestros componentes. Es solo cuestión de estilos.

Options API se centra en el concepto de una "instancia de componente", que generalmente se alinea mejor con un modelo mental basado en clases para usuarios que provienen de entornos de lenguaje OOP. También es más amigable para principiantes al abstraer los detalles de reactividad y hacer cumplir la organización del código a través de grupos de opciones.

Composition API se centra en declarar variables de estado reactivas directamente en el ámbito de una función y componer el estado de varias funciones juntas para manejar la complejidad. Tiene una forma más libre y requiere una comprensión de cómo funciona la reactividad en Vue para ser utilizado de manera efectiva. A cambio, su flexibilidad permite patrones más poderosos para organizar y reutilizar la lógica.

Si eres nuevo en Vue, te recomiendo:

Para propósitos de aprendizaje, elige el estilo que te parezca más fácil de entender. Una vez más, la mayoría de los conceptos básicos se comparten entre los dos estilos. Siempre puedes elegir el otro estilo más tarde.

Para uso en producción:

  • Usa con la API de opciones si no está utilizando herramientas de compilación, o planeas usar Vue principalmente en escenarios de baja complejidad.
  • Elija Composición API + Componentes de un solo archivo si planeas crear aplicaciones completas con Vue.

Aquí una comparación

Estructura

A partir de ahora tenemos una función setup que sirve de punto de entrada devolviendo (return) o exponiendo públicamente aquellos elementos que necesitamos en las vistas. Además, importaremos aquellos elementos que necesitemos en todo momento (más eficiente el código). Siempre tomamos de setup como parámetros primero las props, y luego el contexto: setup(props, context)

<script>
import { ref } from 'vue'

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

    // expose to template and other options API hooks, debes exponerlo para usarlo!
    return {
      count
    }
  },

  mounted() {
    console.log(count.value) // 0
  }
}
</script>

Si tenemos que usar props, las recibimos como parámetro de la función setup. Si no las usamos, podemos omitirlas o usar context para recoger el resto de parámetros.

export default {
  setup(props, context) {
    // Attributes (Non-reactive object, equivalent to $attrs)
    console.log(context.attrs)

    // Slots (Non-reactive object, equivalent to $slots)
    console.log(context.slots)

    // Emit events (Function, equivalent to $emit)
    console.log(context.emit)

    // Expose public properties (Function)
    console.log(context.expose)
  }
}

Podemos usar desestructuración para recibir solo lo que necesitamos.

export default {
  setup(props, { attrs, slots, emit, expose }) {
    ...
  }
}

Además, tenemos la forma abreviada que es script setup, lo veremos más adelante.

<script setup>
...
</script>

Reactividad

Usaremos ref para crear referencias reactivas a elementos simples y reactive para crear referencias reactivas a elementos más complejos. Si usamos ref accedemos al valor en lectura y escritura bajo .value.

const count = ref(0)
console.log(count.value) // 0

count.value++
console.log(count.value) //

Referencias computadas

Usaremos computed para crear referencias computadas de solo lectura. También podemos hacer de escritura.

const count = ref(1)
const plusOne = computed(() => count.value + 1)

console.log(plusOne.value) // 2

// Ejemplo de computed de escritura
const count = ref(1)
const plusOne = computed({
  get: () => count.value + 1,
  set: (val) => {
    count.value = val - 1
  }
})

Watcher

Tenemos de distinto tipo, permitiéndonos reaccionar a cambios en referencias reactivas.

const count = ref(0)
watch(count, (count, prevCount) => {
  console.log(count, prevCount)
})

Hooks de ciclo de vida

Usaremos los siguientes hooks

<script setup>
import { ref, onMounted } from 'vue'

const el = ref()

onMounted(() => {
  el.value // <div>
})
</script>

<template>
  <div ref="el"></div>
</template>

Propiedades

Usaremos las propiedades, como siempre, para comunicarnos de padre a hijo.

export default {
  props: ['foo'],
  setup(props) {
    // setup() receives props as the first argument.
    console.log(props.foo)
  },
}

Eventos

Usaremos los eventos para comunicarnos de hijo a padre.

export default {
  emits: ['inFocus', 'submit'],
  setup(props, ctx) {
    ctx.emit('submit')
  },
}

Exposición

Setup es cerrado por defecto, si queremos hacer algo público fuera de los enlaces de la platilla usamos expose

export default {
  // only `publicMethod` will be available on the public instance
  expose: ['publicMethod'],
  methods: {
    publicMethod() {
      // ...
    },
    privateMethod() {
      // ...
    }
  }
}

Consideraciones

Puedes usar Composition u Option, e incluso en el mismo componente ambos. Puedes ir migrando poco a poco.

Script Setup

Es la nueva forma recomendada de usar la Composition API y tienes varias ventajas:

  • Código más compacto y legible.
  • Capacidad para declarar propiedades y eventos emitidos usando TypeScript puro.
  • Variables reactivas y componentes importados se exponen de manera automática (si no usa private)
  • Mejor rendimiento en tiempo de ejecución (la plantilla se compila en una función de representación en el mismo ámbito, sin un proxy intermedio)
  • Mejor rendimiento de inferencia de tipo IDE (menos trabajo para que el servidor de idioma extraiga tipos del código)
  • Es importante tener Volar como extensión.
  • Usar componentes dinámicos
<script setup>
console.log('hello script setup')
</script>

Eventos y Propiedades

Debes usar defineProps y defineEmits para definir las propiedades y eventos emitidos.

<script setup>
const props = defineProps({
  foo: String
})

const emit = defineEmits(['change', 'delete'])
// setup code
</script>

Exposición de variables

Setup es cerrado por defecto, puedes usar defineExpose para exponer

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

const a = 1
const b = ref(2)

defineExpose({
  a,
  b
})
</script>

Ejercicios

Este tema tiene varios ejercicios, puedes realizarlos aquí

Autor

Codificado con 💖 por José Luis González Sánchez.

Twitter GitHub

Contacto

Cualquier cosa que necesites házmelo saber por si puedo ayudarte 💬.

              

¿Un café?

joseluisgs




Licencia de uso

Este repositorio y todo su contenido está licenciado bajo licencia Creative Commons, si desea saber más, vea la LICENSE. Por favor si compartes, usas o modificas este proyecto cita a su autor, y usa las mismas condiciones para su uso docente, formativo o educativo y no comercial.

Licencia de Creative Commons
JoseLuisGS by José Luis González Sánchez is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License.
Creado a partir de la obra en https://github.com/joseluisgs.