Created
October 5, 2019 17:23
-
-
Save josepereza/b3e501098350b896c26826b6a7674664 to your computer and use it in GitHub Desktop.
vue js - empezando con vue js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
sfsf |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Vue2JS - Empezando con VueJS
Como iniciar Vue con CDN
Para iniciar Vue podemos utilizarlo a través de un CDN o añadiendo el archivo físicamente. Aquí empezarémos a utilizarlo a través de CDN. El enlace del CDN puede variar con el tiempo, pero cuando escribo este Gist es el siguiente:
Creamos un archivo
html
y añadimos el CDN:/index.html
Una vez creado el html con el script del CDN, inicializamos un script con una nueva instancia de Vue. Vamos a llamar al elemento
app
:Estamos que debemos de crear un
div
con el idapp
para que se inicialice dentro Vue.Vamos a inicializar el método
data
donde guardaremos variables y podrémos utilizar a través de interpolación. Vamos a crear un mensajeHola mundo
:Componentes
Lo más correcto es tener todo en distintos archivos modularizados, lo que llamamos en Vue
componentes
. Así que vamos a crear un archivo en la misma carpeta llamadocomponents
y vamos a llamarlo por ejemplomessage.js
(cuando utilicemos el CLI de Vue usaremos la extensión .vue, pero como usamos la versión de CDN es mejor usar .js).Los archivos quedarían de la siguiente manera:
/index.html
/components/message.js
Cosas importantes
Computed properties
Nos permiten crear nuevas propiedades reactivas que dependen de otra propiedades del objeto
data
y que pueden tener una lógica "complicada" (filtros, concatenaciones, etc).Un ejemplo de computed properties sería el siguiente:
/index.html
Hemos añadido un
script
concomputed-properties
y añadido el tag con el mismo nombre<computed-properties></computed-properties>
Después añadimos el componente, con una
data
, uncomputed
con los elementos a mostrar deldata
y untemplate
:/components/computed-properties.js
Métodos
Para escribir métodos utilizaremos la palabra
methods
y ahí meteremos los elementos que queramos.En el siguiente ejemplo vemos como implementamos
methods
:/index.html
Y el componente es el siguiente:
/components/methods.js
El evento
v-on:click
es igual que@click
es un atajo.Data Binding con v-model
Es una forma de actualizar datos tanto en la template como en el script, que sean de ida y vuelta. Son muy útiles cuando utilizamos formularios.
La directiva
v-model
espera un dato, en este caso espera el datoframework
./index.html
/components/vmodel.js
Vmodel con formulario y array
Un ejemplo de
v-model
con formulario y array es el siguiente:/index.html
/components/vmodel-checkboxes.js
Emitir eventos a componentes padres con $emit
Los eventos siempre se emiten del elemento hijo al elemento padre (de abajo hacia arriba). Para entender esto tenemos el siguiente ejemplo:
/index.html
Vemos que utilizamos el componente
<emit>
el cual le pasamos un eventov-on
con@
con el nombre@show_card_brand
y le pasamos un método. En la misma página añadimos el método con elalert
./components/emit.js
$emit
nos permite pasar dos cosas, el primero es el evento que queremos emitir y el segundo el dato le queremos pasar cuando pasemos el evento:<p @click="$emit('show_car_brand', carBrand)">Texto</p>
Acceso a datos del componente padre
En el
index.html
inyectamos el script del componente y ponemos la etiqueta del component en este casoparent-data
./index.html
Aquí creamos un archivo llamado
parent-data.js
donde pondrémos una template accediendo al dato que queremos. Usamos$parent
para acceder al elemento de arriba (padre). Si queremos subir niveles hacia arriba, usuariamos$parent
las veces que quisieramos. Para subir por ejemplo tres niveles usuariamos$parent.$parent.$parent
. El ejemplo del componente es el siguiente:/components/parent-data.js
Acceso a datos del componente hijo utilizando referencias
Creamos una referencia en nuestro componente, en este caso se llama
<child-data>
y la referencia se puede llamar como quieras, en el ejemplo le hemos llamadoref="childData"
. En el ciclo de vida de Vue, vamos a poner los datos del componente cuando estémounted
./index.html
Aquí tenemos el
cmpName
que deseamos pasar./components/child-data.js
Ejecutar métodos del componente hijo utilizando referencias
Podemos llamar al método primero invocando a nuestro componente
child-methods
con la referenciachildMethod
. Vamos a poner un ejemplo en elmounted
con unsetTimeout
llamándolo de la siguiente manera:this.$refs.childMethod.showCmpName();
Hacemos un ref, despues llamamos al método de la referencia y finalmente el método del hijo./index.html
/componentes/.js
Introducción a los formularios
Ejemplo básico de login
/index.html
Creamos unos datos típicos como son
email
ypassword
. Creamos el métodologin
donde cambiamos ellogged
atrue
si la condiciónthis.user.email === '[email protected]' && this.user.password === 1234
estrue
.La directiva
v-show
la utilizamos si queremos mostrar el contenido, en este caso sólo se mostrará silogged
estrue
.Para el formulario utilizamos
@submit
que por si sólo hace una redirección. Para evitar esta redirección pondremos@submit.prevent
y en este caso le decimos que haga caso al métodologin
, quedando de la siguiente manera:<form @submit.prevent="login">
.v-model
nos permite hacer databinding, que hace que cambie los datos del componente./components/login-form.js
Bucles con la directiva v-for
Nos cubre nuestras necesidades para iterar información. En
index.html
sólo habrá que invocar el script y el componente<loops>
./index.html
En el componente creamos un array de Frameworks, después en el template es donde utilizamos el v-for. En el
<ul>
usamos la condiciónv-if
para no mostrar nada si en el array no hay nada guardado.La directiva
v-for
utilizamos si queremos elindex
para mostrar el indice. El array se llamaframeworks
y por normativa solemos utilizar el elemento para mostrar en singular, así quev-for
quedaría de la siguiente manera:v-for="(framework, index) in frameworks"
. Para que sea clave única y no se repita utilizamos:key
, y le pasamos el elementoframework.id
ya que no se repite.Dentro del
<li>
dibujamos ya toda la información accediendo a través deframework
./components/loops.js
Condicionales con la directiva v-if
El
v-if
lo utilizamos para poder hacer condicionales y mostrar o no datos.En nuestro
index.html
sólo vamos a tener que invocar al componente a través de su archivojs
y después a través de su tag<conditionals>
./index.html
Tenemos un dato que es
age
y en elinput
le decimos que suv-model
de referencia esage
. Ya después hacemos condiciones a traves de la directivav-if
. Cuando queremos añadir otro elemento usaremosv-else-if
y cuando ya no tengamos que ver ninguna condición añadimosv-else
./components/conditionals.js
Slots, definiendo secciones para poder sobrescribir
Un slot nos permite definir unas layout pero podiendo sobrescribir el contenido.
Después de invocar el
js
de nuestro componente y llamarlo por<slot>
meteremos nuestros elementos dentro.Ejemplo de Layout
/index.html
Hacemos el "template" del
slot
y a continuación analizamos como se comporta el código./components/slots.js
Si nos fijamos en esta parte del código junto a esta:
Vemos que si no definimos un
<template slot="nameSlot">
realmente nos creará un main, aunque lo creemos en primera instancia. Unslot
lo iremos construyendo según su plantilla y o sino lo llevará a último lugar.Watchers
Haciendo cosas cuando algún dato cambie, peticiones HTTP GET con Fetch
En el
index.html
sólo añadimos la ruta del archivo javascript y invocamos al componente que le hemos llamadowatchers
./index.html
En
watchers
tenemos dosdata
de un usuario nuevouser
y de un usuario anterior o viejooldUser
, los dos sin definir. Después a través de unasync
-await
traemos información de un API que nos dá información de usuario aleatoria. Pasamos la información en unJSON
y elegimos sólo la primera opción. Una vez hemos guardado esa información, componemos un usuario a través de sutitle
,first
ylast
./components/watchers.js
Tenemos el método
watch
que es nuestro watcher. Estará viendo el estado de nuestros datos y recogerá lo que queramos. En elwatcher
nos va a pedir unnewValue
y unoldValue
. Y así en el template, vamos a poder ir recogiendo estos datos y mostrándolos por la pantalla.Computed Properties con getters y setters
En el documento
index.html
invocaremos el archivojavascript
decomputed-properties-getset.js
e iniciamos el componente llamado<computed-properties-getset>
./index.html
Creamos el componente con un dato 0 llamado
amount
. Dentro decomputed
creamos unamountFormatted
donde tendremos dos funciones llamadasget()
yset()
. Dentro de ellas vamos a poder jugar para tener el valor o poder modificarlo después./components/computed-properties-getset.js
Creamos un
v-model
con la referencia deamount
y mostramos en pantalla elamountFormatted
.Carga de componentes dinámicos con el componente component
Para este ejemplo usaremos más archivos. Vamos a crear dentro de la carpeta
components
la carpetadynamic-components
creando los archivoscmp1.js
,cmp2.js
ycmp3.js
. Dentro de cada archivo habrá lo siguiente, cambiando el nombre delcmp
.components/dynamic-components/cmp1.js
En el
index.html
cargamos primero los componentes dinámicoscmpX.js
y después el cargador de componentesload-dynamic-components.js
./index.html
En el componente creamos un
array
con los nombres de los componentes y decimos cual es el componente actual a mostrar concurrentComponent
. En methods creamos un método llamdochangeComponent()
para modificar el componente actual.En el template visualizamos todos los botones a través de una directiva
v-for
y en el evento@click
cambiamos a que botón le hemos dado para actualizar su estado./components/load-dynamic-components.js
Para mostrar el componente actual, utilizamos la etiqueta
<component>
con la directivais
(v-bind:is
es lo mismo que:is
) y mostramos que componente es el actual.Mixins, añadiendo funcionalidad extra a nuestros componentes
Un mixin es una forma de heredar datos para poder reutilizar información.
En el
index.html
invocaremos como siempre el archivojavascript
y el componente, en este caso lo hemos llamado<mixins>
. No tenemos que hacer nada más, toda la lógica la lleva eljavascript
./index.html
Vamos a crear una variable con todo nuestro
mixin
./components/mixins.js
A la hora de crear nuestro componente, deberemos llamar a
mixins
en plural en un array, y ahí llamar a nuesta variable con elmixin
. Tenemos que tener cuidado ya que habrán cosas que se ejecutaran antes o después o se pueden reescribir.Desarrollar nuestra primera directiva, dando el foco a inputs
Las directivas es mejor que se invoquen al principio. Lo único que vamos a hacer en este ejemplo es darle
focus
a un input. Para darle focus creamos una carpeta llamadadirectives
y dentro de esa carpeta creamos un archivo llamadofocus.js
.En el
index.html
le añadimos el archivojavascript
de la directiva./index.html
Creamos la directiva
focus
, y le damosfocus
al elementoel
./directives/focus.js
En el ejemplo vamos a darle
focus
al primerinput
que habíamos creado (vmodel.js
). Para asignarle la directiva, se la daremos a través dev-nombredirectiva
en este casov-focus
. El archivo modificado devmodel.js
quedaría de la siguiente forma./components/vmodel.js
Directiva para aplicar estilos a componentes pasando parámetros
Binding son los datos que vamos a pasar a la directiva para poder acceder desde el archivo.
/index.html
Creando la directiva abajo, usando
binding
podemos cambiar los valores de este. En estamos diciendo de introducir unbackgroundColor
y uncolor
. Se lo asignamos al componente que queramos con unv-change-styles
y se le pasamos los valores de esta manera (ejemplo con el componentemessage
):<message v-change-styles="{backgroundColor: 'red', color: 'white'}"></message>
/directives/change-styles.js
Desarrollar un filtro con paso de parámetros para establecer la Currency
Para este ejemplo editaremos el archivo
computed-properties-getset.js
donde añadiremos el nombre del filtro y le pasaremos un valor. En elindex.html
añadimos el filtro en la carpetafilters
con el archivocurrency-filter.js
./index.html
Creamos el filtro de la siguiente manera, recogiendo el valor y después un currency que será el tipo de moneda.
/filters/currency-filter.js
Aquí con un pipeline utilizaremos el filtro.
/components/computed-properties-getset.js
Desarrollar plugin con argumentos para mostrar el perfil de un usuario
Un plugin sirve para darle una funcionalidad adicional a VueJS. Para realizar un plugin tenemos que crear un archivo de la siguiente manera:
/plugins/aboutMe.js
Creamos una const con los datos y el método install. Le pasamos el primer parámetro que siempre tiene que ser
Vue
y después le añadimos unasoptions
. Destructuramos el objeto conconst { job } = options
y le añadimos unprototype
con el nombre$loquesea
para poder llamarlo. En este caso vamos a pedirname
yage
./index.html
Props
Paso de datos a componentes al utilizarlo, tipos y validación
Una vez más añadimos el script de
javascript
y ponemos el componente con varios datos que pasarle alprops
. En este caso sería esto:<props name="Jose" surname="García" :age="37"></props>
./index.html
En el componente, inicializamos una instancia de Vue con el nombre
props
, y definimos los valores en el métodoprops
que vamos a pasarle:name
yage
. Además vamos realizar una validación de edad./components/.js
Props Vs Data y reactividad
Las Props en Vuejs nos permiten pasar datos a un componente al momento de utilizarlo:
En este caso al componente super-componente le estamos pasando un dato de entrada llamado nombre, para utilizarlo en dicho componente haríamos lo siguiente:
El problema está en que si queremos que este dato sea reactivo utilizando v-model tendríamos un error:
[Vue warn]: Avoid mutating a prop directly
Esto significa que no podemos modificar una Prop de forma directa, para solucionar esto realmente existen muchos caminos, pero uno muy común que sirve en la mayoría de los casos es utilizar en lugar de un valor, un objeto: