Vuejs: événement sur le changement d'itinéraire

134

Dans ma page principale, j'ai des listes déroulantes qui s'affichent v-show=showen cliquant sur le lien @click = "show=!show"et je veux définir show=falsequand je change d'itinéraire. Conseillez-moi s'il vous plaît comment réaliser cette chose.

kipris
la source

Réponses:

266

Configurez un observateur sur le $routedans votre composant comme ceci:

watch:{
    $route (to, from){
        this.show = false;
    }
} 

Cela observe les changements de route et une fois modifié, définit showsur false

Vamsi Krishna
la source
11
Et à utiliser $route: function(to, from) {si vous souhaitez prendre en charge les navigateurs plus anciens et n'utilisez pas babel.
Paul LeBeau
mais comment puis-je réagir immédiatement aux paramètres de routage ou aux paramètres de requête si le composant est instancié / initialisé au début? Est-ce que je le ferais dans le hook de cycle de vie created () ou monté () ou beforeRouteUpdate ou où?
user2774480
37

Si vous utilisez la v2.2.0, il existe une autre option disponible pour détecter les changements dans $ routes.

Pour réagir aux changements de paramètres dans le même composant, vous pouvez simplement regarder l'objet $ route:

const User = {
  template: '...',
  watch: {
    '$route' (to, from) {
      // react to route changes...
    }
  }
}

Ou, utilisez la garde beforeRouteUpdate introduite dans la version 2.2:

const User = {
  template: '...',
  beforeRouteUpdate (to, from, next) {
    // react to route changes...
    // don't forget to call next()
  }
}

Référence: https://router.vuejs.org/en/essentials/dynamic-matching.html

Shubham Nigam
la source
6
A noter: beforeRouteUpdatene fonctionne que sur la vue qui déclare la méthode et non sur aucun composant enfant
JeanValjean
30

Juste au cas où si quelqu'un cherche comment le faire en tapuscrit, voici la solution

   @Watch('$route', { immediate: true, deep: true })
   onUrlChange(newVal: Route) {
      // Some action
    }

Et oui comme mentionné par @Coops ci-dessous, n'oubliez pas d'inclure

import { Watch } from 'vue-property-decorator';

Edit: Alcalyn a fait un très bon point d'utiliser le type Route au lieu d'utiliser n'importe quel

import { Watch } from 'vue-property-decorator';    
import { Route } from 'vue-router';
ATHER
la source
1
N'oubliez pas d'inclure dans l'importation: import { Prop, Watch } from "vue-property-decorator";
Coops
1
J'ai mis des heures à m'en rendre compte, y a-t-il de la documentation?
Ayyash
1
Doc similaire que je peux trouver: router.vuejs.org/api/#the-route-object Aussi au lieu d'utiliser le anytype, vous pouvez utiliser l'interface Routedeimport { Route } from 'vue-router';
Alcalyn
3

Les réponses ci-dessus sont les meilleures, mais juste pour être complet, lorsque vous êtes dans un composant, vous pouvez accéder à l'objet historique à l'intérieur du VueRouter avec: this. $ Router.history. Cela signifie que nous pouvons écouter les changements avec:

this.$router.listen((newLocation) =>{console.log(newLocation);})

Je pense que cela est principalement utile lorsqu'il est utilisé avec ceci. $ Router.currentRoute.path Vous pouvez vérifier de quoi je parle de placer un debugger

dans votre code et commencez à jouer avec la console Chrome DevTools.

Melardev
la source
3

Watcher avec l'option profonde n'a pas fonctionné pour moi.

Au lieu de cela, j'utilise le hook de cycle de vie updated () qui est exécuté à chaque fois que les données du composant changent. Utilisez-le simplement comme vous le faites avec monté () .

mounted() {
   /* to be executed when mounted */
},
updated() {
   console.log(this.$route)
}

Pour votre référence, visitez la documentation .

Niño Angelo Orlanes Lapura
la source
0

Une autre solution pour l'utilisateur dactylographié:

import Vue from "vue";
import Component from "vue-class-component";

@Component({
  beforeRouteLeave(to, from, next) {
    // incase if you want to access `this`
    // const self = this as any;
    next();
  }
})

export default class ComponentName extends Vue {}
Delowar Hosain
la source