¿Cómo se utilizan los props en la Composition API de Vue.js?
En Vue.js, el uso de props es fundamental para comunicar datos entre componentes. Aunque podrías estar familiarizado con su implementación en Options API, en esta clase, aprenderás a hacerlo con la Composition API. Este enfoque no solo es flexible, sino que también mejora la reactividad de tus proyectos con Vue.js.
¿Cuál es el valor de los props en Vue.js?
En el contexto de Vue.js, los props son atributos que se pasan desde un componente padre a un componente hijo y que permiten compartir datos entre componentes. Al definir los props en el componente hijo, puedes establecer:
Tipo de dato: Para asegurar que los datos recibidos son del tipo correcto, como string, number, etc.
Valor por defecto: Define un valor por defecto en caso de que el prop no se envíe desde el componente padre.
Requerido: Indica si el prop es obligatorio (true o false).
¿Cómo se definen los props en Composition API?
Para utilizar los props en Composition API, primero debes definirlos en el componente hijo. Supongamos que deseas pasar un nombre y apellido desde el componente App al componente Home. En Home.vue, definirías los props así:
props:{firstName:String,lastName:String}
En el componente padre (App.vue), los pasarías de esta manera:
<HomefirstName="Diana"lastName="Martínez"/>
¿Cómo se leen los props en la función setup?
Dentro de la Composition API, el método setup es el lugar donde leerás los props. La función setup recibe dos argumentos: props y context (aunque este último lo veremos en profundidad en otra lección).
Conversión de props a referencias reactivas
Por defecto, los props no son reactivos, lo que podría causar que no detecten cambios si los valores se modifican dinámicamente. Para solucionar esto, Vue.js ofrece la función toRefs, que convierte un objeto plano en referencias reactivas:
Usar toRefs es crucial cuando deseas que los cambios en los datos desde el componente padre se reflejen automáticamente en el hijo. Sin toRefs, los props actuarían como objetos estáticos en lugar de reactivos.
¿Cómo combinar props con otras características de Vue.js?
La Composition API ofrece la flexibilidad para combinar props con otras características de Vue.js, como computadas y watchers. Por ejemplo, podrías definir un watcher para monitorear cambios en firstName y ejecutar alguna acción cuando sucedan. Esto fomenta la reactividad y la modularidad en tus aplicaciones:
watch(firstName,(newValue, oldValue)=>{console.log(`El nombre cambió de ${oldValue} a ${newValue}`);});
Consejos y reflexiones finales
Explorar la funcionalidad de los props en Composition API no solo mejora la estructura y reactividad de tus aplicaciones, sino que también te proporciona un gran control sobre los datos entre componentes. No dudes en experimentar con diferentes características de Vue.js, como computeds, watchers, y refs, para enriquecer tus proyectos. ¡Comparte tus hallazgos y sigue aprendiendo!
Solo por si no quedo claro (no lo fue para mi al principio) seguimos necesitando declarar la opcion props antes del setup. No basta con recibirlas como argumentos en setup
Yo tambien me equivoque en eso, de ahi lo corregi :D
Siii!
En caso de que solo se necesite convertir en reactiva 1 propiedad del objeto props, se puede hacer uso de ref o toRef
En la documentación oficail de Vue hay más ejemplos.
Usando script setup
Si queremos usar la Composition API usando script setup y queremos recibir props debemos usar la función defineProps.
Al usar setup estamos usando "azucar sintactica" por lo que se importa por defecto defineProps
La sintaxis por guiones que menciona la profesora se llama kebab-case.
Ejemplo : hola-mundo.
Yo lo hice pasando un objeto como prop con firstName y lastName y me quedo asi.
y en vez de usar toRefs use reactive, el cual me funciono para hacer reactivas las props siendo un objeto.. estuvo muy cool!!!!!!
Miguel, cuál es la diferencia de que pongas ( :first-name ) a (first-name) sin los dos puntos???
con los dos puntos significa que le estas enviando una variable, objeto o sintaxis javascript como prop
Si alguno lo esta haciendo con vite y ve el <script setup> y piensa que no te dejara pues te muestro como debe verse, no es mucho pero es trabajo honesto y funciona bien el codigo no genera error:
<template>{{ fullName }}</template>
<script setup>
import { ref, defineProps, computed, toRefs, watch } from "vue";
const props = defineProps({
firstName: String,
lastName: String,
});
const { firstName, lastName } = toRefs(props);
const fullName = computed(() => {
return `${firstName.value} ${lastName.value}`;
});
watch(firstName, (newValue, oldValue) => {
console.log(`The new name is ${newValue}`);
console.log(`The old name is ${oldValue}`);
});
</script>
Lo valores que puede tomar props son:
Bueno lo que yo hice fue combinar los props con las computed properties para mostrar el full name y podemos cambiar el full name a través del componente y se actualiza, lo hice colocando el toRefs en la variable que guarda el computed:
Es igual, importas toRefs desde vue, si te refieres a hacer toRefs de los props, puedes importar una función que se llama defineProps, y lo que retorna, lo asignas a una variable, y a esa variable le haces toRefs, y ya puedes extraer variables reactivas con destructuración.
Tengo un pregunta un poco extensa.
Supongamos que tengo un componente de la siguiente manera
tengo que ejecutar una peticion API con una información del componente-1 y los datos recibidos de la api los quiero plasmar en el componente-3 ¿como podría
implementar las props en los componentes anidados?
Eso es una cuestión de tomar una desición, puedes hacer la petición en cada componente, pero vas a tener muchas peticiones, ya que cada vez que un dato cambia, el componente se actualiza, y si el componente se actualiza, puede que haga de nuevo la petición, por otro lado, puedes usar props, pero puede sucederte el "prop drilling", en el que pasas datos a componentes que los pasan a otros componentes, y así, y se vuelve un antipatrón dificil de manejar.
En casos simples probablemente Provide/Inject sea la solución, pero en otros, lo mejor será utilizar una librería de manejo de estado avanzado, cómo Vuex o Pinia, pronto lanzaremos cursos sobre eso. :)
¿Éste curso no era de Composition API? Sólo veo ejemplos de Option API.
Con envio de props reactivo y script setup.
al pasar 2 seg. se actualiza el nombre y al ser reactivo, impacta en el componente hijo
// src/App.vue<script setup>importHomefrom'./components/Home.vue';import{ reactive }from'vue';const persona =reactive({firstName:"Pepe",lastName:"Argento"});//actualiza [firstName] luego de 2 segundossetInterval(()=>{ persona.firstName='Moni';},2000)const events ={handleCreate:()=>console.log("he sido creado"),handleDelete:()=>console.log("he sido borrado"),}</script><template><Home:="persona" v-on="events"></Home></template>