Vuejs: Acara pada perubahan rute

134

Di halaman utama saya, saya memiliki dropdown yang ditampilkan v-show=showdengan mengklik tautan @click = "show=!show"dan saya ingin mengatur show=falseketika saya mengubah rute. Beri tahu saya bagaimana cara mewujudkan hal ini.

Kipris
sumber

Jawaban:

266

Atur pengamat di $routedalam komponen Anda seperti ini:

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

Ini mengamati perubahan rute dan ketika diubah, disetel showke false

Vamsi Krishna
sumber
11
Dan gunakan $route: function(to, from) {jika Anda ingin mendukung browser lama, dan tidak menggunakan babel.
Paul LeBeau
tetapi bagaimana saya bisa langsung bereaksi dengan merutekan params atau kueri params jika komponen mulai dipakai / diinisialisasi pada awalnya? Apakah saya akan melakukannya di hook siklus hidup yang dibuat () atau dipasang () atau sebelumRouteUpdate atau di mana?
user2774480
37

Jika Anda menggunakan v2.2.0 maka ada satu opsi lagi yang tersedia untuk mendeteksi perubahan dalam $ route.

Untuk bereaksi terhadap perubahan params dalam komponen yang sama, Anda cukup menonton objek $ route:

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

Atau, gunakan pelindung beforeRouteUpdate yang diperkenalkan di 2.2:

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

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

Shubham Nigam
sumber
6
Catatan: beforeRouteUpdatehanya berfungsi pada tampilan yang menyatakan metode dan bukan pada komponen anak apa pun
JeanValjean
30

Hanya memetikan jika ada yang mencari cara melakukannya dalam naskah di sini adalah solusinya

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

Dan ya seperti yang disebutkan oleh @Coops di bawah ini, jangan lupa sertakan

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

Sunting: Alcalyn membuat titik yang sangat baik menggunakan tipe Route daripada menggunakan apa pun

import { Watch } from 'vue-property-decorator';    
import { Route } from 'vue-router';
ATHER
sumber
3
Kerja bagus mengantisipasi pertanyaan ini. +1
Rod Hartzell
1
Jangan lupa untuk memasukkan dalam impor: import { Prop, Watch } from "vue-property-decorator";
Coops
1
Saya butuh waktu berjam-jam untuk akhirnya menyadari bahwa, ada dokumentasi di luar sana?
Ayyash
1
Dokumen serupa yang dapat saya temukan: router.vuejs.org/api/#the-route-object Juga alih-alih menggunakan anyjenisnya, Anda mungkin ingin menggunakan antarmuka Routedariimport { Route } from 'vue-router';
Alcalyn
3

Respons di atas lebih baik, tetapi hanya untuk kelengkapan, ketika Anda berada di komponen Anda dapat mengakses objek sejarah di dalam VueRouter dengan: this. $ Router.history. Itu artinya kita dapat mendengarkan perubahan dengan:

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

Saya pikir ini sangat berguna ketika digunakan bersama dengan ini. $ Router.currentRoute.path Anda dapat memeriksa apa yang saya bicarakan tentang menempatkan debugger

instruksi dalam kode Anda dan mulai bermain dengan Chrome DevTools Console.

Melardev
sumber
3

Watcher dengan opsi mendalam tidak bekerja untuk saya.

Sebagai gantinya, saya menggunakan kait siklus hidup yang diperbarui () yang dijalankan setiap kali data komponen berubah. Cukup gunakan seperti yang Anda lakukan dengan mount () .

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

Untuk referensi Anda, kunjungi dokumentasi .

Niño Angelo Orlanes Lapura
sumber
0

Solusi lain untuk pengguna naskah:

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
sumber