Vuejs: Sự kiện thay đổi tuyến đường


134

Trong trang chính của tôi, tôi có các danh sách hiển thị v-show=showbằng cách nhấp vào liên kết @click = "show=!show"và tôi muốn đặt show=falsekhi tôi thay đổi tuyến đường. Tư vấn cho tôi làm thế nào để nhận ra điều này.

Câu trả lời:


266

Thiết lập trình theo dõi trên $routethành phần của bạn như thế này:

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

Điều này quan sát sự thay đổi tuyến đường và khi thay đổi, đặt showthành sai


11
Và sử dụng $route: function(to, from) {nếu bạn muốn hỗ trợ các trình duyệt cũ hơn và không sử dụng babel.
Paul LeBeau

nhưng làm thế nào tôi có thể phản ứng ngay lập tức với các thông số định tuyến hoặc tham số truy vấn nếu thành phần được khởi tạo / khởi tạo lúc đầu? Tôi sẽ làm điều đó trong hook vòng đời created () hoặc mount () hoặc beforeRouteUpdate hoặc ở đâu?
dùng2774480

37

Nếu bạn đang sử dụng v2.2.0 thì có thêm một tùy chọn có sẵn để phát hiện các thay đổi trong $ tuyến.

Để phản ứng với các thay đổi params trong cùng một thành phần, bạn chỉ cần xem đối tượng $ route:

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

Hoặc, sử dụng bộ bảo vệ beforeRouteUpdate được giới thiệu trong 2.2:

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

Tham khảo: https://router.vuejs.org/en/essentials/dynamic-matching.html


6
Một lưu ý: beforeRouteUpdatechỉ hoạt động trên chế độ xem khai báo phương thức chứ không phải trên bất kỳ thành phần con nào
JeanValjean

30

Chỉ cần kích hoạt nếu bất cứ ai đang tìm kiếm làm thế nào để làm điều đó trong bản in ở đây là giải pháp

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

Và có như được đề cập bởi @Coops bên dưới, xin đừng quên bao gồm

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

Chỉnh sửa: Alcalyn đã thực hiện một điểm rất tốt khi sử dụng loại Tuyến đường thay vì sử dụng bất kỳ

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

3
Công việc tốt đẹp dự đoán câu hỏi này. +1
Rod Hartzell

1
Đừng quên đưa vào phần nhập: import { Prop, Watch } from "vue-property-decorator";
Coops

1
Tôi đã mất hàng giờ để cuối cùng nhận ra rằng, có tài liệu nào ngoài đó không?
Ayyash

1
Tài liệu tương tự tôi có thể tìm thấy: router.vuejs.org/api/#the-route-object Ngoài ra, thay vì sử dụng anyloại, bạn có thể muốn sử dụng giao diện Routetừimport { Route } from 'vue-router';
Alcalyn

3

Các phản hồi trên là tốt hơn, nhưng chỉ để hoàn thiện, khi bạn ở trong một thành phần, bạn có thể truy cập đối tượng lịch sử bên trong VueRouter với: this. $ Router.history. Điều đó có nghĩa là chúng ta có thể lắng nghe những thay đổi với:

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

Tôi nghĩ rằng điều này chủ yếu hữu ích khi được sử dụng cùng với điều này. $ Router.cienRoute.path Bạn có thể kiểm tra những gì tôi đang nói về việc đặt một debugger

hướng dẫn trong mã của bạn và bắt đầu chơi với Bảng điều khiển DevTools của Chrome.


3

Watcher với tùy chọn sâu không làm việc cho tôi.

Thay vào đó, tôi sử dụng hook vòng đời cập nhật () được thực thi mỗi khi dữ liệu của thành phần thay đổi. Chỉ cần sử dụng nó như bạn làm với mount () .

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

Để bạn tham khảo, hãy truy cập tài liệu .


0

Một giải pháp khác cho người dùng bản thảo:

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 {}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.