Vue 爬坑之旅--嵌套路由默认选中第一个子路由,并且主路由和子路由都处于激活状态

在实际开发中,嵌套路由经常会用到,基本用法也很简单,今天要说的不是嵌套路由怎么用,而是在用的过程中发现的二点小细节的处理。

嵌套路由中默认选中第一个子路由

这里写图片描述

在一个这样的界面中,底部的五个 tab 显然应该是五个路由,现在在首页这个路由下面又有三个 tab,那么这三个 tab 就应该使用子路由来实现,路由代码如下:

        {
            path: '/home',
            name: 'Home',
            component: Home,
            children: [
                {
                    path: 'dynamic',
                    name: 'dynamic',
                    component: Dynamic
                },
                {
                    path: 'trade',
                    name: 'trade',
                    component: HomeTrade
                },
                {
                    path: 'info',
                    name: 'name',
                    component: Info
                }
            ]
        },

这样写的话,路由是有了,点击 tab 也能进行相应的切换,但是一般情况下我们需要在点击底部 首页 的 tab 的时候让子路由默认处于选中状态并加载出数据,要想一进入页面就让第一个子路由处于选中状态,可以给主路由加一个重定向的属性,把路径指向相应的子路由。

        {
            path: '/home',
            name: 'Home',
            //重定向
            redirect: '/home/dynamic',
            component: Home,
            children: [
                ......
            ]
        },

让主路由和子路由同时处于选中状态

router-link 作为 vue 中的路由跳转标签,它内置有一个选中的状态,当处于当前路由时,会给 router-link 加一个 router-active-class,即选中状态的 class,同时还提供有一个 exact 属性,当加了 exact 属性的时候表示精确匹配,也就是会精确匹配 Url,所以如果给主路由设置了 exact 属性的话,当处于子路由时,Url 就匹配不到主路由了,那么主路由也就不会处于选中状态。所以解决办法就是不要在主路由和子路由的 router-link 上设置 exact 属性,问题即可解决。

<template>
    <div id = "homeTabs" class = "flex homeTabs">
        <router-link to = "/home/dynamic" class = "tab" tag = "div" active-class = "active">
            <div>最新动态</div>
        </router-link>
        <router-link to = "/home/trade" class = "tab" tag = "div" active-class = "active">
            <div>最优交易</div>
        </router-link>
        <router-link to = "/home/info" class = "tab" tag = "div" active-class = "active">
            <div>资讯</div>
        </router-link>
    </div>
</template>
  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
当使用vue-router的路由守卫动态添加嵌套路由时,可能会出现无效的情况。这通常是由于路由守卫的执行时机造成的。 路由守卫分为全局守卫和路由独享守卫两种,而嵌套路由的添加通常是在全局前置守卫(router.beforeEach)或组件内的路由独享守卫(beforeRouteEnter)中进行的。 然而,由于路由守卫是立即执行的,而路由的添加是异步的,因此在守卫执行时,新的嵌套路由可能尚未添加到路由中,导致无效的情况。 为了解决这个问题,可以使用异步组件和动态导入来确保路由添加完成后再进行跳转。 1. 在全局前置守卫中,使用异步组件和动态导入来加载嵌套路由所在的组件。 2. 在异步组件加载完成后,在回调函数中执行路由的添加。 3. 确保在路由添加完成后再进行跳转操作。 示例代码如下: ```javascript router.beforeEach((to, from, next) => { if (to.path === '/dynamic-route') { // 异步组件和动态导入加载嵌套路由所在的组件 import('@/views/DynamicRoute.vue') .then(component => { const nestedRoutes = [ { path: 'nested-route', component: NestedRouteComponent } ]; // 添加嵌套路由 to.addRoutes(nestedRoutes); // 确保路由添加完成后再进行跳转 next({ ...to }); }) .catch(error => { // 处理错误 }); } else { next(); } }); ``` 通过以上方法,我们可以确保动态添加的嵌套路由路由守卫执行时已经被添加到路由中,从而避免了无效路由的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值