在使用Vue-router做项目时,会遇到如/serviceId/:id这样只改变id号的场景。由于router-view是复用的,单纯的改变id号并不会刷新router-view

watch 除了可以监听数据的变化,路由的变化也能被其监听到

:key vue 为你提供了一种方式来声明“这两个元素是完全独立的——不要复用它们”。只需添加一个具有唯一值的 key 属性即可

针对以上,经过本人项目实践以及网友贡献,有三种方法可解决:

方法一:通过 watch 监听路由(亲测可行)

1

2

3

4

5

6

7

8

9

10

11

12

13

mounted() {

 this.getData(this.$route.params.category);

},

methods: {

 getData: function(category){

 ...

 }

},

watch: { //通过watch来监听路由变化

 "$route": function(){

 this.getData(this.$route.params.category);

 }

}

方法二:用 :key 来阻止“复用”

具体使用方法:

1、tips:使用computed属性和Date()可以保证每一次的key都是不同的,这样就可以如愿刷新数据了

1

2

3

4

5

6

7

<router-view :key="key"></router-view>

  

computed: {

 key() {

 return this.$route.name !== undefined? this.$route.name +new Date(): this.$route +new Date()

 }

}

2、

设置key为$route.fullPath之后,由于两个路由的fullPath不同,组件会被强制不复用,所以将会回到正常流程,切换路由时mounted会被触发

<router-view :key="$route.fullPath"/>


 

 

方法三:通过 vue-router 的钩子函数 beforeRouteEnter beforeRouteUpdate beforeRouteLeave

由于 Vue 会复用相同组件, 即 /page/1 => /page/2 或者 /page?id=1 => /page?id=2 这类链接跳转时, 将不在执行created, mounted之类的钩子, 这时候你需要在路由组件中, 添加beforeRouteUpdate钩子来执行相关方法拉去数据

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

computed:mapGetters([

 ...

]),

beforeRouteEnter (to, from, next) {

 // 在渲染该组件的对应路由被 confirm 前调用

 // 不!能!获取组件实例 `this`

 // 因为当钩子执行前,组件实例还没被创建

},

beforeRouteUpdate (to, from, next) {

 // 在当前路由改变,但是该组件被复用时调用

 // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,

 // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。

 // 可以访问组件实例 `this`

},

beforeRouteLeave (to, from, next) {

 // 导航离开该组件的对应路由时调用

 // 可以访问组件实例 `this`

}

Logo

前往低代码交流专区

更多推荐