En la lección de hoy aprenderemos sobre la directiva v-for
de Vue.js, la cual nos permite iterar de forma dinámica un array de datos y mostrarlos en nuestra vista de forma reactiva.
Notas
Podemos iterar sobre arrays de datos en nuestro objeto VM y mostrar sus valores en nuestro HTML usando la directiva v-for:
// Nuestro array dentro de el objeto VM ... data: { tasks: [ 'Aprender Vue.js', 'Inscribirse en Styde', 'Seguir a @Stydenet en Twitter' ] }
Usamos la directiva v-for
especificando un alias (en nuestro caso task
), la palabra clave in
y nuestro array (tasks
). Luego dentro de una etiqueta (en nuestro ejemplo <li>
) podemos mostrar los valores de nuestro array.
<ul> <li v-for="task in tasks">{{ task }}</li> </ul>
Vue también nos permite usar of
al iterar sobre un array, esto dará el mismo resultado que usar in
.
<li v-for="task of tasks">{{ task }}</li>
Si trabajas con PHP debes tener cuidado de no confundir el uso de esta directiva con foreach()
, ya que foreach()
acepta primero el nombre de nuestro array y luego el alias.
En caso de que queramos obtener los indices de nuestra iteración, lo podemos hacer pasando el indice como argumento a v-for
(en este caso index
):
<li v-for="(task, index) of tasks"> {{ index }}: {{ task }} </li>
No estamos obligados a usar ningún alias en concreto, dentro de v-for
podemos asignar los alias que nosotros queramos:
<li v-for="(tarea, indice) of tasks"> {{ indice }}: {{ tarea }} </li>
Al realizar una iteración podemos mostar multiples elementos HTML usando la directiva v-for
en conjunto con la etiqueta <template>
.
<template v-for="(tarea, indice) in tasks"> <p>{{ indice + 1}}: {{ tarea }}</p> <hr> </template>
Vue.js también nos da la posibilidad de iterar sobre un array de objetos:
// Nuestro array de objetos ... data: { tasks: [ { title: 'Aprender Vue.js', pending: false }, { title: 'Inscribirse en Styde', pending: true }, ... ] }
Luego en nuestro HTML, haciendo uso de v-for
, podemos acceder a las propiedades de nuestro objeto:
<li v-for="(task, indice) of tasks"> <del v-if="!task.pending">{{ task.title }}</del> <template v-else>{{ task.title }}</template> </li>
Podemos hacer uso de las directivas v-for
y v-if
en conjunto.
<li v-for="(task, indice) of tasks" v-if="task.pending"> {{ task.title }} </li>
En nuestro ejemplo solo se imprimirán las tareas donde la propiedad pending
sea verdadera.
v-for
toma precedencia sobre la directiva v-if
. En nuestro ejemplo Vue primero itera sobre nuestro array tasks
y luego decidimos si mostrar o no la tarea dependiendo del valor de task.pending
.
También podemos iterar en base a un listado de números, por ejemplo, si quisieramos imprimir los números del 1 al 10 lo podemos hacer de la siguiente forma:
<li v-for="i in 10"> {{ i }} </li>
Vue.js también nos permite iterar sobre las propiedades de un objeto:
... data: { user: { firstName: 'Duilio', lastName: 'Palacios', username: 'Silence', website: 'styde.net', description: 'vue.js teacher' } }
Luego con el uso de v-for
podemos mostrar las propiedades de nuestro objeto:
<li v-for="value in user">{{ value }}</li>
También podemos imprimir el nombre de las propiedades de nuestro objeto, de forma similiar a como imprimimos los indices:
<li v-for="(value, key) in user">{{ key }}: {{ value }}</li>
Si quisieramos obtener el indice, lo podemos lograr pasando un tercer argumento a v-for.
<li v-for="(value, key, index) in user">{{ index }}: {{ key }}: {{ value }}</li>
Es importante tener en cuenta que el orden con el cual se van a iterar las propiedades de nuestros objetos al hacer uso de la directiva v-for
depende de cada navegador y no de Vue.
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.
Lección anterior Estilos y clases de CSS dinámicas con la directiva v-bind en Vue 2 Lección siguiente Manejo de eventos en Vue.js 2