Vuejs: Rota değişikliğindeki olay


134

Ana sayfamda v-show=show, bağlantıya tıklayarak gösterilen açılır menülerim var @click = "show=!show"ve show=falserotayı ne zaman değiştireceğimi ayarlamak istiyorum . Lütfen bana bu şeyi nasıl gerçekleştireceğimi tavsiye edin.

Yanıtlar:


267

Bileşeninizde şu şekilde bir izleyici$route kurun:

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

Bu, rota değişikliklerini gözlemler ve değiştirildiğinde showyanlış olarak ayarlanır


11
Ve $route: function(to, from) {eski tarayıcıları desteklemek istiyorsanız ve babel kullanmıyorsanız kullanın.
Paul LeBeau

ancak bileşen ilk başta somutlaştırılıyorsa / başlatılıyorsa yönlendirme parametreleri veya sorgu parametreleri için hemen nasıl tepki verebilirim? Bunu oluşturulmuş () veya monte edilmiş () veya RouteUpdate yaşam döngüsü kancasından önce veya nerede yapabilirim?
user2774480

38

V2.2.0 kullanıyorsanız, $ rotalardaki değişiklikleri algılamak için bir seçenek daha vardır.

Aynı bileşendeki parametre değişikliklerine tepki vermek için $ route nesnesini izlemeniz yeterlidir:

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

Veya, 2.2'de tanıtılan beforeRouteUpdate korumasını kullanın:

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

Referans: https://router.vuejs.org/en/essentials/dynamic-matching.html


6
Bir not: beforeRouteUpdateSadece yöntemi bildirir ve hiçbir çocuk bileşeni görünümünde çalışır
Jean Valjean

30

Sadece daktiloda nasıl yapılacağını arayan biri varsa, işte çözüm burada

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

Ve evet, aşağıda @Coops'ta belirtildiği gibi, lütfen eklemeyi unutmayın

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

Düzenleme: Alcalyn, herhangi bir yol kullanmak yerine Rota tipini kullanmakta çok iyi bir noktaya geldi.

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

1
İçe import { Prop, Watch } from "vue-property-decorator";
aktarıma

1
Sonunda bunun farkına varmam saatlerimi aldı, orada herhangi bir belge var mı?
Ayyash

1
Benzer doc Bulabileceğim: router.vuejs.org/api/#the-route-object kullanmak yerine Ayrıca anytipini, arayüz kullanmak isteyebilirsiniz Routedanimport { Route } from 'vue-router';
Alcalyn

3

Yukarıdaki yanıtlar daha iyidir, ancak tamlık için, bir bileşenin içindeyken VueRouter içindeki geçmiş nesnesine şu şekilde erişebilirsiniz: this. $ Router.history. Bu, değişiklikleri şu şekilde dinleyebileceğimiz anlamına gelir:

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

Bunun esas olarak bununla birlikte kullanıldığında yararlı olduğunu düşünüyorum. $ Router.currentRoute.path debugger

kodunuzda talimat verin ve Chrome DevTools Konsolu ile oynamaya başlayın.


3

Derin seçeneği olan gözlemci benim için işe yaramadı.

Bunun yerine, bileşenin verileri her değiştiğinde çalıştırılan updated () yaşam döngüsü kancasını kullanıyorum . Mount () ile yaptığınız gibi kullanın .

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

Referans için dokümanları ziyaret edin .


0

Daktilo kullanıcısı için başka bir çözüm:

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 {}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.