Vue.js

núria soriano
Por qué Vue?
Rápido

Vue + vue-router + vuex 26kb min+gzip
Se adapta a ti
Templates vs Render Functions vs JSX
Javascript vs Typescript
No opinionado
Escalable
Core: Declarative rendering & component system
Routing: vue-router
Large Scale State Management: vuex
Build system: vue-loader/vueify, vue-cli
SSR: vue-server-renderer
Fácil
<div id="app">
<h1>{{ message }}</h1>
</div>
<script>
var vm = new Vue({
data: {
message: 'Hello World!'
}
}).$mount('#app')
<script>
Anatomía de un componente
Vue Single File Component
Plantilla, lógica y estilo
Usando HTML + Javascript + CSS
O Pug, CoffeeScript, SASS…
Se importa como un módulo ES2015
Hot-reload, scoped CSS…
<template>
<my-component></my-component>
</template>
<script>
import 'myComponent' from './MyComponent'
export default {
name: 'app',
components: {
myComponent
}
}
</script>
<style lang="scss" scoped>
div {
color: blue
}
</style>
<template>
<div>
<div>
{{ item.name }}
</div>
<img :src="url"/>
<button @click="nombreDeLaFuncion"></button>
<div v-for="item in items">{{ item.name }}</div>
<div v-if="someCondition">
print this
</div>
<div v-else>
print that
</div>
<div v-show="someOtherCondition">
display this
</div>
</div>
</template>
Template
Propiedades
data() {
return {
collection: [1, 2, 3, 4]
}
}
Métodos
methods: {
addNumbers() {
var moreNumbers = [5,6,7,8]
this.collection.push(...moreNumbers)
}
}
Propiedades computadas
Reactivas
computed: {
evenNumbers() {
return this.collection.filter(number => number %2 === 0)
}
}
Solo se recalculan cuando es necesario
Lifecycle hooks
Ejecutar lógica en determinados momentos
created() {
http.get('http://jsonplaceholder.typicode.com/posts')
.then(response => {
this.posts = response.data
})
.catch(e => {
this.errors.push(e)
})
}
Comunicación
entre componentes
Parent to Child
Child
export default {
props: [ 'propName' ],
// ...
}
Parent
<child-component :propName="someData">
</child-component>
export default {
props: {
propName: {
type: Boolean,
default: true
},
otherProp: {
type: String,
required: true
}
},
// ...
}
Child to Parent
Child
this.$emit('eventName', data)
Parent
<child-component @eventName="method">
</child-component>
Sync
Child
this.$emit('update:foo', newValue)
Parent
<child-component :foo.sync="bar">
</child-component>
Desde Vue 2.3
<child-component :foo="bar" @update:foo="val => bar = val">
</child-component>
Routing
Router
import VueRouter from 'vue-router';
import User from 'src/components/User';
const router = new VueRouter({
routes: [
{
path: '/user/:userId',
name: 'user',
component: User
}
]
})
<div id="app">
<router-view></router-view>
</div>
Router
<router-link to="home"></router-link>
<router-link :to="{
name: 'Detail',
params: {
id: 1
}
}">
</router-link>
this.$router.push({
name: 'Detail',
params: {
id: 1
}
})
State management
State Management

State Management


Vuex
Varios componentes son dependientes del mismo estado
Sincronizar estado sin necesidad de eventos
Solución escalable para aplicaciones complejas
Fácil de debuggar
El estado
const store = new Vuex.Store({
state: {
movies: [
{ id: 1, title: '...', saved: true },
{ id: 2, title: '...', saved: false }
]
}
})
const store = new Vuex.Store({
state: {
movies: [
{ id: 1, title: '...', saved: true },
{ id: 2, title: '...', saved: false }
]
},
getters: {
savedMovies: state => {
return state.movies.filter(movie => movie.saved)
}
}
})
Objeto
No mutable directamente
Usar el estado en nuestros componentes
computed: {
movies () {
return this.$store.state.movies
},
savedMovies () {
return this.$store.getters.savedMovies
}
}
import { mapState, mapGetters } from 'vuex'
export default {
computed: {
...mapState({
'movies'
}),
...mapGetters([
'savedMovies'
])
}
}
Definir mutaciones
const store = new Vuex.Store({
state: {
movies: []
},
mutations: {
addMovie (state, movie) {
state.movies.push(movie)
}
}
})
Mutaciones asíncronas: Acciones
const store = new Vuex.Store({
state: { ... },
mutations: { ... },
actions: {
getMovies ({ commit }) {
api.getMovies()
.then( data => {
data.forEach(movie => commit('addMovie', movie))
})
}
}
})
Usar mutaciones y acciones en componentes
methods: {
addMovie (movie) {
return this.$store.commit('addMovie')
},
getMovies () {
return this.$store.dispatch('getMovies')
}
}
import { mapMutations, mapActions } from 'vuex'
export default {
methods: {
...mapMutations({
'addMovie'
}),
...mapActions([
'getMovies'
])
}
}
Construir una SPA
Tutorial

Estructura del proyecto
├─ build/ # Configuración de webpack
├─ config/ # Configuración general, variables de entorno…
├─ src/
│ ├─ main.js # Archivo principal de entrada
│ ├─ App.vue # Componente raíz
│ ├─ components/ # Componentes
│ └─ assets/ # Assets procesados por webpack (sass…)
├─ static/ # Assets estáticos no procesados por Webpack
├─ .babelrc # babel config
├─ .postcssrc.js # postcss config
├─ .eslintrc.js # eslint config
├─ .editorconfig # editor config
├─ index.html # Plantilla html
└─ package.json # Scripts y dependencias
¡A volar!
nuria-fl

soriano.nuria@gmail.com
pincfloit
Introducción a Vue.js - AdaJS
By nuria-fl
Introducción a Vue.js - AdaJS
- 1,508