Escolar Documentos
Profissional Documentos
Cultura Documentos
Tutorial VueJS PDF
Tutorial VueJS PDF
<script type="text/javascript">
var app = new Vue({ // Definindo uma instância do VueJS
el: "#app", // Definindo elemento pai
data: {
titulo: "Aula 01 - Vuejs do jeito ninja!" // Definindo uma variável
}
});
</script>
</body>
</html>
Trecho de exemplo:
Exemplo 1:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Aula 01 - Vuejs do jeito ninja!</title>
<script type="text/javascript" src="assets/js/vue.min.js"></script>
</head>
<body>
<div id="app">
<!--
VueJS só irá exibir conteúdo de 'titulo' se 'status' for = 'true'
-->
<h1 v-if="status">{{ titulo }}</h1>
</div>
<script type="text/javascript">
var app = new Vue({
el: "#app",
data: {
status: false,
titulo: "Aula 01 - Vuejs do jeito ninja!"
}
});
</script>
</body>
</html>
Exemplo 2:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Aula 01 - Vuejs do jeito ninja!</title>
<script type="text/javascript" src="assets/js/vue.min.js"></script>
</head>
<body>
<div id="app">
<!--
'v-if' retira elementos 'html'
-->
<h1 v-if="status">{{ titulo }}</h1>
<!--
'v-show' apenas esconde os elementos 'html'
-->
<p v-show="status">
Lorem Ipsum is simply dummy text of the printing and typesetting industry.
Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when
an unknown printer took a galley of type and scrambled it to make a type specimen
book. It has survived not only five centuries, but also the leap into electronic
typesetting, remaining essentially unchanged. It was popularised in the 1960s with
the release of Letraset sheets containing Lorem Ipsum passages, and more recently
with desktop publishing software like Aldus PageMaker including versions of Lorem
Ipsum.
</p>
</div>
<script type="text/javascript">
var app = new Vue({
el: "#app",
data: {
status: false,
titulo: "Aula 01 - Vuejs do jeito ninja!"
}
});
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Aula 01 - Vuejs do jeito ninja!</title>
<script type="text/javascript" src="assets/js/vue.min.js"></script>
</head>
<body>
<!--
VueJS só vai atuar na tag 'div' com o 'id' = 'app'
-->
<div id="app">
<!--
'v-if' exibe texto.
-->
<p v-if="status">
Lorem Ipsum is simply dummy text of the printing and typesetting industry.
Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when
an unknown printer took a galley of type and scrambled it to make a type specimen
book. It has survived not only five centuries, but also the leap into electronic
typesetting, remaining essentially unchanged. It was popularised in the 1960s with
the release of Letraset sheets containing Lorem Ipsum passages, and more recently
with desktop publishing software like Aldus PageMaker including versions of Lorem
Ipsum.
</p>
<!--
Se 'status' = 'false' exibe esta 'div'
-->
<div v-else>Não existe texto!</div>
</div>
<script type="text/javascript">
var app = new Vue({ // Definindo uma instância do VueJS
el: "#app", // Definindo elemento pai
data: {
status: true,
titulo: "Aula 01 - Vuejs do jeito ninja!" // Definindo uma variável
}
});
</script>
</body>
</html>
Exemplo 4:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Aula 01 - Vuejs do jeito ninja!</title>
<script type="text/javascript" src="assets/js/vue.min.js"></script>
</head>
<body>
<!--
VueJS só vai atuar na tag 'div' com o 'id' = 'app'
-->
<div id="app">
<!--
'v-if' exibe texto.
-->
<h1>{{ titulo }}</h1>
<!-- Exibe os dados do usuario se 'id' = 1 -->
<div v-if="usuario.id == 1">
id: {{ usuario.id }},<br>
Nome: {{ usuario.nome }},<br>
Profissão: {{ usuario.profissao }}
</div>
</div>
<script type="text/javascript">
var app = new Vue({ // Definindo uma instância do VueJS
el: "#app", // Definindo elemento pai
data: {
titulo: "Vuejs do jeito ninja!",
usuario: {
id: 1,
nome: "Jon Snow",
profissao: "Ator"
}
}
});
</script>
</body>
</html>
Exemplo 1:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Aula 01 - Vuejs do jeito ninja!</title>
<script type="text/javascript" src="assets/js/vue.min.js"></script>
</head>
<body>
<!--
VueJS só vai atuar na tag 'div' com o 'id' = 'app'
-->
<div id="app">
<!--
'v-if' exibe texto.
-->
<h1>{{ titulo }}</h1>
<ul>
<li v-for="item in linguagens">{{ item.nome }}</li>
</ul>
</div>
<script type="text/javascript">
var app = new Vue({ // Definindo uma instância do VueJS
el: "#app", // Definindo elemento pai
data: {
titulo: "Vuejs do jeito ninja!",
linguagens: [
{ nome: "Javascript" },
{ nome: "PHP" },
{ nome: "C#" },
{ nome: "Java" },
{ nome: "Python" }
]
}
});
</script>
</body>
</html>
Saída:
Exemplo 2:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Aula 01 - Vuejs do jeito ninja!</title>
<script type="text/javascript" src="assets/js/vue.min.js"></script>
</head>
<body>
<!--
VueJS só vai atuar na tag 'div' com o 'id' = 'app'
-->
<div id="app">
<!--
'v-if' exibe texto.
-->
<h1>{{ titulo }}</h1>
<ul>
<!--
Inclue indice (index) na exibição.
-->
<li v-for="(item, index) in linguagens">
{{ index }} - {{ item.nome }}
</li>
</ul>
</div>
<script type="text/javascript">
var app = new Vue({ // Definindo uma instância do VueJS
el: "#app", // Definindo elemento pai
data: {
titulo: "Vuejs do jeito ninja!",
linguagens: [
{ nome: "Javascript" },
{ nome: "PHP" },
{ nome: "C#" },
{ nome: "Java" },
{ nome: "Python" }
]
}
});
</script>
</body>
</html>
Saída:
Exemplo:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Aula 01 - Vuejs do jeito ninja!</title>
<script type="text/javascript" src="assets/js/vue.min.js"></script>
</head>
<body>
<div id="app">
<h1>{{ titulo }}</h1>
<label for="">Nome:</label>
<input type="text" v-model="nome">
<br><br>
<label for="">Telefone</label>
<input type="text" v-model="telefone">
<br><br>
<label for="">Deseja receber nossas novidades?</label><br>
<input type="radio" value="Sim" v-model="novidades"> Sim
<input type="radio" value="Não" v-model="novidades"> Não
<br><br>
<label for="">Interesses</label><br>
<input type="checkbox" value="Futebol" v-model="interesses"> Futebol <br>
<input type="checkbox" value="Formula 1" v-model="interesses"> Formula 1 <br>
<input type="checkbox" value="Corrida" v-model="interesses"> Corrida <br>
<br><br>
<label for="">Como nos conheceu:</label><br>
<select v-model="conheceu">
<option value="">Escolha</option>
<option value="Google">Google</option>
<option value="TV">TV</option>
<option value="Revista">Revista</option>
</select>
<br><br>
<button>Enviar</button>
<br><br>
</div>
<script type="text/javascript">
var app = new Vue({
el: "#app",
data: {
titulo: "Vuejs do jeito ninja!",
nome: "",
telefone: "",
novidades: "",
interesses: [],
conheceu: ""
}
});
</script>
</body>
</html>
Saída:
Exemplo:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Aula 01 - Vuejs do jeito ninja!</title>
<script type="text/javascript" src="assets/js/vue.min.js"></script>
<style type="text/css">
.red {color: red;}
.green {color: green;}
</style>
</head>
<body>
<div id="app">
<h1>{{ titulo }}</h1>
<!--
Poderia ser feito:
v-bind:alt="'Vuejs is awesome!'"
que também iria funcionar, da
mesma forma com os outros atributos.
-->
<img v-bind:src="imagem" v-bind:alt="alt" v-bind:title="alt">
<!-- No lugar de 'v-bind' pode deixar simplesmente os dois pontos (:) -->
<p :class="classe">Lorem Ipsum is simply dummy text of the printing and
typesetting industry.</p>
</div>
<script type="text/javascript">
var app = new Vue({
el: "#app",
data: {
titulo: "Vuejs do jeito ninja!",
imagem: "https://vuejs.org/images/logo.png",
alt: "Vuejs is awesome!",
classe: "green"
}
});
</script>
</body>
</html>
Saída:
Aula 07 – Diretiva ‘v-bind:class e style’:
Exemplo:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div id="app" class="row">
<div class="col-lg-12">
<h1>{{ titulo }}</h1>
<button class="btn" v-bind:class="btnClassLimpar">LIMPAR</button>
<button class="btn" v-bind:class="btnClassEnviar">ENVIAR</button>
</div>
</div>
</div>
<script type="text/javascript">
var app = new Vue({
el: "#app",
data: {
titulo: "Vuejs do jeito ninja!",
btnClassLimpar: 'btn-danger',
/*
Também poderia ser um objeto:
btnClassLimpar: {
'btn-danger': true, // Irá aplicar este atributo
'btn-sm': false // Não irá aplicar este atributo
}
*/
btnClassEnviar: 'btn-primary btn-lg'
/*
Também poderia ser um array:
btnClassEnviar: [
'btn-primary', {'btn-lg': false} // Um objeto dentro do array
]
*/
}
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Exemplo2:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div id="app" class="row">
<div class="col-lg-12">
<h1>{{ titulo }}</h1>
<button
class="btn" :class="btnClassLimpar" :style="btnStyleLimpar">LIMPAR</button>
<button
class="btn" :class="btnClassEnviar" :style="btnStyleEnviar">ENVIAR</button>
</div>
</div>
</div>
<script type="text/javascript">
var app = new Vue({
el: "#app",
data: {
titulo: "Vuejs do jeito ninja!",
btnClassLimpar: 'btn-danger',
/*
Também poderia ser um objeto:
btnClassLimpar: {
'btn-danger': true, // Irá aplicar este atributo
'btn-sm': false // Não irá aplicar este atributo
}
*/
btnClassEnviar: 'btn-primary btn-lg',
/*
Também poderia ser um array:
btnClassEnviar: [
'btn-primary', {'btn-lg': false} // Um objeto dentro do array
]
*/
btnStyleLimpar: 'font-size: 50px',
btnStyleEnviar: 'font-size: 10px'
/*
Também poderia ser um objeto:
btnStyleLimpar: {
'font-size': '50px',
'text-transform': 'lowercase' // Caixa baixa
},
btnStyleEnviar: {
'font-size': '10px'
}
*/
}
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Exemplo:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div id="app" class="row">
<div class="col-lg-12">
<h1>{{ titulo }}</h1>
<button class="btn btn-primary" v-on:click="enviar()">Enviar</button>
</div>
</div>
</div>
<script type="text/javascript">
var app = new Vue({
el: "#app",
data: {
titulo: "Vuejs do jeito ninja!",
},
methods: {
enviar() {
alert('Enviando!');
}
}
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Exemplo2:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div id="app" class="row">
<div class="col-lg-12">
<h1>{{ titulo }}</h1>
<form action="http://google.com">
<!--
O acréscimo de '.prevent.stop' ao envento 'click'
bloqueou o redirecionamento para 'http://google.com'
-->
<!--
’v-on:’ pode ser substituído por ‘@’ ficando:
‘@click.prevent.stop’
-->
<button class="btn btn-primary"
v-on:click.prevent.stop="enviar()">Enviar</button>
</form>
</div>
</div>
</div>
<script type="text/javascript">
var app = new Vue({
el: "#app",
data: {
titulo: "Vuejs do jeito ninja!",
},
methods: {
enviar() {
alert('Enviando!');
}
}
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Aula 09 – Filters:
Exemplo:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row">
<div id="app" class="col-lg-12">
<h1>{{ titulo }}</h1>
<p><strong>Usando 'toUpperCase'</strong></p>
<ul>
<li v-for="usuario in usuarios">{{ usuario.nome | toUpperCase() }}</li>
</ul>
<p><strong>Usando 'truncate'</strong></p>
<ul>
<li v-for="usuario in usuarios">{{ usuario.nome | truncate('10') }}</li>
</ul>
</div>
</div>
</div>
<script type="text/javascript">
var app = new Vue({
el: "#app",
data: {
titulo: "Vuejs do jeito ninja!",
usuarios: [
{ nome: 'jon Snow' },
{ nome: 'Tyrion Lannister' },
{ nome: 'Daenerys Targaryen' }
]
},
filters: {
toUpperCase(str) {
return str.toUpperCase();
},
truncate(str, length) {
let output = str;
if (output.length > length) {
output = str.substring(0, length) + ' ...';
}
return output;
}
}
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Exemplo:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row">
<div id="app" class="col-lg-12">
<h1>{{ titulo }}</h1>
{{ nome }} <br>
{{ toUpperCase }}
</div>
</div>
</div>
<script type="text/javascript">
var app = new Vue({
el: "#app",
data: {
titulo: "Vuejs do jeito ninja!",
nome: "Jon Snow"
},
computed: {
toUpperCase() {
return this.nome.toUpperCase()
}
},
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Exemplo2:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row">
<div id="app" class="col-lg-12">
<h1>{{ titulo }}</h1>
{{ fullName }}
</div>
</div>
</div>
<script type="text/javascript">
var app = new Vue({
el: "#app",
data: {
titulo: "Vuejs do jeito ninja!",
firstName: "",
lastName: "",
fullName: ""
},
computed: {
},
watch: {
firstName(newValue) {
this.fullName = newValue + ' ' + this.lastName;
},
lastName(newValue) {
this.fullName = this.firstName + ' ' + newValue;
}
}
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Exemplo3:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Aula 01 - Vuejs do jeito ninja!</title>
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row">
<div id="app" class="col-lg-12">
<h1>{{ titulo }}</h1>
{{ fullName }}
</div>
</div>
</div>
<script type="text/javascript">
var app = new Vue({
el: "#app",
data: {
titulo: "Vuejs do jeito ninja!",
firstName: "",
lastName: ""
},
computed: {
fullName() {
return this.firstName + ' ' + this.lastName;
}
},
watch: {}
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Exemplo4:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row">
<div id="app" class="col-lg-12">
<h1>{{ titulo }}</h1>
{{ fullName }}
</div>
</div>
</div>
<script type="text/javascript">
var app = new Vue({
el: "#app",
data: {
titulo: "Vuejs do jeito ninja!",
firstName: "Jon",
lastName: "Snow"
},
computed: {
fullName() {
return this.firstName + ' ' + this.lastName;
}
},
watch: {
firstName(newValue) {
this.updateUser();
}
},
methods: {
updateUser() {
console.log('Primeiro nome atualizado');
}
}
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row">
<div id="app" class="col-lg-12">
<h1>{{ titulo }}</h1>
</div>
</div>
</div>
<script type="text/javascript">
var app = new Vue({
el: "#app",
beforeCreate() {
console.log('beforeCreate');
console.log('titulo', this.titulo);
console.log('el', this.$el);
},
created() {
console.log('create');
console.log('titulo', this.titulo);
console.log('el', this.$el);
},
beforeMount() {
console.log('beforeMount');
console.log('titulo', this.titulo);
console.log('el', this.$el);
},
mounted() {
console.log('mounted');
console.log('titulo', this.titulo);
console.log('el', this.$el);
},
beforeUpdate() {
console.log('beforeUpdate');
},
updated() {
console.log('updated');
},
data: {
titulo: "Vuejs do jeito ninja!",
},
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Nota: Se for usar por exemplo jquery o correto é utilizá-lo depois que o vuejs tiver feito todas as
suas execuções e o DOM esteja disponibilizado para que o jquery faça suas manipulações. Por
isso é recomendado que códigos do jquery sejam colocados no hooks → mounted.
E com relação aos hooks → beforeUpdate e updated, vejamos o exemplo de saída de console
de alteração da variável titulo:
Aula 12 – Componentes:
Exemplo:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row">
<div id="app" class="col-lg-12">
<h1>{{ titulo }}</h1>
<menu-bar></menu-bar>
<menu-bar2></menu-bar2>
</div>
</div>
</div>
<script type="text/javascript">
// A instância do componente tem de ser feita
// antes da instância do elemento 'app' do VueJS
data: {
titulo: "Vuejs do jeito ninja!",
},
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Exemplo:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Aula 01 - Vuejs do jeito ninja!</title>
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row">
<div id="app" class="col-lg-12">
<!-- Aqui são renderizados juntos o componente pai e filho -->
<navbar></navbar>
<h1>{{ titulo }}</h1>
</div>
</div>
</div>
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed"
data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"
aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Brand</a>
</div>
<script type="text/javascript">
// Componente pai
Vue.component('navbar', {
template: '#nav'
});
// Componente filho
Vue.component('menu-bar', {
template: '#menu'
});
data: {
titulo: "Vuejs do jeito ninja!",
},
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Aula 14 – Enviando e recebendo dados entre componentes pais e filhos:
Exemplo1: Envio de dados do componente ‘pai’ para o ‘filho’ é feito via ‘props’.
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row">
<div id="app" class="col-lg-12">
<!-- Aqui é renderizado juntos o componente pai e filho -->
<navbar></navbar>
<h1>{{ titulo }}</h1>
</div>
</div>
</div>
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed"
data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"
aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Brand</a>
</div>
<script type="text/javascript">
// Componente pai
Vue.component('navbar', {
template: '#nav'
});
// Componente filho com items que estão vindo da chamada ao component
Vue.component('menu-bar', {
template: '#menu',
props: ['items']
});
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row">
<div id="app" class="col-lg-12">
<!-- Aqui é renderizado juntos o componente pai e filho -->
<navbar></navbar>
<h1>{{ titulo }}</h1>
</div>
</div>
</div>
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed"
data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"
aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Brand</a>
</div>
data: {
titulo: "Vuejs do jeito ninja!",
},
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row">
<div id="app" class="col-lg-12">
<!-- Aqui é renderizado juntos o componente pai e filho -->
<navbar></navbar>
<h1>{{ titulo }}</h1>
</div>
</div>
</div>
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed"
data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"
aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Brand</a>
</div>
<script type="text/javascript">
// Componente pai
Vue.component('navbar', {
template: '#nav',
// data em um componente tem a peculiaridade de ser uma função.
data() {
return {
dropdownMenu: [{ label: 'Action1' }, { label: 'Action2' }, { label:
'Action3' }]
}
}
});
// Componente filho
Vue.component('menu-bar', {
template: '#menu',
// Forma mais recomendada de se declarar o 'props'
// de maneira que no caso de se declarar uma
// variável fora do padrão definido o erro possa
// ser melhor rastreado no console.
props: {
items: {
type: Array,
required: true
}
}
});
data: {
titulo: "Vuejs do jeito ninja!",
},
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Exemplo4: Envio de dados do componente filho para o componente pai é feito via emissão
($emit).
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row">
<div id="app" class="col-lg-12">
<!-- Aqui é renderizado juntos o componente pai e filho -->
<navbar></navbar>
<h1>{{ titulo }}</h1>
</div>
</div>
</div>
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed"
data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"
aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Brand</a>
</div>
<script type="text/javascript">
// Componente pai
Vue.component('navbar', {
template: '#nav',
// data dentro de um componente tem a peculiaridade de ser uma função.
data() {
return {
dropdownMenu: [{ label: 'Action1' }, { label: 'Action2' }, { label:
'Action3' }]
}
},
methods: {
getLink(index) {
alert(this.dropdownMenu[index].label);
}
}
});
// Componente filho
Vue.component('menu-bar', {
template: '#menu',
// Forma mais recomendada de se declarar o 'props'
// de maneira que no caso de se declarar uma
// variável fora do padrão definido o erro possa
// ser melhor rastreado no console.
props: {
items: {
type: Array,
required: true
}
},
methods: {
emitClick(index) {
// '$emit' e a ferramenta de emissão do VueJS.
this.$emit('emit-click', index);
}
}
});
data: {
titulo: "Vuejs do jeito ninja!",
},
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Exemplo1:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div id="app">
<br><br><br><br><br>
<div class="container">
<div class="row">
<div class="col-lg-12">
<input-form></input-form>
<br>
<my-list></my-list>
</div>
</div>
</div>
</div>
<template id="form">
<div class="card card-block">
<div class="form-group">
<label for="">Título</label>
<input v-model="title"
type="text" class="form-control">
</div>
<button @click.stop.prevent="submit()"
class="btn btn-primary">Enviar</button>
</div>
</template>
<template id="list">
<ul class="list-group">
<li v-for="item in list"
class="list-group-item">{{ item.title }}</li>
</ul>
</template>
<script type="text/javascript">
Vue.component('input-form', {
template: '#form',
data() {
return {
title: ''
}
},
methods: {
submit() {
this.$eventHub.$emit('submit', this.title);
// eventBus.$emit('submit', this.title);
}
}
});
Vue.component('my-list', {
template: '#list',
// Usando o 'life cycle' 'created'
created() {
// Para pegar a referência do componente 'my-list'
var _thisMyList = this;
this.$eventHub.$on('submit', function(title) {
// eventBus.$on('submit', function(title) {
if (title) {
_thisMyList.list.push({ title: title });
}
});
},
data() {
return {
list: [
{ title: "Ir a feira" }
]
}
}
});
data: {
titulo: "Vuejs do jeito ninja!",
},
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Aula 16 – Slots:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<br><br><br>
<div class="container">
<div class="row">
<div class="col-lg-12">
<card>
<h4 class="card-title">Card title</h4>
<p class="card-text">Some quick example text to build on the card title
and make up the buck of the card's content.</p>
<a href="#" class="btn btn-primary">Go somewhere</a>
</card>
</div>
</div>
</div>
</div>
<template id="card">
<div class="card card-block">
<img src="http://via.placeholder.com/350x150" alt="" class="card-img-top">
<!-- Default -->
<slot></slot>
</div>
</template>
<script type="text/javascript">
Vue.component('card', {
template: '#card',
data() {
return {
title: ''
}
}
});
data: {
titulo: "Vuejs do jeito ninja!",
},
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Exemplo2: Fatiando:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<br><br><br>
<div class="container">
<div class="row">
<div class="col-lg-12">
<card>
<h4 slot="title" class="card-title">Card title</h4>
<p slot="text" class="card-text">Some quick example text to build on
the card title and make up the buck of the card's content.</p>
<a slot="action" href="#" class="btn btn-primary">Go
somewhere</a>
</card>
<br>
<card>
<h4 slot="title" class="card-title">Card title 2</h4>
<p slot="text" class="card-text">Lorem Ipsum is simply dummy text of
the printing and typesetting industry.</p>
<a slot="action" href="#" class="btn btn-primary">Leia
mais</a>
</card>
</div>
</div>
</div>
</div>
<template id="card">
<div class="card card-block">
<img src="http://via.placeholder.com/350x150" alt=""
class="card-img-top">
<slot name="title"></slot>
<slot name="text"></slot>
<slot name="action"></slot>
</div>
</template>
<script type="text/javascript">
Vue.component('card', {
template: '#card',
data() {
return {
title: ''
}
}
});
data: {
titulo: "Vuejs do jeito ninja!",
},
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Exemplo3: 2ª forma de fatiamento:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<br><br><br>
<div class="container">
<div class="row">
<div class="col-lg-12">
<card>
<h4 slot="title" class="card-title">Card title</h4>
<p slot="text" class="card-text">Some quick example text to build on
the card title and make up the buck of the card's content.</p>
<a slot="action" href="#" class="btn btn-primary">Go
somewhere</a>
</card>
<br>
<card>
<h4 slot="title" class="card-title">Card title 2</h4>
<p slot="text" class="card-text">Lorem Ipsum is simply dummy text of
the printing and typesetting industry.</p>
<a slot="action" href="#" class="btn btn-primary">Leia
mais</a>
</card>
</div>
</div>
</div>
</div>
<template id="card">
<div class="card card-block">
<img src="http://via.placeholder.com/350x150" alt=""
class="card-img-top">
<slot name="title"></slot>
<slot name="text"></slot>
<slot name="action"></slot>
</div>
</template>
<script type="text/javascript">
Vue.component('card', {
template: '#card',
data() {
return {
title: ''
}
}
});
data: {
titulo: "Vuejs do jeito ninja!",
},
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Exemplo1:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<br><br><br>
<div class="container">
<div class="row">
<div class="col-lg-12">
<h1>{{ titulo }}</h1>
<button @click="getUsers()" class="btn btn-success">GET USERS</button>
</div>
</div>
</div>
</div>
<script type="text/javascript">
var mixin = {
methods: {
getUsers() {
// rotina de programação
// localizar usuários
console.log('get users');
}
}
}
data: {
titulo: "Vuejs do jeito ninja!",
}
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Exemplo2: Mas caso exista um método, dentro da instância do VueJS, com mesmo nome será dado
a preferência para este método (da instância):
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<br><br><br>
<div class="container">
<div class="row">
<div class="col-lg-12">
<h1>{{ titulo }}</h1>
<button @click="getUsers()" class="btn btn-success">GET USERS</button>
</div>
</div>
</div>
</div>
<script type="text/javascript">
var mixin = {
methods: {
getUsers() {
// rotina de programação
// localizar usuários
console.log('get users');
}
}
}
data: {
titulo: "Vuejs do jeito ninja!",
},
methods: {
getUsers() {
// rotina de programação
// localizar usuários
console.log('get users dentro da instância!');
}
}
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Aula 18 – Ajax com vue-resource:
Exemplo:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<br><br><br>
<div class="container">
<div class="row">
<div class="col-lg-12">
<h1>{{ titulo }}</h1>
<button @click="getUsers()" class="btn btn-success">GET USERS</button>
<ul>
<li v-for="user in users">{{ user.name }}</li>
</ul>
</div>
</div>
</div>
</div>
<script type="text/javascript">
var mixin = {
methods: {
getUsers() {
this.loader.users = true;
var url = 'http://jsonplaceholder.typicode.com/users';
this.$http.get(url)
.then(function(response) {
this.users = response.body;
}, function(error) {
this.response.status = "error";
})
.finally(function() {
this.loader.users = false;
});
}
}
}
data: {
titulo: "Vuejs do jeito ninja!",
users: [],
loader: {
users: false
},
response: {
msg: "Erro ao conectar",
status: ""
}
}
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Aula 19 – Ajax com axios:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<br><br><br>
<div class="container">
<div class="row">
<div class="col-lg-12">
<h1>{{ titulo }}</h1>
<button @click="getUsers()" class="btn btn-success">GET USERS</button>
<ul>
<li v-for="user in users">{{ user.name }}</li>
</ul>
</div>
</div>
</div>
</div>
<script type="text/javascript">
var mixin = {
methods: {
getUsers() {
this.loader.users = true;
var url = 'http://jsonplaceholder.typicode.com/users';
var _this = this;
axios.get(url).then(function( response ) {
_this.users = response.data;
_this.loader.users = false;
});
}
}
}
data: {
titulo: "Vuejs do jeito ninja!",
users: [],
loader: {
users: false
},
response: {
msg: "Erro ao conectar",
status: ""
}
}
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Aula 20 – Atributos Especiais ‘key’, ‘ref’ e ‘is’:
Exemplo:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<br><br><br>
<div class="container">
<div class="row">
<div class="col-lg-12">
<h1 ref="title">{{ titulo }}</h1>
<!--
O 'component' é um componente anônimo
que se transforma na 'tag' que for
atribuída ao atributo 'is'.
Se for via 'bind' (:is) o atributo será
uma variável.
Se não for via 'bind', ou seja, 'is'
puro o atributo será uma constante,
ou seja, uma 'string'.
-->
<component :is="movie"></component>
<!--
É uma referência ao elemento 'ul'
capturada no 'script'.
-->
<ul ref="users">
<!--
Não usar o 'key' a aplicação irá
funcionar, porém, a performance
é maior usando.
-->
<li v-for="(item, index) in users" :key="item.name">{{ item.name }} <a
@click="remove()" href="#">X</a></li>
</ul>
</div>
</div>
</div>
</div>
<template id="transformers">
<div>
<h4>Transformers</h4>
<ul>
<li v-for="item in transformers">{{ item.name }}</li>
</ul>
</div>
</template>
<template id="games-of-thrones">
<div>
<h4>Games of Thrones</h4>
<ul>
<li v-for="item in gamesOfThrones">{{ item.name }}</li>
</ul>
</div>
</template>
<script type="text/javascript">
Vue.component('transformers', {
template: '#transformers',
data() {
return {
transformers: [
{ name: 'Optimus Prime' },
{ name: 'Bumbie Bee' },
{ name: 'Megatron' }
]
}
}
});
Vue.component('games-of-thrones', {
template: '#games-of-thrones',
data() {
return {
gamesOfThrones: [
{ name: 'Jon Snow' },
{ name: 'Daenerys Targaryen' },
{ name: 'Tyron' }
]
}
}
});
mounted() {
console.log(this.$refs.users.innerText);
},
data: {
titulo: "Vuejs do jeito ninja!",
users: [
{ name: 'Emma' },
{ name: 'Sophia' },
{ name: 'Isabella' }
],
movie: 'games-of-thrones'
},
methods: {
remove(index) {
this.users.splice(index, 1);
}
}
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Aula 21 – Transições:
Exemplo:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
<!--
Efeito de transição para a ‘tag’ ‘transition’.
-->
<style>
.fade-enter-active, .fade-leave-active {
transition: opacity .5s
}
.fade-enter, .fade-leave-to {
opacity: 0
}
</style>
</head>
<body>
<div id="app">
<br><br><br>
<div class="container">
<div class="row">
<div class="col-lg-12">
<h1 ref="title">{{ titulo }}</h1>
<!--
’select’ usado para realizar a troca do
do ‘template’ da ‘tag’ ‘component’.
-->
<select v-model="movie">
<option value="transformers">Transformers</option>
<option value="games-of-thrones">Game of Thrones</option>
</select>
<!--
Efeito de transição conforme ‘style’ acima.
-->
<transition name="fade">
<component :is="movie"></component>
</transition>
<ul ref="users">
<li v-for="(item, index) in users" :key="item.name">{{ item.name }} <a
@click="remove()" href="#">X</a></li>
</ul>
</div>
</div>
</div>
</div>
<template id="transformers">
<div>
<h4>Transformers</h4>
<ul>
<li v-for="item in transformers">{{ item.name }}</li>
</ul>
</div>
</template>
<template id="games-of-thrones">
<div>
<h4>Games of Thrones</h4>
<ul>
<li v-for="item in gamesOfThrones">{{ item.name }}</li>
</ul>
</div>
</template>
<script type="text/javascript">
Vue.component('transformers', {
template: '#transformers',
data() {
return {
transformers: [
{ name: 'Optimus Prime' },
{ name: 'Bumbie Bee' },
{ name: 'Megatron' }
]
}
}
});
Vue.component('games-of-thrones', {
template: '#games-of-thrones',
data() {
return {
gamesOfThrones: [
{ name: 'Jon Snow' },
{ name: 'Daenerys Targaryen' },
{ name: 'Tyron' }
]
}
}
});
mounted() {
console.log(this.$refs.users.innerText);
},
data: {
titulo: "Vuejs do jeito ninja!",
users: [
{ name: 'Emma' },
{ name: 'Sophia' },
{ name: 'Isabella' }
],
movie: 'games-of-thrones'
},
methods: {
remove(index) {
this.users.splice(index, 1);
}
}
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Nota: Conteúdo para a criação de ‘single page application’ (SPA) Aplicação de página única.
Exemplo:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<br><br><br>
<div class="container">
<div class="row">
<div class="col-lg-12">
<h1 ref="title">{{ titulo }}</h1>
<!-- Links para as rotas -->
<ul>
<li><router-link to="/transformers">Transformers</router-link></li>
<li><router-link to="/games-of-thrones">Game Of
Thrones</router-link></li>
</ul>
<!-- Usando o 'router-view' para renderizar os componentes -->
<router-view></router-view>
</div>
</div>
</div>
</div>
<template id="transformers">
<div>
<h4>Transformers</h4>
<ul>
<li v-for="item in transformers">{{ item.name }}</li>
</ul>
</div>
</template>
<template id="games-of-thrones">
<div>
<h4>Games of Thrones</h4>
<ul>
<li v-for="item in gamesOfThrones">{{ item.name }}</li>
</ul>
</div>
</template>
<script type="text/javascript">
// Atrelando variável 'Transformers' para roteamento.
var Transformers = Vue.component('transformers', {
template: '#transformers',
data() {
return {
transformers: [
{ name: 'Optimus Prime' },
{ name: 'Bumbie Bee' },
{ name: 'Megatron' }
]
}
}
});
// Atrelando variável 'GameOfThrones' para roteamento.
var GamesOfThrones = Vue.component('games-of-thrones', {
template: '#games-of-thrones',
data() {
return {
gamesOfThrones: [
{ name: 'Jon Snow' },
{ name: 'Daenerys Targaryen' },
{ name: 'Tyron' }
]
}
}
});
// Criando uma instância do roteador.
var router = new VueRouter({
routes: [
{ path: '/transformers', component: Transformers },
{ path: '/games-of-thrones', component: GamesOfThrones }
]
});
data: {
titulo: "Vuejs do jeito ninja!",
},
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Aula 23 – Rotas nomeadas e history mode:
Exemplo:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<br><br><br>
<div class="container">
<div class="row">
<div class="col-lg-12">
<h1 ref="title">{{ titulo }}</h1>
<!-- Links para as rotas -->
<ul>
<!--
Como a rota agora é definida por um objeto
o atributo 'to' se tornou um 'bind' e por
deve ser escrito ':to'.
-->
<li><router-link :to="{ name:
'transformers' }">Transformers</router-link></li>
<li><router-link :to="{ name: 'game_Of_Thrones' }">Game Of
Thrones</router-link></li>
</ul>
<!-- Usando o 'router-view' para renderizar os componentes -->
<router-view></router-view>
</div>
</div>
</div>
</div>
<template id="transformers">
<div>
<h4>Transformers</h4>
<ul>
<li v-for="item in transformers">{{ item.name }}</li>
</ul>
</div>
</template>
<template id="games-of-thrones">
<div>
<h4>Games of Thrones</h4>
<ul>
<li v-for="item in gamesOfThrones">{{ item.name }}</li>
</ul>
</div>
</template>
<script type="text/javascript">
// Atrelando variável 'Transformers' para roteamento.
var Transformers = Vue.component('transformers', {
template: '#transformers',
data() {
return {
transformers: [
{ name: 'Optimus Prime' },
{ name: 'Bumbie Bee' },
{ name: 'Megatron' }
]
}
}
});
// Atrelando variável 'GameOfThrones' para roteamento.
var GamesOfThrones = Vue.component('games-of-thrones', {
template: '#games-of-thrones',
data() {
return {
gamesOfThrones: [
{ name: 'Jon Snow' },
{ name: 'Daenerys Targaryen' },
{ name: 'Tyron' }
]
}
}
});
// Criando uma instância do roteador.
var router = new VueRouter({
// Remove a hashtag '#' da 'URL'
mode: 'history',
routes: [
// Acrescentamos a variável 'name' para atribuir um nome a rota.
// Isto é chamado de rota nomeada.
{ path: '/transformers', name: 'transformers', component: Transformers },
{ path: '/games-of-thrones', name: 'game_Of_Thrones', component:
GamesOfThrones }
]
});
var app = new Vue({
el: "#app",
data: {
titulo: "Vuejs do jeito ninja!",
},
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Exemplo:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<br><br><br>
<div class="container">
<div class="row">
<div class="col-lg-12">
<h1 ref="title">{{ titulo }}</h1>
<!-- Links para as rotas -->
<ul>
<li><router-link :to="{ name:
'transformers' }">Transformers</router-link></li>
<li><router-link :to="{ name: 'game_Of_Thrones' }">Game Of
Thrones</router-link></li>
</ul>
<!-- Usando o 'router-view' para renderizar os componentes -->
<router-view></router-view>
</div>
</div>
</div>
</div>
<template id="transformers">
<div class="row">
<div class="col-lg-2">
<h4>Transformers</h4>
<ul>
<!-- Usando o 'router-view' para renderizar o componente das subrotas -->
<li v-for="item in transformers"><router-link :to="{ name:
'transformersContent', params: { name:
item.slug } }">{{ item.name }}</router-link></li>
</ul>
</div>
<div class="col-lg-6">
<!-- Usando o 'router-view' para renderizar os componentes -->
<router-view></router-view>
</div>
</div>
</template>
<template id="transformersContent">
<div>
<h4>Conteúdo Transformers</h4>
<!--
Nome da subrota para ser usada pela 'API' para extrair
o conteúdo referente a este caminho
-->
{{ $route.params.name }}
</div>
</template>
<template id="games-of-thrones">
<div>
<h4>Games of Thrones</h4>
<ul>
<li v-for="item in gamesOfThrones">{{ item.name }}</li>
</ul>
</div>
</template>
<script type="text/javascript">
// Atrelando variável 'Transformers' para roteamento.
var Transformers = Vue.component('transformers', {
template: '#transformers',
data() {
return {
transformers: [
{ name: 'Optimus Prime', slug: 'optimus-prime' },
{ name: 'Bumble Bee', slug: 'bumble-bee' },
{ name: 'Megatron', slug: 'megatron' }
]
}
}
});
// Atrelando variável 'GameOfThrones' para roteamento.
var GamesOfThrones = Vue.component('games-of-thrones', {
template: '#games-of-thrones',
data() {
return {
gamesOfThrones: [
{ name: 'Jon Snow' },
{ name: 'Daenerys Targaryen' },
{ name: 'Tyron' }
]
}
}
});
// Criando o componente de subrota.
var TransformersContent = Vue.component('transformers-content', {
template: '#transformersContent'
});
// Criando uma instância do roteador.
var router = new VueRouter({
// Remove a hashtag '#' da 'URL'
mode: 'history',
routes: [
// Criando a variável 'children' referente a subrota.
{ path: '/transformers', name: 'transformers', component: Transformers,
children: [
{ path: ':name', name: 'transformersContent', component:
TransformersContent }
]
},
{ path: '/games-of-thrones', name: 'game_Of_Thrones', component:
GamesOfThrones }
]
});
var app = new Vue({
el: "#app",
data: {
titulo: "Vuejs do jeito ninja!",
},
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Aula 25 – Rotas - navegação automática:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<br><br><br>
<div class="container">
<div class="row">
<div class="col-lg-12">
<h1 ref="title">{{ titulo }}</h1>
<!-- Links para as rotas -->
<ul>
<li><router-link :to="{ name:
'transformers' }">Transformers</router-link></li>
<li><router-link :to="{ name: 'game_Of_Thrones' }">Game Of
Thrones</router-link></li>
</ul>
<!-- Usando o 'router-view' para renderizar os componentes -->
<router-view></router-view>
</div>
</div>
</div>
</div>
<template id="transformers">
<div class="row">
<div class="col-lg-2">
<h4>Transformers</h4>
<ul>
<!-- Usando o 'router-view' para renderizar o componente das subrotas -->
<li v-for="item in transformers"><router-link :to="{ name:
'transformersContent', params: { name:
item.slug } }">{{ item.name }}</router-link></li>
</ul>
</div>
<div class="col-lg-6">
<!-- Usando o 'router-view' para renderizar os componentes -->
<router-view></router-view>
</div>
</div>
</template>
<template id="transformersContent">
<div>
<h4>Conteúdo Transformers</h4>
<!--
Nome da subrota para ser usada pela 'API' para extrair o conteúdo referente
a este caminho
-->
{{ $route.params.name }}
</div>
</template>
<template id="games-of-thrones">
<div>
<h4>Games of Thrones</h4>
<ul>
<li v-for="item in gamesOfThrones">{{ item.name }}</li>
</ul>
</div>
</template>
<script type="text/javascript">
// Atrelando variável 'Transformers' para roteamento.
var Transformers = Vue.component('transformers', {
template: '#transformers',
data() {
return {
transformers: [
{ name: 'Optimus Prime', slug: 'optimus-prime' },
{ name: 'Bumble Bee', slug: 'bumble-bee' },
{ name: 'Megatron', slug: 'megatron' }
]
}
}
});
// Atrelando variável 'GameOfThrones' para roteamento.
var GamesOfThrones = Vue.component('games-of-thrones', {
template: '#games-of-thrones',
data() {
return {
gamesOfThrones: [
{ name: 'Jon Snow' },
{ name: 'Daenerys Targaryen' },
{ name: 'Tyron' }
]
}
}
});
// Criando o componente de subrota.
var TransformersContent = Vue.component('transformers-content', {
template: '#transformersContent'
});
// Criando uma instância do roteador.
var router = new VueRouter({
// Remove a hashtag '#' da 'URL'
mode: 'history',
routes: [
// Criando a variável 'children' referente a subrota.
{ path: '/transformers', name: 'transformers', component: Transformers,
children: [
{ path: ':name', name: 'transformersContent', component:
TransformersContent }
]
},
{ path: '/games-of-thrones', name: 'game_Of_Thrones', component:
GamesOfThrones }
]
});
data: {
titulo: "Vuejs do jeito ninja!",
},
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Exemplo1: Rota padrão de erro, caso entre por uma ‘url’ inválida:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<br><br><br>
<div class="container">
<div class="row">
<div class="col-lg-12">
<h1 ref="title">{{ titulo }}</h1>
<!-- Links para as rotas -->
<ul>
<li><router-link :to="{ name:
'transformers' }">Transformers</router-link></li>
<li><router-link :to="{ name: 'game_Of_Thrones' }">Game Of
Thrones</router-link></li>
<li><router-link to="/arrow">Arrow</router-link></li>
</ul>
<!-- Usando o 'router-view' para renderizar os componentes -->
<router-view></router-view>
</div>
</div>
</div>
</div>
<template id="transformers">
<div class="row">
<div class="col-lg-2">
<h4>Transformers</h4>
<ul>
<!-- Usando o 'router-view' para renderizar o componente das subrotas -->
<li v-for="item in transformers"><router-link :to="{ name:
'transformersContent', params: { name:
item.slug } }">{{ item.name }}</router-link></li>
</ul>
</div>
<div class="col-lg-6">
<!-- Usando o 'router-view' para renderizar os componentes -->
<router-view></router-view>
</div>
</div>
</template>
<template id="transformersContent">
<div>
<h4>Conteúdo Transformers</h4>
<!--
Nome da subrota para ser usada pela 'API' para extrair o conteúdo referente
a este caminho
-->
{{ $route.params.name }}
</div>
</template>
<template id="games-of-thrones">
<div>
<h4>Games of Thrones</h4>
<ul>
<li v-for="item in gamesOfThrones">{{ item.name }}</li>
</ul>
</div>
</template>
<template id="error404">
<div>
<h1>Página não encontrada</h1>
<p>Ops! Parece que esta página não existe.</p>
</div>
</template>
<script type="text/javascript">
// Atrelando variável 'Transformers' para roteamento.
var Transformers = Vue.component('transformers', {
template: '#transformers',
data() {
return {
transformers: [
{ name: 'Optimus Prime', slug: 'optimus-prime' },
{ name: 'Bumble Bee', slug: 'bumble-bee' },
{ name: 'Megatron', slug: 'megatron' }
]
}
}
});
// Atrelando variável 'GameOfThrones' para roteamento.
var GamesOfThrones = Vue.component('games-of-thrones', {
template: '#games-of-thrones',
data() {
return {
gamesOfThrones: [
{ name: 'Jon Snow' },
{ name: 'Daenerys Targaryen' },
{ name: 'Tyron' }
]
}
}
});
// Criando o componente de subrota.
var TransformersContent = Vue.component('transformers-content', {
template: '#transformersContent'
});
// Criando o componente error404.
var error404 = Vue.component('error404', {
template: '#error404'
});
// Criando uma instância do roteador.
var router = new VueRouter({
// Remove a hashtag '#' da 'URL'
mode: 'history',
routes: [
// Rota onde deve iniciar para evitar
// entre diretamente na página de error404
{ path: '/', name: 'home' },
// Criando a variável 'children' referente a subrota.
{ path: '/transformers', name: 'transformers', component: Transformers,
children: [
{ path: ':name', name: 'transformersContent', component:
TransformersContent }
]
},
{ path: '/games-of-thrones', name: 'game_Of_Thrones', component:
GamesOfThrones },
// Caso seja digitado uma 'url' desconhecida
// direciona para página 'error404'.
{ path: '*', name: 'error404', component: error404 }
]
});
data: {
titulo: "Vuejs do jeito ninja!",
},
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Exemplo2:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<br><br><br>
<div class="container">
<div class="row">
<div class="col-lg-12">
<h1 ref="title">{{ titulo }}</h1>
<!-- Links para as rotas -->
<ul>
<li><router-link :to="{ name:
'transformers' }">Transformers</router-link></li>
<li><router-link :to="{ name: 'game_Of_Thrones' }">Game Of
Thrones</router-link></li>
<li><router-link to="/arrow">Arrow</router-link></li>
</ul>
<!-- Usando o 'router-view' para renderizar os componentes -->
<router-view></router-view>
</div>
</div>
</div>
</div>
<template id="transformers">
<div class="row">
<div class="col-lg-2">
<h4>Transformers</h4>
<ul>
<!-- Usando o 'router-view' para renderizar o componente das subrotas -->
<li v-for="item in transformers"><router-link :to="{ name:
'transformersContent', params: { name:
item.slug } }">{{ item.name }}</router-link></li>
</ul>
</div>
<div class="col-lg-6">
<!-- Usando o 'router-view' para renderizar os componentes -->
<router-view></router-view>
</div>
</div>
</template>
<template id="transformersContent">
<div>
<h4>Conteúdo Transformers</h4>
<!--
Nome da subrota para ser usada pela 'API' para extrair o conteúdo referente
a este caminho
-->
{{ $route.params.name }}
</div>
</template>
<template id="games-of-thrones">
<div>
<h4>Games of Thrones</h4>
<ul>
<li v-for="item in gamesOfThrones">{{ item.name }}</li>
</ul>
</div>
</template>
<template id="error404">
<div>
<h1>Página não encontrada</h1>
<p>Ops! Parece que esta página não existe.</p>
</div>
</template>
<script type="text/javascript">
// Atrelando variável 'Transformers' para roteamento.
var Transformers = Vue.component('transformers', {
template: '#transformers',
data() {
return {
transformers: [
{ name: 'Optimus Prime', slug: 'optimus-prime' },
{ name: 'Bumble Bee', slug: 'bumble-bee' },
{ name: 'Megatron', slug: 'megatron' }
]
}
}
});
// Atrelando variável 'GameOfThrones' para roteamento.
var GamesOfThrones = Vue.component('games-of-thrones', {
template: '#games-of-thrones',
data() {
return {
gamesOfThrones: [
{ name: 'Jon Snow' },
{ name: 'Daenerys Targaryen' },
{ name: 'Tyron' }
]
}
}
});
// Criando o componente de subrota.
var TransformersContent = Vue.component('transformers-content', {
template: '#transformersContent'
});
// Criando o componente error404.
var error404 = Vue.component('error404', {
template: '#error404'
});
// Criando uma instância do roteador.
var router = new VueRouter({
// Remove a hashtag '#' da 'URL'
mode: 'history',
routes: [
// Rota onde deve iniciar para evitar
// entre diretamente na página de error404.
// Inclui tb um redirecionamento.
{ path: '/', name: 'home', redirect:
{
name: 'transformersContent', params: { name: 'optimus-prime'}
}
},
// Criando a variável 'children' referente a subrota.
{ path: '/transformers', name: 'transformers', component: Transformers,
children: [
{ path: ':name', name: 'transformersContent', component:
TransformersContent }
]
},
{ path: '/games-of-thrones', name: 'game_Of_Thrones', component:
GamesOfThrones },
// Caso seja digitado uma 'url' desconhecida
// direciona para página 'error404'.
{ path: '*', name: 'error404', component: error404 }
]
});
data: {
titulo: "Vuejs do jeito ninja!",
},
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída:
Exemplo:
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css">
<style>
.dark {
color: #fff;
background-color: #000;
}
.light {
color: #fff;
background-color: #666;
}
</style>
</head>
<body>
<div id="app">
<br><br><br>
<div class="container">
<div class="row">
<div class="col-lg-12">
<h1 ref="title">{{ titulo }}</h1>
<!-- Links para as rotas -->
<ul>
<li><router-link :to="{ name:
'transformers' }">Transformers</router-link></li>
<li><router-link :to="{ name: 'game_Of_Thrones' }">Game Of
Thrones</router-link></li>
<li><router-link to="/arrow">Arrow</router-link></li>
</ul>
<!-- Usando o 'router-view' para renderizar os componentes -->
<router-view></router-view>
</div>
</div>
</div>
</div>
<template id="transformers">
<div class="row">
<div :class="['col-lg-2', sidebar]">
Sidebar
</div>
<div class="col-lg-2">
<h4>Transformers</h4>
<ul>
<!-- Usando o 'router-view' para renderizar o componente das subrotas -->
<li v-for="item in transformers"><router-link :to="{ name:
'transformersContent', params: { name:
item.slug } }">{{ item.name }}</router-link></li>
</ul>
</div>
<div class="col-lg-6">
<!--
Usando o 'router-view'
para renderizar os componentes
-->
<router-view></router-view>
</div>
</div>
</template>
<template id="transformersContent">
<div>
<h4>Conteúdo Transformers</h4>
<!--
Nome da subrota para ser usada pela 'API' para extrair o conteúdo referente
a este caminho
-->
{{ $route.params.name }}
</div>
</template>
<template id="games-of-thrones">
<div>
<h4>Games of Thrones</h4>
<ul>
<li v-for="item in gamesOfThrones">{{ item.name }}</li>
</ul>
</div>
</template>
<template id="error404">
<div>
<h1>Página não encontrada</h1>
<p>Ops! Parece que esta página não existe.</p>
</div>
</template>
<script type="text/javascript">
// Atrelando variável 'Transformers' para roteamento.
var Transformers = Vue.component('transformers', {
template: '#transformers',
props: {
// Definindo o tipo de valor
// que a variável irá receber
// para ser repassada ao
// componente.
sidebar: String
},
data() {
return {
transformers: [
{ name: 'Optimus Prime', slug: 'optimus-prime' },
{ name: 'Bumble Bee', slug: 'bumble-bee' },
{ name: 'Megatron', slug: 'megatron' }
]
}
}
});
// Atrelando variável 'GameOfThrones' para roteamento.
var GamesOfThrones = Vue.component('games-of-thrones', {
template: '#games-of-thrones',
data() {
return {
gamesOfThrones: [
{ name: 'Jon Snow' },
{ name: 'Daenerys Targaryen' },
{ name: 'Tyron' }
]
}
}
});
// Criando o componente de subrota.
var TransformersContent = Vue.component('transformers-content', {
template: '#transformersContent'
});
// Criando o componente error404.
var error404 = Vue.component('error404', {
template: '#error404'
});
// Criando uma instância do roteador.
var router = new VueRouter({
// Remove a hashtag '#' da 'URL'
mode: 'history',
routes: [
// Rota onde deve iniciar para evitar
// entre diretamente na página de error404.
// Inclui tb um redirecionamento.
{ path: '/', name: 'home', redirect:
{
name: 'transformersContent', params: { name: 'optimus-prime'}
}
},
// Criando a variável 'children' referente a subrota.
{ path: '/transformers', name: 'transformers', component: Transformers,
// Passando valor para a variável
// que será recebida na renderização
// do componente.
props: { sidebar: 'light' },
children: [
{ path: ':name', name: 'transformersContent', component:
TransformersContent }
]
},
{ path: '/games-of-thrones', name: 'game_Of_Thrones', component:
GamesOfThrones },
// Caso seja digitado uma 'url' desconhecida
// direciona para página 'error404'.
{ path: '*', name: 'error404', component: error404 }
]
});
data: {
titulo: "Vuejs do jeito ninja!",
},
});
</script>
<script type="text/javascript"
src="assets/js/jquery-3.3.1/jquery.min.js"></script>
<script type="text/javascript"
src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</body>
</html>
Saída: