VUE.js
O Vue (pronunciado igual view) é um framework de JavaScript para construir a interface de usuário.
Renderização Declarativa: Vue adiciona a sintaxe “template” ao HTML, permitindo que permite que o HTML seja declarado conforme o estado de um JavaScript. Reatividade: Vue rastreia automaticamente as alterações de estado do Javascript e atualiza com eficiência o DOM quando há alterações.
No Vue, os arquivos são Single-File Components, ou seja, a lógica do componente é toda empregada em um único arquivo, da seguinte forma:
// JavaScript
<script>
export default {
data() {
return {
count: 0
}
}
}
</script>
// HTML
<template>
<button @click="count++">Count is: 8</button>
</template>
// CSS
<style scoped>
button {
font-weight: bold;
}
</style>
Como funciona?
No vue, o arquivo index.html não possui toda sua estrutura, a parte interna do site se encontra na pasta src
.
Todos os arquivos da pasta src são transformados em um bundle chamado build.js e este é carregado pelo index.html.
Dentro do arquivo App.vue
todo o código dentro da tag <template>
deve ser colocada dentro de uma única <div>
ou outro elemento.
Passando informações
No <script>
do App.vue, você pode passar informações que serão acessadas pela página atual:
<script>
export default {
name: 'HelloWorld',
data () {
return {
msg: 'Welcome to Your Vue.js App'
}
}
}
</script>
Com o código acima, o parâmetro msg pode ser acessado utilizando a notação .
Mas quando esse parâmetro é passado para dentro de um atributo como o link de uma imagem, ele precisa ser escrito da seguinte forma:
<img :src="msg">
ou
<img v-bind:src="msg">
Passando uma array
Caso tenham vários dados com parâmetros repetidos como a exibição de produtos em uma home, o VUE possui maneiras de iterar informações passadas como array, utilizando v-for="x of properties"
ou v-for="x in properties"
:
<ul>
<li v-for="blog of bloginfo">
<h3>blog.titulo</h3>
<img :src="blog.thumb" :alt="blog.thumb-text">
</li>
</ul>
<script>
export default {
name: 'HelloWorld',
data () {
return {
title: 'Blog Posts',
bloginfo: [
{
titulo: '747-800',
thumb: 'link-747-800.jpg',
thumb-text: 'avião 747-800'
},
{
titulo: '777-800',
thumb: 'link-777-800.jpg',
thumb-text: 'avião 777-800'
}
]
}
}
}
</script>
Requisições para uma API usando Vue-resource
Para fazer requisições para apis, ao invez de utilizar um comando fetch, usamos o pacote vue-resource.
npm install vue-resource
import VueResource from 'vue-resource'
// usando globalmente
Vue.use(VueResource)
Utilizando o comando $http para acessar uma página;
// Dentro do componente vue export default
created () {
this.$http.get('http://localhost:3000/v1/fotos')
.then(res => res.json())
.then(fotos => this.fotos = fotos, err => console.log(err))
}
// Esse comando faz a leitura do get como promisse, e faz o retorno desejado
Estilos
Os styles de um componente são carregados juntos do próprio componente vue e são carregados direto na head da html quando invocadas.
Para restringir o estilo ao componente, adicione scoped na tag style <style scoped>
Componentes
Os shared components são partes de códigos que podem ser reutilizados na aplicação.
Quando chamar um componente, será necessário importa-lo no script.
Para passar uma propriedade para esse componente, ele precisa primeiro aceitar esse parâmetro.
// :titulo passará informações para o componente
<meu-painel :titulo="foto.titulo">
<img src="foto.jpg"> // Será exibido dentro da tag "slot" do componente
</meu-painel>
import Painel from './components/painel.vue'
export default {
components: {
'meu-painel': Painel
}
}
// no componente
<template>
<div>
<h1></h1>
<slot class="algo">
</slot>
</div>
</template>
export default {
props: ['titulo']
}
Você também pode criar slots nomeados
<!-- ComponenteQualquer.vue -->
<template>
<div>
<slot name="cabecalho" class="header" ></slot>
<hr>
<slot class="body"></slot>
<hr>
<slot name="rodape" class="footer"></slot>
</div>
</template>
<script>
export default {}
</script>
<componente-qualquer>
<div slot="cabecalho">
<h1>Bem-vindo!</h1>
</div>
<p>Seja bem-vindo à Alura!</p>
<div slot="rodape">
<p>copyright 2017</p>
</div>
</componente-qualquer>
Eventos
<input v-on:input="filtro = $event.target.value">
// ou @
<input @input="filtro = $event.target.value">
export default {
data () {
filtro: ''
}
}
Um dado pode ser puxado através de uma fórmula que é passada dentro do script export, como por exemplo quando um dado precisa ser filtrado antes de ser iterado em um loop.
<h1></h1>
export default {
computed: {
fotosComFiltro () {
if(this.filtro) {
return []
} else {
return this.fotos
}
}
}
}
Transition
<!-- alurapic/src/componets/shared/painel/Painel.vue -->
<template>
<div class="painel">
<h2 class="painel-titulo" @dblclick="visivel = !visivel"></h2>
<transition name="painel-fade">
<div class="painel-conteudo" v-show="visivel">
<slot></slot>
</div>
</transition>
</div>
</template>
<script>
// código omitido
</script>
<style>
/* código anterior omitido */
.painel-fade-enter, .painel-fade-leave-active {
opacity: 0
}
.painel-fade-enter-active, .painel-fade-leave-active {
transition: opacity .4s
}
</style>
Métodos
As funções podem ser chamadas através de methods dentro do vue.