vue-router不同的路由共用一个组件component的问题

在使用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`

}

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
vue-router 中的嵌套路由允许我们在一个组件中嵌套多个组件。通过使用嵌套路由,我们可以将应用程序的不同部分组织成层次结构,更好地管理和维护我们的代码。 嵌套路由的主要概念是在父组件中定义一个 `<router-view>` 组件,而子组件则通过在父组件中的路由配置中设置 `component` 属性来渲染到 `<router-view>` 中。这样,每个子路由都可以有自己的组件,并且它们会在父组件的 `<router-view>` 中根据路由的路径匹配进行渲染。 嵌套路由在编写大型应用程序时非常有用,因为它们允许我们将整个应用程序的不同功能和页面分解为更小的、可重用的组件。这样,我们可以更加灵活地构建和管理我们的应用程序,从而提高我们的开发效率。 对于嵌套路由的使用,我们需要在路由配置文件中定义父组件路由和子组件路由。在父组件路由配置中,我们需要设置 `children` 属性,然后在该属性下定义子组件路由。这样,当我们访问父组件路由时,子组件路由也会被加载和渲染。 总结起来,Vue Router 的嵌套路由允许我们将应用程序的不同部分组织成层次结构,以更好地管理和维护我们的代码。通过在父组件中定义 `<router-view>`,并在路由配置中设置 `component` 属性,我们可以将不同的子组件根据路由的路径匹配进行渲染。嵌套路由的使用使得应用程序更具有可重用性和灵活性,从而提高了开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值