La Composition API de Vue.js es una alternativa poderosa que permite escribir componentes de una manera más flexible y organizada. A diferencia del Options API, que utiliza estructuras rígidas de objetos JSON, la Composition API permite el uso de funciones para definir la lógica y el estado de los componentes. Lo primero que necesitas saber es cómo utilizar variables reactivas dentro de esta API, empleando la función setup.
¿Cómo crear variables reactivas con ref?
La reactividad es un principio clave en Vue.js. Para empezar, es esencial entender cómo declarar variables reactivas mediante la función ref. Esta función permite crear una referencia reactiva a un dato, lo que significa que cualquier cambio a este dato se reflejará automáticamente en las partes del componente que lo usan.
Ejemplo de uso de ref
Para ilustrar cómo funciona ref, considera el siguiente componente:
Creación de referencia reactiva: Declara una variable utilizando la función ref y asigna un valor inicial.
Acceso a valores: En la función setup, utiliza la propiedad .value para leer o modificar los valores de estas variables reactivas.
¿Cómo hacer disponibles estas variables en el componente?
Las variables definidas con ref pueden utilizarse en el template del componente. No es necesario usar .value al acceder a ellas desde el template, ya que Vue.js detecta automáticamente los cambios. Por ejemplo:
<template><div>{{ texto }}</div></template>
¿Cómo manejar las variables primitivas y los objetos reactivos?
Cuando se trata de valores de tipo primitivo (números, cadenas, booleanos), la función ref es suficiente. Sin embargo, para manejar objetos, es mejor usar la función reactive.
Uso de reactive para objetos
reactive nos permite definir variables reactivas que son objetos enteros, sin la necesidad de usar .value. Aquí un ejemplo práctico:
¿Qué ventajas ofrece integrar Vanilla JS con setup?
La función setup no solo admite las funciones de Vue.js, sino que también permite el uso de Vanilla JS para cualquier lógica adicional. Esto proporciona mucha flexibilidad al combinar JavaScript puro con la reactividad de Vue.js.
Ejemplo con setInterval
Un caso común es el uso de setInterval para actualizar un contador:
En este ejemplo, counter.value se incrementa automáticamente cada 500 milisegundos, mostrando la potencia de la reactividad en acción.
¿Por qué es importante elegir entre ref y reactive?
Elegir entre ref y reactive depende de tus necesidades específicas:
ref: Ideal para valores simples y primitivos, donde la reactividad solo se necesita para un único valor.
reactive: Perfecto para manejar objetos enteros y más complejos, eliminando la necesidad de acceder a propiedades con .value.
Aprender a usar adecuadamente estas herramientas te permitirá escribir componentes más eficientes y organizados, promoviendo un desarrollo ágil y mantenible en Vue.js. ¡Continúa explorando y experimentando para dominar Vue.js al máximo!
La reactividad de VueJS es posible gracias al objeto Proxy en JavaScript.
Proxy nos permite crear una referencia a otro objeto, que se comportará igual que si se tratara del objeto original, pero agregando la capacidad de escuchar cada vez que un valor del objeto cambia para ejecutar algún código.
De hecho, cada cambio que hacemos sobre un objeto Proxy, en realidad se aplica al objeto original, aún así, para JS se sigue tratando de dos objetos distintos, por lo que si aplicamos un cambio al objeto original, el objeto Proxy no se enterará, es decir, el valor si se verá reflejado al accederlo, pero los handlers que escuchan esos cambios no se activarán.
// Ejemplo de proxy// Se define el objeto originalconst obj ={counter:0};/*
Se definen los handlers,
que escucharán todo lo que suceda con el objeto original.
*/const handlers ={/*
Este handler escucha cada vez que
asignamos un nuevo valor a un atributo del objeto original.
*/set(obj, prop, val){/*
obj: refiere al objeto original
prop: es el atributo del objeto, por ejemplo: counter
*/console.log(`update: ${prop}`);}}// Creamos un proxy de objconst proxy =newProxy(obj, handlers);// Ejecutamos lo siguiente en la consolaobj.counteroutput:0proxy.counteroutput:0// el handler no se ejecutaobj.counter++obj.counteroutput:1proxy.counteroutput:1// el handler si se ejecutaproxy.counter++output: update counter
obj.counteroutput:2proxy.counteroutput:2
Es gracias al objeto Proxy, que VueJS puede saber que un valor ha cambiado y así propagar ese cambio a todos los lugares dónde se use ese valor, esto es a lo que conocemos cómo reactividad.
Sin embargo, el objeto Proxy tiene ciertas reglas para funcionar, la principal es que necesita envolver a un objeto, no puede funcionar sobre variables que solo tengan valores de tipo primitivo (números, cadenas de texto, booleanos, etc).
Es por eso que cuándo se trata de valores de tipo primitivo, cómo es el caso de la función ref, siempre tenemos que usar el atributo value para acceder al valor y así mantener la reactividad, pues por detrás estará creando un objeto con la propiedad value, a la cuál le asignará el valor que ref recibe por argumento.
// Podemos imaginar el código de ref más o menos asífunctionref(value){returnnewProxy({ value },{set(obj, prop, val){/* Aquí vue escucha cuándo asignamos un nuevo valor */}});}// Usoconst counter =ref(0);counter.value=10;console.log(counter.value);// output 10
Mientras tanto cuándo usamos reactive, el valor que pasamos por argumento ya es un objeto, así que VueJS puede aplicarle todo su sistema de reactividad sin necesidad de hacer nada más.
// Podemos imaginar el código de reactive más o menos asífunctionref(value){returnnewProxy(value,{set(obj, prop, val){/* Aquí vue escucha cuándo asignamos un nuevo valor */}});}// Usoconst obj =reactive({counter:0});obj.counter=10;console.log(obj.counter);// output 10
Es por esto que en variables creadas con ref necesitamos usar el atributo value, pero en variables creadas con reactive, no es necesario.
Esto también significa que debemos tener cuidado al usar cosas cómo el spread operator (...), ya que estaríamos extrayendo el valor del objeto Proxy, y por lo tanto obtenemos el valor, más no la referencia, y podemos perder la reactividad.
Genial esta explicación, 👏
Excelente explicación. Gracias Diana.
Este post de StackOverflow explica las diferencias entre Ref y Reactive: Ref vs Reactive
En resumen: Reactive SOLAMENTE funciona con objetos {}.
ref funciona con demás tipos de datos :)
Muchas gracias bro, preciso estaba haciendo declaracion de variables y hice puras refs jajaaja en un objeto queda listo.
Buen resumen!
También podemos usar objetos con la función ref, incluso arrays. Pero, para algunos casos, es mejor emplear reactive.
Una de las diferencias entre utilizar ref y reactive es que si asignamos un objeto a ref, podemos sobrescribir el objeto entero asignando un nuevo objeto a su value, mientras que con un objeto creado con reactive no se podría.
const objState =ref({isVisible:true,name:'Angel',});// reemplazando el objeto completoobjState.value={isVisible:false,name:'Fernando',};
Como mi novia se molesta un poco porque después de trabajar vengo a programar, encontré una estrategia para que esto no se convierta en un problema.....
<template><div><h2>Hola mundo</h2><p>{{text}}</p></div></template><script>import{ onMounted }from"vue"import{ ref }from"vue";exportdefault{setup(){const mensajes =ref(["Te amo mi amor","Eres el amor de mi vida","Pamela chu","Colochita mia","Me encanta tu carita mi amor","Te amo mucho","Siempre pienso en ti"])const text =ref("Hola vue")setInterval(()=>{var x =Math.floor(Math.random()*(mensajes.value.length)); text.value= mensajes.value[x]},1000)onMounted(()=>{console.log("mounted") text.value="New valor, hola vue"});return{ text,}}}</script>```
ref()
para tipos de datos primitivos y objetos, pero para este último necesita .value para acceder al valor.
reactive()
Para arrays y objetos, donde se puede acceder directamente al valor SIN .value
Cuando creamos una variable reactiva usando Reactive y un objeto, CADA ATRIBUTO de dicho objeto se comporta como una variable reactiva, no solo el objeto en cuestion. Es decir si tenemos
En cambio, si pasamos a un ref un objeto, solo la referencia al objeto es reactiva, mientras que sus propiedades no lo son.
En el min 2>20, se habla de acceder al valor de lectura o escritura de la variable mediante la propiedad value. No obstante text es una constante, y por definición su valor no podría ser cambiado o sobreescrito. ¿Cuál es la explicación para esto? ¿O es un error por parte de la prof?
No, verás, para JavaScript la reservada const solo implica que no vas a poder hacer una asignación total de un valor, por ejemplo:
const number =1;// si intentas esto fallaránumber =2;
Pero eso solo aplica para una asignación, si en lugar de eso es un cambio en un objeto, no hay ningún problema, por ejemplo:
const obj ={number:1};// si haces esto, funcionaobj.number=2;
JavaScript solo evita la reasignación completa del valor.
En este caso, cómo toda variable reactiva creada con Vue, por detrás es un objeto tipo Proxy, se puede crear como const, pero su contenido se puede editar.
Es literalmente cómo si esto:
const number =ref(100)
Lo hubieras declarado así:
const number ={value:100};
Justo por eso es que al usar las variables, se usa el .value
Una diferencia entre ref y **reactive ** es que la primera se puede emplear para tipos de datos primitivos y referenciados, el reactive solo para referenciados (arrays, objetos), y adem{as en el reactive no necesita el .value para acceder al valor.
ref vs reactive
No entiendo cual es la ventaja o la diferencia de no utilizarla
Es más facil manipular variables segun el tipo de dato que tengas.
Tambien con "ref" se puede usar objetos así.
<template><h4>Bienvenidos a vue 3CompositionAPI</h4><p>{{msg}}</p><p>{{counter.counter}}</p></template>
Ref es usado para trabajar con variables primitivas y tambien es posible trabajar con objetos.
.
Reactive es usado para trabajar con objetos y no con primitivos.