En esta lección aprenderemos cómo podemos separar nuestros componentes en diferentes archivos que permitan a cada componente agrupar sus plantillas y código de JavaScript en un mismo lugar. Estos archivos que tendrán la extensión .vue, se llaman «Single File Components» y podremos utilizarlos por supuesto gracias a webpack y vue-loader los cuales instalamos en la lección pasada haciendo uso de vue-cli. En esta lección también haremos uso de Hot Module Replacement (HMR) que nos permitirá hacer cambios en el código y poder verlos reflejados automáticamente en el navegador, sin necesidad de recargar la página.

Suscríbete a nuestro boletín

Te enviaremos publicaciones con consejos útiles y múltiples recursos para que sigas aprendiendo.

Notas

El archivo main.js va a ser el nuevo archivo principal donde se va a crear el objeto VM:

import Vue from 'vue'
import App from './App.vue'

var vm = new Vue({
  el: '#app',
  render: h => h(App)
})

En la primera línea del archivo cargamos e importamos a Vue, lo que quiere decir que ya no necesitaremos hacer referencia al CDN. En la segunda línea se importa otro componente (App) que luego se carga en nuestra aplicación mediante una Render Function:

render: h => h(App)

Aprende más sobre las Render Functions de Vue.js.

El componente App es el archivo App.vue que se encuentra en el directorio src/. Las extensiones .vue son un tipo de archivo con el que vamos a trabajar de ahora en adelante y es en estos archivos donde se definirá todo el código de la aplicación, no sólo JavaScript sino también las plantillas de Vue e incluso CSS, aunque esto último es opcional. Sin embargo en lugar de crear un componente global dentro del archivo, exportamos un objeto donde vamos a tener los datos, métodos, computed properties, etc.:

<script>
export default {
  name: 'app',
  data () {
    return {
      msg: 'Welcome to Your Vue.js App'
    }
  }
}
</script>

Al pasar el código de nuestra aplicación de tareas a App.vue ya no necesitamos hacer referencia al elemento #app ya que el componente App.vue se cargará a través de la función render en el archivo main.js:

export default {
    el: '#app', // Esto ya no es necesario hacerlo en App.vue
    methods: {
        /**/

También convertimos el valor de la propiedad data de un objeto a una función que va a retornar un objeto, como aprendimos en la lección sobre componentes:

data: function () {
    return {
        new_task: '',
        
        /**/
    }
}

No es necesario definir los estilos CSS dentro del archivo .vue, estos son opcionales.

Si sigues los ejemplos y no carga el CSS de la aplicación, es debido a que no estamos incluyendo a Bootstrap como una dependencia en package.json.

Por el momento incluimos el CSS de forma manual en el archivo en el archivo index.html:

...
<head>
  <meta charset="utf-8">
  <title>curso-vue-styde</title>
  <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
  <link href="style.css" rel="stylesheet">

El contenido del archivo style.css de nuestra aplicación de tareas lo pasamos a un archivo del mismo nombre ubicado en el directorio generado por Vue.js.

Si estas usando el servidor de desarrollo de webpack y realizas cambios en un archivo estatico como index.html es necesario recargar la página de forma manual.

Dentro del directorio src creamos un nuevo archivo llamado Task.vue y dentro de este colocamos el código de nuestro componente app-task. El código HTML de la plantilla lo debemos encerrar en etiquetas <template>:

// src/Task.vue
<template>
    <li class="list-group-item"
        :class="{editing: editing, completed: !task.pending}"
        ...

Dentro del mismo archivo Task.vue definimos el código JavaScript del componente justo debajo de la etiqueta <template>:

// src/Task.vue
<script>
export default {
    data: function () {
        return {
            editing: false,
            draft: ''
        };
    },
    /**/
</script>

Una vez hecho esto importamos el componente Task en App.vue, esto lo hacemos dentro de la etiqueta <script> del componente App.vue. Además en la definición del componente App incluimos el componente Task:

<script>
import Task from './Task.vue'

export default: {
    components: {
        'app-task': Task
        
    },
    methods: {
        
        /**/
    }
    
    /**/
}
</script>

Con components podemos registrar componentes locales dentro de otro componente o del objeto VM principal.

Dentro del directorio src creamos un archivo llamado event-bus.js y en este archivo creamos el Event Bus, pero en lugar de hacerlo como una variable global, simplemente lo exportamos:

// src/event-bus.js
import Vue from 'vue'

export default new Vue;

Para utilizar el objeto Vue necesitamos importarlo, tal como se encuentra en el archivo main.js. Al importar Vue no hacemos referencia al nombre de un archivo si no que se hace referencia al nombre del componente, tal como aparece en el archivo package.json:

"dependencies": {
  "vue": "^2.2.1"
},

En el archivo Task.vue le hacemos referencia a event-bus.js importandolo:

<script>
import EventBus from './event-bus.js'

export default {
    
    /**/
}
<script>

Dentro del directorio src nuevamente creamos otro archivo, esta vez llamado Icon.vue donde colocaremos el código del componente app-icon. También definimos una etiqueta <template> donde colocamos la plantilla del componente:

// src/Icon.vue
<template>
    <span class="cssClasses" aria-hidden="true"></span>
</template>

<script>
export default {
    props: ['img'],
    computed: {
        cssClasses: function () {
            return 'glyphicon glyphicon-'+this.img;
        }
    }
}
</script>

Nuestro componente Icon.vue debemos importarlo y registrarlo en Task.vue para poder utilizarlo:

<script>
import EventBus from './event-bus.js'
import Icon from './Icon.vue'

export default {
    components: {
        'app-icon': Icon
    },
    
    /**/
</script>

Recuerda que en el proceso de desarrollo muy a menudo vamos a equivocarnos, por lo tanto es importante acostumbrarnos a leer los errores para tratar de encontrar la solución a los problemas que se van presentando. Para ello te recomiendo muchísimo utilizar el plugin de Vue para Chrome que te proporcionará mensajes detallados de advertencias, errores y sugerencias.

Únete a nuestra comunidad en Discord y comparte con los usuarios y autores de Styde, 100% gratis.

Únete hoy

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Introducción a vue-cli y webpack Lección siguiente Uso de ES6 en Vue con webpack y Babel