martes, 8 de marzo de 2022

Crear y organizar un proyecto Vue CLI

 1 creando un proyecto con Vue CLI



Teniendo instalado node y vue , me sitúo en la carpeta donde quiero crear el proyecto y ejecuto el comando:

vue create [nombre_proyecto]



Para crear un nuevo proyecto esta vez desde la consola de VScode, nos situaemos en la carpeta donde queremos crear el proyecto (o la arrastramos a VScode) y con el comando créate lo crearemos dándole un nombre.



Vue cli nos pedirá una serie de parámetros de configuración, en este caso voy  seleccionar una instalación manual, podríamos crear una por defecto de vue 3, me desplazo con las flechas del teclado y selecciono Manual



Ahora seleccionaré las dos primeras, router y vuex y deseleccionaré listener. Para desplazarnos lo hacemos con las flechas y para seleccionar o deseleccionar lo hacemos con la barra espaciadora.



una vez todo seleccionado hacemos enter, en la siguiente paantalla seleccionaremos la versión, en nuestro caso 3.X:



Diremos no al modo histórico para router



 

Dejaremos In dedicated config files:



Y elegiremos NO como preset para futuros proyectos



Con estos ajustes vue nos creará el proyecto en nuestra carpeta:



Una vez creado el proyecto, nos indica que nos movamos al proyecto con cd counter-vuex y que ejecutemos el servidor con npm run serve



Si lo hacemos se nos lanzará el servidor de desarrollo, veremos el enlace al servidor local en el puerto 8080. Como podemos ver en el navegador de VScode ya tenemos todas las dependencias instaladas en nuestro proyecto:







4 Organizando y limpiando nuestro proyecto

Simiramos la estructura delproyecto, en la carpeta raíz src, veremos que tenemos in archivo App.vue, este es el componente padre de la aplicación, podemos ver como en la carpeta views (vistas) tenemos dos archivos About.vue y Home.vue. estos son los componentes hijos de App y se renderizarán en App, por último tenenmos la carpeta components que contiene el archivo HelloWorld, este es un componente hijo de Home.vue reutilizable que está siendo llamado desde el Home.vue. Suena un poco lioso pero es muy sencillo, veamos una imagen de esta estructura:


En App.vue es donde se renderizarán todos las vistas y compoentes de estas vistas, esto es así porque así queda declarado en el archivo main.js archivo JavaScript principal de la app, en este archivo también le indicamos a vue debe usar el enrutador (router) para gestionar nuestras rutas dentro de la App, esto lo veremos en su momento:

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
 
createApp(App).use(router).mount('#app')

 

Una vez creada con el ciclo de vida mount nuestra App, es allí donde añadimos dentro de un template lavista de router <router /> que le dice a vue donde debe renderizarse absolutamente todo, y comopuedes ver también hay un par de router links , uno nos lleva a Home y el otro a una vista que se lama about

Código completo de la App.vue por defecto

<template>
  <div id="nav">
    <router-link to="/">Home</router-link> |
    <router-link to="/about">About</router-link>
  </div>
  <router-view/>
</template>
 
<style lang="scss">
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
}
 
#nav {
  padding: 30px;
 
  a {
    font-weight: bold;
    color: #2c3e50;
 
    &.router-link-exact-active {
      color: #42b983;
    }
  }
}
</style>

 

Veamos que contiene Home.vue

Como puedes ver, en un template tenemos una div con la clase hom que contiene una imagen y una llamada a un compoente que se llama “HelloWorld” (en azul).

Este componente HelloWorld está en la carpeta component, y para poder ser llamado desde esta vista home hay que impotarlo desde la lógica de home (en violeta)

<template>
  <div class="home">
    <img alt="Vue logo" src="../assets/logo.png">
    <HelloWorld msg="Welcome to Your Vue.js App"/>
  </div>
</template>
 
<script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue'
 
export default {
  name: 'Home',
  components: {
    HelloWorld
  }
}
</script>

Es decir Home.vue llama a Helloworld y los dos se renderizan en App.vue que es donde tenenmos el

  <router-view/>

Todo esto es posible gracias al router, si vamos a la carpeta router veremos un archivo llamado index.js,en el que se le indica a >Vue donde está cada cosa, para poder declarar una ruta a una vista, debemos primero importar esa vista desde la carpeta views y luego decidimos su ruta y el nombre de su url (en azul)

Luego exportamos las rutas (en verde)

import { createRouter, createWebHashHistory } from 'vue-router'
import Home from '../views/Home.vue'
 
const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
  }
]
 
const router = createRouter({
  history: createWebHashHistory(),
  routes
})
 
export default router

 

el resto de código lo veremos más adelante, de momento no te preocupes de nada mas, ahora como no queremos ni el compoente Helloworld ni la vista about, por que no las vamos a usar, podemos eliminarlas y eliminarlas de home y de router:

Ahora mismo la plantilla por defecto nos muestra esto:




Vamos a quitar el componente helloworld.vue en la vista Home.vue a ver que pasa, vamos a Home y borramos la importación, la declaración y la llmada (todo en azul)

  <div class="home">
    <img alt="Vue logo" src="../assets/logo.png">
    <HelloWorld msg="Welcome to Your Vue.js App"/>
  </div>
</template>
 
<script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue'
 
export default {
  name: 'Home',
  components: {
    HelloWorld
  }
}
</script>

 

Lo dejamos así:

<template>
  <div class="home">
    <img alt="Vue logo" src="../assets/logo.png">
  </div>
</template>
 
<script>
 
export default {
  name: 'Home'
 
}
</script>

Al borrar el componente HelloWorld de la vista Home ya solo vemos la imagen y los links:


Por tanto podemos ir a la carpeta components y eliminar el archivo HelloWorld.

Eliminemos  ahora la vista About, podemos ir a la carpeta views y simplemente borrarla, pero si hacemos eso senos mostrará un mensaje de error:


Esto es debido a que en el router (index.js) estamos importando una vista que ya no existe y además le estamos asignado una ruta, que exportamosen router (en azul)

import { createRouter, createWebHashHistory } from 'vue-router'
import Home from '../views/Home.vue'
 
const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
  }
]
 
const router = createRouter({
  history: createWebHashHistory(),
  routes
})
 
export default router

Par que todo vuelva afuncionar bastará con eliminar esa importción y esa ruta, si lo hacemos, volveremos a ver nuestro home, renderizandose en app.vue, solo que el enlace a About, ya no funciona porque about.vue ya no existe

Vamos a borrar los enlaces también iremos a App.vue y los borramos, es una div con clse nav que está dentro del template:

<template>
  <div id="nav">
    <router-link to="/">Home</router-link> |
    <router-link to="/about">About</router-link>
  </div>
  <router-view/>
</template>

 

Si los borramos, solo nos queda la magen del logo de Vue:



Pero la imagen es muy fácil de borrar también está en Home.ve:

<template>
  <div class="home">
    <img alt="Vue logo" src="../assets/logo.png">
  </div>
</template>
 
<script>
 
export default {
  name: 'Home'
 
}
</script>

 

Si la eliminamos nos queda un Home.vue limpio renderizandose en App.vue, es decir nuestra plantilla limpia para empezar nuestra propia App,para que no se vea solo una pantalla en blanco podremos un mensaje de hola mundo:

<template>
  <div class="home">
   <p>Hola mundo X)</p>
  </div>
</template>
 
<script>
 
export default {
  name: 'Home'
 
}
</script>

 

Y como puedes ver: