vue父路由跳转到子路由时,路径变化但页面不改变,仍然为父页面的解决办法

问题描述

项目中遇到了这样一个问题:我想要从父页面跳转到子页面,对应的路由设置为:

export const asyncRouterMap = {
	/*  省略  */
	{
		path:  '/about',
		component: Layout,
		redirect: '',
		alwaysShow: true,
		name: 'about',
		meta: {
			title: '侧边栏分类一',
			breadNum: 1,
			icon: 'nested',
		},
		children: [
      		{
       			path: 'fatherPage',
        		component: () => import('@/views/nested/menu1/fatherPage/index'), 
       			name: 'fatherPage',
        		meta: {
          			title: '父页面',
          			breadNum: 2,
          			roles: ['admin', 'editor']
        		},
        		children: [
          			{
            			path: 'childPage1',
            			component: () => import('@/views/nested/menu1/fatherPage/children/childPageOne'),
            			name: 'childPage1',
            			meta: {
              				title: '子页面1',
              				breadNum: 2,
            			},
            			hidden: true
          			},
          			{
            			path: 'childPage2',
            			component: () => import ('@/views/nested/menu1/fatherPage/children/childPageTwo'),
            			name: 'childPage2',
            			meta: {
              				title: "子页面2",
              				breadNum: 2,
            			},
            			hidden: true
          			},
        		]
      		},
		]
	}
}

然后在父页面中通过router.push({ name: 'childPage1' })进行跳转,想要的结果是跳转后父路由区域替换为子路由,但是实际结果却是路径改变了,面包屑也更新了,控制台里也显示触发了子路由的mounted钩子里的方法,但是页面仍然是父页面没有替换为子页面。

原因分析

vue的路由显示是显示在<router-view />中的,并且要注意层级,如果存在这种层级: 父组件1 > 父组件2 > 子组件,那么,父组件2使用的<router-view />是父组件1的,而子组件使用的<router-view />是在父组件2之中的,所以如果父组件2中没有提供<router-view />,那么子组件可以加载却没法显示出来

解决方法

我们在父组件2中添加<router-view />,并通过在路由配置项的meta属性中设置属性来控制父组件页面是否显示

第一步: 更改路由配置
父组件2的meta中添加showFather: true,子组件的meta中添加showFather: false,更改后路由如下

export const asyncRouterMap = {
	/*  省略  */
	{
		path:  '/about',
		component: Layout,
		redirect: '',
		alwaysShow: true,
		name: 'about',
		meta: {
			title: '侧边栏分类一',
			breadNum: 1,
			icon: 'nested',
		},
		children: [
      		{
       			path: 'fatherPage',
        		component: () => import('@/views/nested/menu1/fatherPage/index'), 
       			name: 'fatherPage',
        		meta: {
          			title: '父页面',
          			breadNum: 2,
          			showFather: true,
          			roles: ['admin', 'editor']
        		},
        		children: [
          			{
            			path: 'childPage1',
            			component: () => import('@/views/nested/menu1/fatherPage/children/childPageOne'),
            			name: 'childPage1',
            			meta: {
              				title: '子页面1',
              				showFather: false,
              				breadNum: 2,
            			},
            			hidden: true
          			},
          			{
            			path: 'childPage2',
            			component: () => import ('@/views/nested/menu1/fatherPage/children/childPageTwo'),
            			name: 'childPage2',
            			meta: {
              				title: "子页面2",
              				showFather: false,
              				breadNum: 2,
            			},
            			hidden: true
          			},
        		]
      		},
		]
	}
}

修改父组件,使用showFather控制是否显示父组件页面,并添加<router-view />用来显示其子组件

<template>
	<div class="container">
		<div v-show="$route.meta.showFather">
			...
		</div>
		
		<router-view />
	</div>
</template>

问题解决,可以正常使用了

Vue3中,当你从路由跳转到一个嵌套路由并期望返回路由能够保持高亮,这通常涉及到导航守卫(Guards)和组件的`$router`引用。有,由于Vue Router的一些默认行为,首次进入子路由,它不会自动更新级的active状态。要解决这个问题,你可以尝试以下几个步骤: 1. **在组件中设置动态路由元信息**: 在组件的`<router-view>`上添加`meta`属性,例如: ```html <router-view :match="/child-route" :key="$route.path" :meta="{ name: 'childRoute', isChild: true }"></router-view> ``` 这样当访问子路由,可以明确标记。 2. **使用导航守卫**: - **beforeEnter**: 判断当前是否是子路由,并更新路由的active状态: ```javascript export default { beforeEnter(to, from, next) { if (to.matched.some(m => m.meta.isChild)) { this.$router.app.currentRoute.meta.name === 'parentRoute' && next(); } else { next(); } }, } ``` 或者在`beforeRouteUpdate`中检查变化。 3. **利用组件内的钩子**: 如果你想要更精确地控制,可以在每个需要管理高亮的组件里,设置一个`beforeRouteLeave`或`beforeDestroy`钩子,判断离开的是不是子路由,然后手动更新级的active状态。 4. **全局设置**: 如果所有子路由都需要这样的效果,也可以考虑在Vue实例的生命周期钩子如`mounted`或`activated`中处理此问题,对每次路由变化都做检查。 请注意,以上代码示例可能会有所不同,具体取决于你的项目结构和需求。如果仍然有问题,可能需要查看Vue Router的官方文档或者查阅相关社区资源,寻找更详细的解答。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六时二一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值