Guia
Essenciais
- Instalação
- Introdução
- A Instância Vue
- Sintaxe de Templates
- Dados Computados e Observadores
- Interligações de Classe e Estilo
- Renderização Condicional
- Renderização de Listas
- Manipulação de Eventos
- Interligações em Formulários
- Básico sobre Componentes
Componentes em Detalhes
- Registro de Componentes
- Propriedades
- Eventos Personalizados
- Slots
- Dinâmicos & Assíncronos
- Lidando com Casos Extremos
Transições & Animações
- Transições de Visibilidade e Listas
- Transições de Estado
Reuso & Composição
- Mixins
- Diretivas Personalizadas
- Funções de Renderização & JSX
- Plugins
- Filtros
Ferramentas
- Componentes Single-File
- Testes Unitários
- Testing
- Suporte ao TypeScript
- Publicando em Produção
Escalonando
- Roteamento
- Gerenciamento de Estado
- Renderizando no Lado do Servidor
- Segurança
Internamente
- Reatividade em Profundidade
Migração
- Migração do Vue 1.x
- Migração do Vue Router 0.7.x
- Migração do Vuex 0.6.x para 1.0
Diversos
- Comparação com Outros Frameworks
- Junte-se à Comunidade Vue.js!
- Conheça a Equipe
Você está navegando a documentação da v2.x e anterior. Para a v3.x, clique aqui.
Migração do Vue Router 0.7.x
Somente Vue Router 2 é compatível com Vue 2, então se você estiver atualizando o Vue, terá de atualizar também o Vue Router. Esta é a razão pela qual incluímos detalhes de migração aqui na documentação principal. Para um guia completo em como usar o novo Vue Router, veja a documentação do Vue Router.
Inicialização do Roteador
router.start
obsoleto
Não há mais uma API especial para inicializar um aplicativo com Vue Router. Em vez de:
router.start({
template: '<router-view></router-view>'
}, '#app')
Passe uma propriedade router
para a instância Vue:
new Vue({
el: '#app',
router: router,
template: '<router-view></router-view>'
})
Ou, se estiver usando a compilação runtime-only do Vue:
new Vue({
el: '#app',
router: router,
render: h => h('router-view')
})
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de router.start
.
Definição de Rotas
router.map
alterado
Rotas são agora definidas como um Array em uma opção routes
na inicialização do roteador. Então estas rotas, por exemplo:
router.map({
'/foo': {
component: Foo
},
'/bar': {
component: Bar
}
})
Serão definidas desta forma:
var router = new VueRouter({
routes: [
{ path: '/foo', component: Foo },
{ path: '/bar', component: Bar }
]
})
A sintaxe com Array oferece mais precisão na definição de rotas, uma vez que ao iterar sobre objetos não existe garantia da mesma ordem de propriedades entre navegadores.
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de router.map
.
router.on
removido
Se você precisar programaticamente gerar rotas quando iniciar a aplicação, é possível fazer isso acrescentando dinamicamente definições a um Array de rotas. Por exemplo:
// Rotas base normais
var routes = [
// ...
]
// Rotas geradas dinamicamente
marketingPages.forEach(function (page) {
routes.push({
path: '/marketing/' + page.slug
component: {
extends: MarketingComponent
data: function () {
return { page: page }
}
}
})
})
var router = new Router({
routes: routes
})
Se houver necessidade de adicionar rotas após a inicialização, é possível substituir a função de identificação de rotas com uma nova que inclua a rota que você deseja adicionar:
router.match = createMatcher(
[{
path: '/my/new/path',
component: MyComponent
}].concat(router.options.routes)
)
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de router.on
.
router.beforeEach
alterado
router.beforeEach
agora trabalha assincronamente e recebe uma função next
como seu terceiro argumento.
router.beforeEach(function (transition) {
if (transition.to.path === '/forbidden') {
transition.abort()
} else {
transition.next()
}
})
router.beforeEach(function (to, from, next) {
if (to.path === '/forbidden') {
next(false)
} else {
next()
}
})
subRoutes
renomeado
Renomeado para children
para consistência com Vue e com outras bibliotecas de rotas.
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de subRoutes
.
router.redirect
alterado
Isto agora é uma opção da definição de uma rota. Então, por exemplo, você atualizará:
router.redirect({
'/tos': '/terms-of-service'
})
Para uma definição conforme exibido abaixo, na configuração de suas routes
:
{
path: '/tos',
redirect: '/terms-of-service'
}
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de router.redirect
.
router.alias
alterado
Isto agora é uma opção da definição da rota de destino. Então, por exemplo, você atualizará:
router.alias({
'/manage': '/admin'
})
Para uma definição conforme exibido abaixo, na configuração de suas routes
:
{
path: '/admin',
component: AdminPanel,
alias: '/manage'
}
Se você precisar de múltiplos apelidos, é possível usar uma sintaxe de Array:
alias: ['/manage', '/administer', '/administrate']
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de router.alias
.
Propriedades Arbitrárias em Rotas substituído
Propriedades definidas arbitrariamente em rotas agora precisam estar inseridas em uma nova propriedade meta
, para evitar conflitos com atualizações futuras. Então, por exemplo:
'/admin': {
component: AdminPanel,
requiresAuth: true
}
Deverá ser atualizado para:
{
path: '/admin',
component: AdminPanel,
meta: {
requiresAuth: true
}
}
Assim, quando estiver acessando posteriormente esta propriedade da rota, será necessário também seguir através de meta
. Por exemplo:
if (route.meta.requiresAuth) {
// ...
}
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos propriedades arbitrárias em rotas não inseridas em meta
.
Sintaxe para Arrays em Queries removed
Ao passar Arrays como parâmetros de queries, a sintaxe da query string não é mais /foo?users[]=Tom&users[]=Jerry
. Em vez disto, a nova sintaxe é /foo?users=Tom&users=Jerry
. Internamente, $route.query.users
ainda será um Array, mas se houver somente um parâmetro na query: /foo?users=Tom
, ao acessar diretamente esta rota, não haverá uma maneira do roteador saber se estamos esperando que users
seja um Array. Por este motivo, considere adicionar um dado computado, substituindo qualquer acesso a $route.query.users
por ele:
export default {
// ...
computed: {
// assim, `users` serão serão um Array
users () {
const users = this.$route.query.users
return Array.isArray(users) ? users : [users]
}
}
}
Identificação das Rotas
Agora a identificação das rotas utiliza path-to-regexp em seu interior, tornando-a muito mais flexível do que anteriormente.
Um ou Mais Parâmetros Nomeados alterado
A sintaxe mudou levemente, assim /category/*tags
, por exemplo, deveria ser atualizado para /category/:tags+
.
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de sintaxe de rotas com regras obsoletas.
Links
v-link
substituído
A diretiva v-link
foi substituída por um novo componente <router-link>
, visto que este tipo de tarefa é exclusivamente responsabilidade de componentes no Vue 2. Isso significa que em qualquer lugar que você tiver um link como este:
<a v-link="'/about'">Sobre</a>
Você precisará atualizá-lo desta forma:
<router-link to="/about">Sobre</router-link>
Observe que target="_blank"
não é suportado no <router-link>
, então se precisar forçar um link a abrir em uma nova aba, terá de utilizar <a>
em seu lugar.
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos com a diretiva v-link
.
v-link-active
substituído
A diretiva v-link-active
também foi removida em favor de se especificar uma tag separada no componente <router-link>
. Então, por exemplo, você irá atualizar isto:
<li v-link-active>
<a v-link="'/about'">Sobre</a>
</li>
Para isto:
<router-link tag="li" to="/about">
<a>Sobre</a>
</router-link>
O elemento <a>
será efetivamente o link (e obterá corretamente o href
), mas a classe de estado ativo será aplicada ao elemento externo <li>
.
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos com a diretiva v-link-active
.
Navegação Programática
router.go
changed
Para consistência com a HTML5 History API, router.go
agora é usado somente para navegação de voltar/avançar, enquanto router.push
é usado para navegação para uma página específica.
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de router.go
sendo usado onde router.push
deveria ser usado em seu lugar.
Opções do Roteador: Modos
hashbang: false
removido
Hashbangs não são mais exigidos pelo Google para indexar uma URL, assim não são mais uma opção padrão (ou mesmo uma opção existente) para a estratégia de hash.
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de hashbang: false
.
history: true
substituído
Todos os modos de roteamento foram condensados em uma simples opção mode
. Atualize:
var router = new VueRouter({
history: true
})
Para:
var router = new VueRouter({
mode: 'history'
})
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de history: true
.
abstract: true
substituído
Todos os modos de roteamento foram condensados em uma simples opção mode
. Atualize:
var router = new VueRouter({
abstract: true
})
Para:
var router = new VueRouter({
mode: 'abstract'
})
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de abstract: true
.
Opções do Roteador: Diversos
saveScrollPosition
substituído
Foi substituído com uma opção scrollBehavior
que aceita uma função, de forma que o comportamento de rolagem possa ser completamente personalizado - inclusive para cada rota. Abre-se muitas novas possibilidades, mas para simplesmente replicar o antigo comportamento de:
saveScrollPosition: true
Você pode substituir com uma função como esta:
scrollBehavior: function (to, from, savedPosition) {
return savedPosition || { x: 0, y: 0 }
}
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de saveScrollPosition: true
.
root
renomeado
Renomeado para base
para consistência com o elemento HTML <base>
.
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de root
.
transitionOnLoad
removido
Esta opção não é mais necessária agora que o sistema de transições do Vue tem explícito controle de appear
de transições.
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de transitionOnLoad: true
.
suppressTransitionError
removido
Removido para simplificação de gatilhos. Se você realmente precisar suprimir erros de transição, você pode usar try
…catch
para isto.
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de suppressTransitionError: true
.
Gatilhos do Roteador
activate
substituído
Em seu lugar, use beforeRouteEnter
no componente.
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de active
.
canActivate
substituído
Em seu lugar, use beforeEnter
no roteador.
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de canActivate
.
deactivate
removido
Em seu lugar, use os gatilhos em componentes beforeDestroy
ou destroyed
.
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de deactivate
.
canDeactivate
substituído
Em seu lugar, use beforeRouteLeave
no componente.
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de canDeactivate
.
canReuse: false
removido
Não existem mais casos de uso para isso no novo Vue Router.
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de canReuse: false
.
data
substituído
A propriedade $route
agora é reativa, desta forma utilize um observador para reagir a mudanças de rota, como neste exemplo:
watch: {
'$route': 'fetchData'
},
methods: {
fetchData: function () {
// ...
}
}
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de data
.
$loadingRouteData
removido
Defina sua própria propriedade (por exemplo, isLoading
) e atualize a situação através de um observador na rota. Por exemplo, se estiver obtendo dados remotos com o axios:
data () {
return {
posts: [],
isLoading: false,
fetchError: null
}
},
watch: {
'$route': () => {
this.isLoading = true
this.fetchData().then(() => {
this.isLoading = false
})
}
},
methods: {
fetchData: () => {
return axios.get('/api/posts')
.then(response => {
this.posts = response.data.posts
})
.catch(error => {
this.fetchError = error
})
}
}
Caminho para Atualização
Execute a ferramenta de migração para encontrar casos de $loadingRouteData
.