En esta lección aprenderemos cómo crear, emitir o disparar y escuchar eventos personalizados en Vue.js mientras que al mismo vamos a refactorizar nuestro componente de tarea, para que podamos eliminar una tarea sin necesidad de pasar todo el listado de registros a cada componente.
Notas
Actualmente podemos eliminar tareas porque pasamos el listado completo de tareas como una propiedad a nuestro componente app-task
, esto nos permite, mediante el método splice
de JavaScript eliminar las tareas directamente desde tasks
:
remove: function () { this.tasks.splice(this.index, 1); },
Aprende cómo funciona el método splice()
de JavaScript.
Sin embargo esto no es lo ideal, ya que la idea es que el componente app-task
represente a una sola tarea y no al listado completo.
Como una solución rápida, podríamos hacer referencia al objeto VM principal con $parent
y directamente eliminar las tareas, sin pasar todas las tareas al componentes:
this.$parent.tasks.splice(this.index, 1);
Pero nuevamente esto no sería lo más indicado ya que la idea de los componentes es que sean reusables e independientes del entorno al cual pertenezcan. Por tanto lo que vamos a hacer es emitir un evento personalizado utilizando el método $emit
remove: function () { this.$emit('remove', this.index); },
Lo primero que pasamos a $emit
es el nombre del evento (remove
) y el argumento de dicho evento, que en este caso es el indice de la tarea que queremos eliminar (this.index
).
Dentro de nuestra plantilla debemos añadir los cambios necesarios para poder escuchar a este evento personalizado. Esto lo hacemos utilizando la directiva v-on y el nombre del evento personalizado:
... <li is="app-task" v-for="(task, index) in tasks" :tasks="tasks" :task="task" :index="index" @remove="deleteTask"></li>
Dentro de @remove
llamamos al método deleteTask
, este método se va a encontrar dentro del objeto VM principal.
Los eventos personalizados los colocamos de forma similar a como lo hemos hecho con otros eventos como click (@click
) y submit (@submit
).
En nuestro objeto VM principal agregamos el método deleteTask. Dentro de este método recibimos el indice de nuestra tarea (index
) que nos permitirá hacer referencia a ésta y eliminarla del listado:
... deleteTask: function (index) { this.tasks.splice(index, 1); },
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.
Lección anterior Separación de datos entre el modelo y la vista en Vue.js 2 Lección siguiente Uso del "Event Bus" para comunicar componentes en Vue 2