Tutorial Vuejs
Tutorial Vuejs
Começando
Nota
Além disso, todos os exemplos estarão usando a versão completa do Vue para tornar
possível a compilação de modelos on-the-fly. Veja mais detalhes aqui .
HTML
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<div id="app">
<h1>Hello App!</h1>
<p>
<!-- use router-link component for navigation. -->
<!-- specify the link by passing the `to` prop. -->
<!-- `<router-link>` will be rendered as an `<a>` tag by default -->
<router-link to="/foo">Go to Foo</router-link>
<router-link to="/bar">Go to Bar</router-link>
</p>
<!-- route outlet -->
<!-- component matched by the route will render here -->
<router-view></router-view>
</div>
JavaScript
// 0. If using a module system (e.g. via vue-cli), import Vue and VueRouter
// and then call `Vue.use(VueRouter)`.
Ao injetar o roteador, obtemos acesso a ele this.$router, assim como a rota atual,
como this.$routedentro de qualquer componente:
// Home.vue
export default {
computed: {
username () {
// We will see what `params` is shortly
return this.$route.params.username
}
},
methods: {
goBack () {
window.history.length > 1
? this.$router.go(-1)
: this.$router.push('/')
}
}
}
const User = {
template: '<div>User</div>'
}
Um segmento dinâmico é denotado por dois pontos :. Quando uma rota é correspondida, o
valor dos segmentos dinâmicos será exposto como this.$route.paramsem todos os
componentes. Portanto, podemos renderizar o ID do usuário atual atualizando Usero
modelo para isto:
{
r=
e
stU
n
cte
.}/o
u
o
sr{$
iv>U
d
:'<
la
p
m
const User = {
template: '<div>User {{ $route.params.id }}</div>'
}
Você pode conferir um exemplo ao vivo aqui .
Você pode ter vários segmentos dinâmicos na mesma rota e eles serão mapeados para os
campos correspondentes em $route.params. Exemplos:
Uma coisa a ser observada ao usar rotas com params é que, quando o usuário navega
de /user/foopara /user/bar, a mesma instância do componente será reutilizada . Como
as duas rotas processam o mesmo componente, isso é mais eficiente do que destruir a
instância antiga e criar uma nova. No entanto, isso também significa que os ganchos do
ciclo de vida do componente não serão chamados .
const User = {
template: '...',
watch: {
'$route' (to, from) {
// react to route changes...
}
}
}
const User = {
template: '...',
beforeRouteUpdate (to, from, next) {
// react to route changes...
// don't forget to call next()
}
}
Padrões Avançados de Correspondência
Prioridade de correspondência
Às vezes, o mesmo URL pode ser correspondido por várias rotas. Nesse caso, a prioridade
correspondente é determinada pela ordem de definição da rota: quanto mais cedo uma rota
é definida, maior a prioridade que recebe.
Rotas aninhadas
<div id="app">
<router-view></router-view>
</div>
const User = {
template: '<div>User {{ $route.params.id }}</div>'
}
const router = new VueRouter({
routes: [
{ path: '/user/:id', component: User }
]
})
const User = {
template: `
<div class="user">
<h2>User {{ $route.params.id }}</h2>
<router-view></router-view>
</div>
`
}
Como você pode ver, a opção é apenas outro Array de objetos de configuração de rota
n
re
ild
h
c
como ele mesmo. Portanto, você pode manter as visualizações de aninhamento o quanto
s
te
u
ro
precisar.
Neste ponto, com a configuração acima, quando você visita , nada será renderizado
rfo
e
s
/u
dentro da saída, porque nenhum sub route é correspondido. Talvez você queira renderizar
r
e
s
U
alguma coisa lá. Nesse caso, você pode fornecer um caminho de sub-rotina vazio:
Navegação programática
Além de usar <router-link>para criar tags de âncora para navegação declarativa, podemos
fazer isso programaticamente usando os métodos de instância do roteador.
Nota: Dentro de uma instância do Vue, você tem acesso à instância do roteador
como $router. Você pode, portanto, ligar this.$router.push.
Para navegar para um URL diferente, use router.push. Esse método envia uma nova
entrada para a pilha do histórico, portanto, quando o usuário clicar no botão Voltar do
navegador, ele será direcionado para o URL anterior.
Este é o método chamado internamente quando você clica em um <router-link>, então
clicar <router-link :to="...">é o equivalente de chamar router.push(...).
Declarativo Programático
// object
router.push({ path: 'home' })
// named route
router.push({ name: 'user', params: { userId: 123 }})
Nota : paramssão ignorados se pathfor fornecido um, o que não é o caso query, como
mostrado no exemplo acima. Em vez disso, você precisa fornecer a namerota ou
especificar manualmente o todo pathcom qualquer parâmetro:
Nota: Se o destino for o mesmo da rota atual e somente os parâmetros estiverem mudando
(por exemplo, indo de um perfil para outro /users/1-> /users/2), você terá que
usá-lo beforeRouteUpdatepara reagir às mudanças (por exemplo, buscar as informações
do usuário).
router.replace(location, onComplete?, onAbort?)
Ele age como router.push, a única diferença é que ele navega sem pressionar uma nova
entrada de histórico, como o próprio nome sugere - ele substitui a entrada atual.
Declarativo Programático
router.go(n)
Esse método usa um único inteiro como parâmetro que indica por quantos passos para
avançar ou retroceder na pilha do histórico, semelhante a window.history.go(n).
Exemplos
// go forward by 3 records
router.go(3)
Manipulação da História
Vale ressaltar que os métodos de navegação Vue Router ( push, replace, go) trabalhar de
forma consistente em todos os modos Router ( history, hashe abstract).
Rotas nomeadas
Para vincular a uma rota nomeada, você pode passar um objeto para o prop router-linkdo
componente to:
Exibições nomeadas
Às vezes, é necessário exibir várias exibições ao mesmo tempo em vez de aninhar, por
exemplo, criando um layout com uma sidebarexibição e uma mainexibição. É aqui que as
visualizações nomeadas são úteis. Em vez de ter uma única saída na sua opinião, você
pode ter vários e dar a cada um deles um nome. Um router-viewsem nome será
dado defaultcomo seu nome.
É possível criar layouts complexos usando vistas nomeadas com vistas aninhadas. Ao fazer
isso, você também precisará nomear os router-view
componentes aninhados usados. Vamos pegar um exemplo do painel Configurações:
Nota : Vamos esquecer como o HTML / CSS deve parecer para representar tal layout e
focar nos componentes usados
Os componentes da visão aninhada são omitidos aqui, mas você pode encontrar o
código-fonte completo para o exemplo acima aqui
Então você pode conseguir o layout acima com esta configuração de rota:
{
path: '/settings',
// You could also have named views at the top
component: UserSettings,
children: [{
path: 'emails',
component: UserEmailsSubscriptions
}, {
path: 'profile',
components: {
default: UserProfile,
helper: UserProfilePreview
}
}]
}
Redirecionar e Alias
Redirecionar
Observe que os Guardas de Navegação não são aplicados na rota que redireciona, apenas
no seu destino. No exemplo abaixo, adicionar um ou guarda à rota não teria nenhum efeito.
t
n
rE
fo
e
b v
a
rL
fo
e
b /a
Alias
Um alias de como significa quando o usuário visita , o URL permanece , mas será
/a /b /b /b
Um alias oferece a liberdade de mapear uma estrutura de interface do usuário para uma
URL arbitrária, em vez de ser restringida pela estrutura de aninhamento da configuração.
const User = {
template: '<div>User {{ $route.params.id }}</div>'
}
const router = new VueRouter({
routes: [
{ path: '/user/:id', component: User }
]
})
const User = {
props: ['id'],
template: '<div>User {{ id }}</div>'
}
const router = new VueRouter({
routes: [
{ path: '/user/:id', component: User, props: true },
// for routes with named views, you have to define the `props` option for
each named view:
{
path: '/user/:id',
components: { default: User, sidebar: Sidebar },
props: { default: true, sidebar: false }
}
]
})
Isso permite que você use o componente em qualquer lugar, o que torna o componente
mais fácil de reutilizar e testar.
Modo booleano
Quando props estiver definido como true, o route.paramsserá definido como o componente
adereços.
Modo de objeto
Quando props é um objeto, isso será definido como o componente adjunto como é. Útil para
quando os adereços são estáticos.
({cro
R
V
w
e
stru
= n
o
s:[{p
te
u
}]})
u
sl,cP
w
f-e
in
m
:'/ro
th
a
Modo de função
Você pode criar uma função que retorne adereços. Isso permite converter parâmetros em
outros tipos, combinar valores estáticos com valores baseados em rota, etc.
Tente manter a propsfunção sem estado, pois ela é avaliada apenas nas alterações de
rota. Use um componente wrapper se você precisar definir os props, dessa forma o vue
pode reagir a mudanças de estado.
O modo padrão vue-routeré o modo hash - ele usa o hash da URL para simular uma URL
completa para que a página não seja recarregada quando a URL for alterada.
Para se livrar do hash, podemos usar o modo de histórico do roteador , que aproveita
a history.pushStateAPI para obter a navegação de URL sem recarregar a página:
Aqui vem um problema: como nosso aplicativo é um aplicativo do lado do cliente em uma
única página, sem uma configuração adequada do servidor, os usuários receberão um erro
404 se acessarem http://oursite.com/user/iddiretamente em seu navegador. Agora isso é
feio.
Não se preocupe: para corrigir o problema, tudo o que você precisa fazer é adicionar uma
rota simples de recuperação para seu servidor. Se o URL não corresponder a nenhum
recurso estático, ele deverá exibir a mesma index.htmlpágina em que seu aplicativo está.
Beautiful, novamente!
Apache
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</IfModule>
nginx
location / {
try_files $uri $uri/ /index.html;
}
Native Node.js
res.writeHead(200, {
'Content-Type': 'text/html; charset=utf-8'
})
res.end(content)
})
}).listen(httpPort, () => {
console.log('Server listening on: http://localhost:%s', httpPort)
})
rewrite {
regexp .*
to {path} /
}
Firebase hosting
{
"hosting": {
"public": "dist",
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
}
}
Advertência
Há uma ressalva para isso: seu servidor não irá mais reportar erros 404, pois todos os
caminhos não encontrados agora servem o seu arquivo. Para contornar o problema, você
l
tm
.h
x
e
d
in
deve implementar uma rota pega-tudo dentro do seu aplicativo Vue para mostrar uma
página 404: