Vuejs: Подія щодо зміни маршруту


134

На головній сторінці у мене є спадні місця, які відображаються v-show=show, натиснувши на посилання, @click = "show=!show"і я хочу встановити, show=falseколи я міняю маршрут. Порадьте, будь ласка, як усвідомити цю річ.

Відповіді:


266

Налаштуйте спостерігача на $routeкомпонент у такому:

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

Це спостерігається за зміною маршруту і при зміні встановлює showзначення false


11
І використовуйте, $route: function(to, from) {якщо ви хочете підтримувати старіші веб-переглядачі та не використовуєте babel.
Пол ЛеБо

але як я можу негайно реагувати на параметри маршрутів або запити, якщо компонент спочатку інстанціюється / ініціалізується? Я б це зробив у створеному () або змонтованому () або перед гаком життєвого циклу beforeRouteUpdate або де?
користувач2774480

37

Якщо ви використовуєте v2.2.0, доступний ще один варіант виявлення змін у $-маршрутах.

Щоб реагувати на зміни парам в одному і тому ж компоненті, ви можете просто переглянути об’єкт $ route:

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

Або скористайтеся захистом beforeRouteUpdate, введеним у 2.2:

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

Довідка: https://router.vuejs.org/en/essentials/dynamic-matching.html


6
Зауваження: beforeRouteUpdateпрацює лише над тим, що декларує метод, а не будь-який дочірній компонент
JeanValjean

30

Просто випадок, якщо хтось шукає, як це зробити в машинописі, ось рішення

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

І так, як зазначено нижче @Coops, будь ласка, не забудьте включити

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

Редагувати: Алькалін дуже вдало використав тип маршруту замість будь-якого

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

1
Не забудьте включити до імпорту: import { Prop, Watch } from "vue-property-decorator";
Чашки

1
Мені потрібні години, щоб нарешті зрозуміти це, якась документація там?
Айяш

1
Подібний документ, який я можу знайти: router.vuejs.org/api/#the-route-object Також, замість anyтипу, ви можете використовувати інтерфейсRoute відimport { Route } from 'vue-router';
Alcalyn

3

Наведені вище відповіді є кращими, але просто для повноти, коли ви знаходитесь в компоненті, ви можете отримати доступ до об’єкту історії всередині VueRouter за допомогою: this. $ Router.history. Це означає, що ми можемо слухати зміни за допомогою:

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

Я думаю, що це в основному корисно при використанні разом із цим. $ Router.currentRoute.path Ви можете перевірити, про що я говорю про розміщення debugger

інструкція у вашому коді та почніть грати з консолі Chrome DevTools.


3

Охотник з глибоким варіантом не працював для мене.

Натомість я використовую оновлений () гачок життєвого циклу, який виконується щоразу, коли дані компонента змінюються. Просто використовуйте його, як і з монтованим () .

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

Для ознайомлення відвідайте документацію .


0

Ще одне рішення для користувача машинопису:

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 {}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.