Aqui está o exemplo em docs:
// with query, resulting in /register?plan=private
router.push({ path: 'register', query: { plan: 'private' }})
Ref: https://router.vuejs.org/en/essentials/navigation.html
Conforme mencionado nesses documentos, router.replace
funciona comorouter.push
Então, você parece ter acertado em seu código de amostra em questão. Mas acho que você pode precisar incluir o parâmetro name
ou path
também, para que o roteador tenha alguma rota para navegar. Sem um name
ou path
, não parece muito significativo.
Este é meu entendimento atual agora:
query
é opcional para o roteador - algumas informações adicionais para o componente construir a visão
name
ou path
é obrigatório - ele decide qual componente mostrar em seu <router-view>
.
Isso pode ser o que está faltando em seu código de amostra.
EDIT: detalhes adicionais após comentários
Você já tentou usar rotas nomeadas neste caso? Você tem rotas dinâmicas e é mais fácil fornecer parâmetros e consultas separadamente:
routes: [
{ name: 'user-view', path: '/user/:id', component: UserView },
// other routes
]
e então em seus métodos:
this.$router.replace({ name: "user-view", params: {id:"123"}, query: {q1: "q1"} })
Tecnicamente, não há diferença entre o acima e this.$router.replace({path: "/user/123", query:{q1: "q1"}})
, mas é mais fácil fornecer parâmetros dinâmicos em rotas nomeadas do que compor a string de rota. Mas em ambos os casos, os parâmetros de consulta devem ser levados em consideração. Em qualquer dos casos, não consegui encontrar nada de errado com a forma como os parâmetros de consulta são tratados.
Depois de estar dentro da rota, você pode buscar seus parâmetros dinâmicos como this.$route.params.id
e seus parâmetros de consulta como this.$route.query.q1
.
Sem recarregar a página ou atualizar o dom,
history.pushState
pode fazer o trabalho.Adicione este método em seu componente ou em outro lugar para fazer isso:
Portanto, em qualquer lugar em seu componente, chame
addParamsToLocation({foo: 'bar'})
para enviar o local atual com parâmetros de consulta na pilha window.history.Para adicionar parâmetros de consulta à localização atual sem empurrar uma nova entrada de histórico , use
history.replaceState
.Testado com Vue 2.6.10 e Nuxt 2.8.1.
Cuidado com este método!
O Vue Router não sabe que o url mudou, então ele não reflete o url após pushState.
fonte
Na verdade, você pode simplesmente enviar uma consulta assim:
this.$router.push({query: {plan: 'private'}})
Baseado em: https://github.com/vuejs/vue-router/issues/1631
fonte
fonte
Error: Avoided redundant navigation to current location
this.$router.push({ query: Object.assign({...this.$route.query}, { new: 'param' }) })
this.$router.push({ query: {...this.$route.query,new: 'param'},) })
Se você estiver tentando manter alguns parâmetros, enquanto altera outros, certifique-se de copiar o estado da consulta do roteador vue e não reutilizá-la.
Isso funciona, pois você está fazendo uma cópia sem referência:
enquanto abaixo irá fazer com que o Vue Router pense que você está reutilizando a mesma consulta e levará ao
NavigationDuplicated
erro:Claro, você pode decompor o objeto de consulta, como a seguir, mas você precisa estar ciente de todos os parâmetros de consulta de sua página, caso contrário, você corre o risco de perdê-los na navegação resultante.
Observe que, embora o exemplo acima seja para
push()
, ele também funciona comreplace()
.Testado com vue-router 3.1.6.
fonte
Para adicionar vários parâmetros de consulta, isso é o que funcionou para mim (aqui https://forum.vuejs.org/t/vue-router-programmatically-append-to-querystring/3655/5 ).
fonte
Para definir / remover vários parâmetros de consulta de uma vez, acabei com os métodos abaixo como parte dos meus mixins globais (
this
aponta para o componente vue):fonte
Eu normalmente uso o objeto de histórico para isso. Também não recarrega a página.
Exemplo:
fonte
Esta é minha solução simples para atualizar os parâmetros de consulta na URL sem atualizar a página. Certifique-se de que funciona para o seu caso de uso.
fonte