# Cheat Sheet
# 1. Fundamentos
# 2. Diretivas e Hooks
# 3. Componentes
## Events
## Dynamic
> Possibilidade de alternar entre elementos no Vue, destruindo-os ou não.
### Passos:
1. Necessário criar uma variável de controle em data(){}. Essa variável recebe uma valor inicial, que será o nome de um dos componentes.
```vuejs
data(){
return {
componenteAtivo: "AulaDescricao"
}
```
2. A alternância entre elementos pode se dar por botões, ou qualquer outra forma que mude o elemento *componenteAtivo*:
```vuejs
<button @click="componenteAtivo = 'AulaDescricao'">Descrição</button>
<button @click="componenteAtivo = 'AulaDownload'">Download</button>
```
- Para manter o componente vivo usa-se a *tag* *<keep-alive>*:
```vuejs
<keep-alive>
<component v-bind:is="componenteAtivo"></component>
</keep-alive>
```
## Sync - compontes assíncronos
Importar elementos do código de forma assíncrona, para facilitar o carregamento de arquivos maiores.
A importação via webpack do componente não se dá através da linha:
```vuejs
import ContatoEmpresa from "./components/ContatoEmpresa.vue"
```
Mas através da sintaxe abaixo:
### Sintaxe
#### Importação de componentes locais
```vuejs
/*Importando localmente dentro do arquivo App.vue*/
components: {
ServicosEmpresa: function(){
return import("./components/ServicosEmpresa.vue");
}
},
/* ou, resumidamente, como arrow function: */
components: {
ServicosEmpresa: () => import("./components/ServicosEmpresa.vue");
},
```
#### Importação de componentes globais
```vuejs
/*Dentro do aquivo main.js*/
Vue.component("ServicosEmpresa", () =>
import("./components/ServicosEmpresa.vue")
);
```
# 4. Animações
## 4.1 Componentes únicos
tag *<transition>*
- Pode ser nomeada ou não;
- São adicionadas classes automaticamente aos elementos;
As classes adicionadas são:
1. v-enter (adicionda antes do elemento ser inserido)
2. v-enter-active (adicionada durante a animação)
3. v-enter-to (adicionada assim que a animação termina)
4. v-leave (adicionada assim que o elemento começa a sair)
5. v-leave-active (adicionada enquanto o elemento está saindo)
6. v-leave-to (adicionada quando o elemento saiu)
O nome inicial 'v' depende do atributo *name* adotado.
Necessário ter animação associada no arquivo css, senão não serão adicionadas as classes.
- Pode-se substituir a classe padrão do vue, por outra. Abaixo o exemplo com *enter-active-class="animar"*.
- Ao se adicionar determinarda classe, métodos também podem ser evocados, passando-se, ou não, o elemento do evento como parâmetro.
- Utilizando-se *appear* no lugar de *v-if* o efeito é o mesmo, porém não tem como utilizar váriável com valor true ou false;
### 4.1.1 Sintaxe
```vuejs
/*No elemento a animar*/
<transition name="fade" enter-active-class="animar">
<h1 v-if="ativo">Serviços</h1>
</transition>
```
```css
/* No css */
<style>
/* .fade-enter-active, */
.fade-leave-active {
transition: opacity 2s;
}
.animar {
transition: opacity 2s;
}
.fade-enter,
.fade-leave-to {
opacity: 0;
}
</style>
```
```vue
/* Pode-se utilizar appear para a transição*/
<transition appear name="fade" enter-active-class="animar">
<h2>Outro texto</h2>
</transition>
```
```vuejs
/* Métodos *enter* e *leave* sendo adicionados*/
<transition name="fade" enter-active-class="animar" @enter="enter" @leave="leave">
<h1 v-if="ativo">Serviços</h1>
</transition>
```
```vue
methods:{
enter(element){
console.log(element)
},
leave(){
console.log("elemento sumiu")
}
}
```
## 4.2 Entre componentes
- Necessidade de definir *key*;
- Aconselhável utilizar o *mode="out-in"* para transição mais suave;
- Pode ser utilizado em estruturas com *if, else* ou com estruturas **<component></component>** e utilizando-se a diretiva *:is*;
### 4.2.1 Sintaxe
```vuejs
/* com if else */
<transition mode="out-in">
<p v-if="estoque >= 5" key="estoque">{{estoque}} - Item em estoque</p>
<p v-else-if="estoque >= 1 && estoque < 5" key="acabando">{{estoque}} - Itens quase acabando</p>
<p v-else key="esgotado">Produto fora de estoque</p>
</transition>
```
```vuejs
/* com componentes */
<template>
<div>
<ul>
<li @click="componenteAtivo = 'PaginaSobre'">Sobre</li>
<li @click="componenteAtivo = 'PaginaServicos'">Serviços</li>
</ul>
<transition mode="out-in">
<component :is="componenteAtivo"></component>
</transition>
</div>
</template>
```
## 4.3 Animando elementos de listas
tag *<transition-group>*
- Possível determinar qual tag envolverá os elementos a serem animados. A tag padrão é *span*;
- Com a classe *v-move* é possível manipular elementos que são movidos dentro de uma lista e que não excluídos.
### 4.3.1 Sintaxe
```vuejs
/* Utilização da tag ul para envolver elementos*/
<transition-group tag="ul">
<li v-for="(produto, index) in carrinho" :key="produto">
<p>{{produto.nome}}</p>
<p>{{produto.preco}}</p>
<button @click="remover(index)">Retirar</button>
</li>
</transition-group>
```
```css
<style>
.v-move {
transition: transform 0.3s;
}
</style>
```
# 5. Vue Router
## 5.1 Router
- Possbilidade de criação de SPA (single page applications);
- Um arquivos index.html lido pelo navegador;
- As rotas dividem a aplicação em 'páginas';
- No Vue é o client-side router;
- Mas, geralmente, esse roteamento é feito no backend;
-Instalação do *vue-router* através do comando:
```bash
npm install vue-router
//ou
yarn add vue-router
```
- Criação do arquivo router.js com a estrutura básica:
### 5.1.1 Sintaxe
```vue
/* router.js */
import Vue from "vue";
import Router from "vue-router";
import Home from "./views/Home.vue";
import Cursos from "./views/Cursos.vue";
Vue.use(Router);
export default new Router({
mode: "history",
base: process.env.BASE_URL,
routes: [
{
path: "/",
component: Home,
},
{
path: "/cursos",
component: Cursos,
},
],
});
```
```vuejs
/* App.vue */
<template>
<div id="app">
<h1 @click="mostrarRouter">Logo</h1>
<nav>
<router-link to="/">Home</router-link>
<router-link to="/cursos">Cursos</router-link>
</nav>
<router-view></router-view>
</div>
</template>
<script>
export default {
name: 'App',
components: {
},
methods:{
mostrarRouter(){
console.log(this.$route)
}
}
}
</script>
<style>
.router-link-exact-active {
color: #84e;
font-weight: bold;
}
a {
padding: 10px;
}
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
```
- tag **<router-view></router-view>** para associar o App.vue às views de cada rota;
- Definição do modo ***history*** no **router.js**;
- Definição de links com a tag **<router-link></router-link>** em **App.vue**;
- Definição do link base em *router.js*;
- a base padrão é '/', dada por ***process.env.BASE_URL***, via node;
- Acesso ao elemento (objeto) **this.$route** que têm parâmetros da rota;
## 5.2 Dynamic route
- Passagem de propriedades para definição de rotas dinâmicas;
- Propriedade a ser passada é antecedida por dois pontos ':' na definição da rota;
- ***$route.params.curso*** pode ser definida como uma computed propertie ou através um prop;
- Os hooks do vue-router são os ***navigation guards***;
- É possível a criação de ***nested routes***, ou seja, rotas aninhadas com a propriedade ***children***;
- Necesário adicionar o **<router-view></router-view>** em cada elemento **pai** que tem elementos filhos.
- As rotas podem ser nomeadas (através de uma propriedade *name*). São as ***named routes***. No ***router-link*** o link ***to*** é passado como um objeto. Necessário o **bind** no ***to***;
### 5.2.1 Sintaxe
```vuejs
/* propriedade :curso */
export default new Router({
mode: "history",
base: process.env.BASE_URL,
routes: [
{
path: "/",
component: Home,
},
{
path: "/cursos/:curso",
component: Cursos,
},
],
});
```
```vuejs
/* no template */
<template>
<div>
<h1>Curso ativo: {{$route.params.curso}}</h1>
</div>
</template>
```
```vuejs
/* computed */
computed:{
curso(){
return this.$route.params.curso;
}
}
/* prop no arquivo router.js */
{
path: "/cursos/:curso",
component: Cursos,
props: true,
},
/* prop no arquivo Cursos.js */
export default {
props: ['curso'],
...
```
```vuejs
/* rota aninhada */
{
path: "/cursos",
component: Cursos,
props: true,
children: [
{
path: ":curso",
component: Curso,
},
],
},
```
## 5.3 Navigation guard
- São, basicamente, hooks;
- Há os globais e locais.
- Os globais irão acontecer sempre que o router mudar;
- Os globais são ***router.beforeEach()*** e ***router.afterEach()***;
- Os locais são definidos em cada rota;
- Essa definição de hooks pode se dar também na definição do componente;
- Para os hooks de componentes há os tipos:
- ***beforeRouteEnter*** - Antes de entrar no router. Não tem acesso ao **this**.
- **beforeRouteUpdate*** - Quando um router já ativo é atualizado.
- ***beforeRouteLeave*** - Antes de sair do router. É possível passar outros caminhos para o **next()**.
### 5.3.1 Sintaxe
```vuejs
/* Globais, dentro do arquivo main.js */
/* Antes da mudança */
router.beforeEach((to, from, next) => {
console.log("to:", to);
console.log("from:", from);
next();
}
/* Depois da mudança */
router.afterEach((to, from) => {
console.log("to:", to);
console.log("from:", from);
});
```
```vuejs
...
/* locais, dentro das rotas */
path: "/cursos",
component: Cursos,
props: true,
beforeEnter(to, from, next) {
console.log("foi para cursos");
...
```
falta 4:13 aula 0703