Vuejs:路线变更事件


134

在我的主页上,我有一些下拉菜单,这些v-show=show链接通过单击链接显示@click = "show=!show",我想show=false在更改路线时进行设置。请告诉我如何实现这件事。

Answers:


266

在组件中的上设置观察者$route如下所示:

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

这观察路线的变化,并在更改时设置show为false


11
而使用$route: function(to, from) {,如果你想支持旧的浏览器,而不是使用巴贝尔。
Paul LeBeau

但是,如果首先要实例化/初始化组件,我如何对路由参数或查询参数立即做出反应?我要在created()或Mounted()还是beforeRouteUpdate生命周期挂钩中或在哪里进行?
user2774480

37

如果您使用的是v2.2.0,那么还有另一个选项可用于检测$ routes中的更改。

要对同一组件中的参数更改做出反应,您只需查看$ route对象即可:

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

或者,使用2.2中引入的beforeRouteUpdate保护:

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仅在声明该方法的视图上起作用,而不在任何子组件上
起作用

30

以防万一有人在打字稿中寻找操作方法,这是解决方案

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

是的,正如下面@Coops所述,请不要忘记添加

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

编辑: Alcalyn提出了使用Route类型而不是使用任何类型的一个很好的观点

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

3
很好地期待这个问题。+1
Rod Hartzell

1
不要忘了包括在导入中: import { Prop, Watch } from "vue-property-decorator";
Coops

1
我花了几个小时才终于意识到,那里有任何文档吗?
Ayyash

1
类似的文档可以找我:router.vuejs.org/api/#the-route-object此外,而不是使用any类型,你可能需要使用该接口Routeimport { Route } from 'vue-router';
Alcalyn

3

上面的响应是更好的方法,但是出于完整性考虑,当您在组件中时,可以使用this。$ router.history访问VueRouter内部的历史对象。这意味着我们可以通过以下方式收听更改:

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

我认为这与this。$ router.currentRoute.path一起使用时主要有用。 debugger

代码中的说明,然后开始使用Chrome DevTools Console。


3

具有深层选项的Watcher对我不起作用。

相反,我使用了updated()生命周期挂钩,该挂钩在每次组件数据更改时都会执行。就像使用mount()一样使用它。

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 {}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.