VueRoute(二)嵌套路由和动态组件实现后台管理页面的差异

需求

设计下面后台管理界面的路由。
在这里插入图片描述
我想出有两种方式实现,分别是

  • 使用嵌套路由实现
  • 使用路由+动态组件实现

下面我将对比下这两种实现的不同,以便借助这个例子深入学习下vueRouter

使用嵌套路由实现

页面的路由设计如下
在这里插入图片描述
如果一个tab使用一个router-view,那么还要使用 命名视图,会使得情况变得更加复杂。

App.vue
	|_ router-view
	          ↓
	   BackstageManager.vue
	   				|_ router-view
	   							↓
	   					     业务界面
const routes = [
    {
        path: '/backstageManager',
        name: 'BackstageManagerPage',
        component: () => import(/* webpackChunkName: "about" */ '../views/backstageManager/BackstageManagerPage.vue'),
        children: [
        	{
        		// 用户管理
		        path: 'userManeger',
		        name: 'UserManeger',
		        component: () => import(/* webpackChunkName: "about" */ '../views/backstageManager/UserManeger.vue')
		    },
		    {
		    	// 商品管理
		        path: 'goodManger',
		        name: 'GoodManger',
		        component: () => import(/* webpackChunkName: "about" */ '../views/backstageManager/GoodManger.vue')
		    },
        ]
    }
]

要注意的点

嵌套路由官方文档强调了一句话:
注意,以 / 开头的嵌套路径将被视为根路径。这允许你利用组件嵌套,而不必使用嵌套的 URL
怎么理解这句话呢?

  • 以 / 开头的情况
{
        path: '/backstageManager',
        name: 'BackstageManagerPage',
        component: () => import(/* webpackChunkName: "about" */ '../views/backstageManager/BackstageManagerPage.vue'),
        children: [{
        	// path以/开头,假设项目根目录为 http://project/
        	// 则访问 http://project/userManeger可以访问到UserManeger,并且UserManeger会在BackstageManagerPage组件里
       		// 用户管理
	        path: '/userManeger',
	        name: 'UserManeger',
	        component: () => import(/* webpackChunkName: "about" */ '../views/backstageManager/UserManeger.vue')
	    }]
}
  • 不以 / 开头的情况
{
        path: '/backstageManager',
        name: 'BackstageManagerPage',
        component: () => import(/* webpackChunkName: "about" */ '../views/backstageManager/BackstageManagerPage.vue'),
        children: [{
        	// path不以/开头,假设项目根目录为 http://project/
        	// 则访问 http://project/backstageManager/userManeger可以访问到UserManeger
       		// 用户管理
	        path: 'userManeger',
	        name: 'UserManeger',
	        component: () => import(/* webpackChunkName: "about" */ '../views/backstageManager/UserManeger.vue')
	    }]
}

总结,嵌套路由如果以 / 开头,会让逻辑变得很混乱,最好不要使用!

使用路由+动态组件实现

页面的路由设计如下
在这里插入图片描述

App.vue
	|_ router-view
	          ↓
	   BackstageManager.vue
	   				|_ tab1里的component -> 业务界面1
	   				|_ tab2里的component -> 业务界面2
const routes = [
    {
        path: '/backstageManager',
        name: 'BackstageManagerPage',
        component: () => import(/* webpackChunkName: "about" */ '../views/backstageManager/BackstageManagerPage.vue'),
    },
    {
        path: '/backstageManager/dragGroupOneWay',
        name: 'DragGroupOneWay',
        component: () => import(/* webpackChunkName: "about" */ '../views/backstageManager/drag/DragGroupOneWay.vue')
    },
    {
        path: '/backstageManager/dragGroupTwoWay',
        name: 'DragGroupTwoWay',
        component: () => import(/* webpackChunkName: "about" */ '../views/backstageManager/drag/DragGroupTwoWay.vue')
    },
]

两种实现的对比

router-view的缓存维护

  • 使用嵌套路由实现
    需要维护router-view的缓存。因为在后台管理界面,多个tab对应着一个router-view,当切换tab而不是关闭tab的时候,切换回旧的tab的时候需要展示会原来的状态。并且删除tab后,重新打开tab后需要一个全新的状态。

  • 使用路由+动态组件实现
    不需要维护router-view的缓存。因为一个tab对应着一个component,切换tab不会改变别的tab的component

是否会改变后台管理界面的url

  • 使用嵌套路由实现
    会改变。url会随着点击不同的菜单,会显得很奇怪
  • 使用路由+动态组件实现
    不会改变

能否新开一个页面去独立访问后台管理的子页面

  • 使用嵌套路由实现
    不能。访问子页面的时候也会渲染父路由的组件!
  • 使用路由+动态组件实现
    可以。

后台管理的嵌套页面,使用动态组件实现,而不是使用嵌套路由的方式实现。就可以实现,直接访问子页面路由可以单纯访问子页面,然后后台页面访问子页面的时候也不会更改路由

补充

动态组件

动态组件官方文档

// 使用动态组件 + 动态导入

<el-tabs v-model="activeTabId" type="border-card" id="centerTab" closable @tab-remove="handleRemoveTab">
   <el-tab-pane v-for="(menu, index) in tabList" :key="menu.id + index" :label="menu.name" :name="menu.id">
     <component :is="menu.component" :key="menu.id"></component>
   </el-tab-pane>
 </el-tabs>

//这种是静态导入
import BackstageManagerMain from '@/views/backstageManager/BackstageManagerMain.vue'
data(){
	return {
		 tabList: [
		   {
		     id: '0',
		     name: '主页',
		     routerPath: '/',
		     // import() 是动态导入,import方法
		     component: () => import(`@/views/backstageManager/BackstageManagerMain.vue`)
		     
		     // 可以使用静态导入的组件
		     // component: BackstageManagerMain 
		   }
		 ]
	}
}

如果没有登录,直接访问后台页面如何拦截

这时候就可以用到导航守卫了!
导航守卫,可以添加token判断,校验用户是否有登陆。如果有登陆则跳转到首页,没登陆就跳转到登陆页!

$router 和 $route的区别

https://www.cnblogs.com/czy960731/p/9288830.html

命名视图 与 嵌套路由

命名视图:在一个页面中展示两个平行的组件
嵌套路由:一个组件嵌套着另外一个组件

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue RouterVue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,可以非常方便的实现页面应用程序的路由功能。 Vue Router 提供了以下两种方式实现页面路由跳转: 1. 声明式导航:通过 `<router-link>` 组件实现页面跳转,该组件会被渲染成一个 `<a>` 标签,点击该标签后会触发路由跳转。 2. 编程式导航:通过 `$router` 对象提供的方法实现页面跳转,例如 `$router.push()`、`$router.replace()`、`$router.go()` 等方法。 下面我们来看一个简的示例,在 Vue Router 中如何实现页面路由跳转: ```html <!-- 在模板中使用 router-link 组件 --> <router-link to="/home">Home</router-link> <!-- 在组件中使用 $router 对象实现编程式导航 --> <button @click="$router.push('/about')">About</button> ``` 在上面的示例中,我们分别演示了如何使用 `<router-link>` 组件和 `$router` 对象实现页面路由跳转,其中 `to` 属性表示跳转的目标路由地址。 此外,Vue Router 还支持路由嵌套的功能,可以通过嵌套路由的方式实现页面嵌套展示。下面我们来看一个嵌套路由的示例: ```javascript const router = new VueRouter({ routes: [ { path: '/home', component: Home, children: [ { path: 'news', component: News }, { path: 'videos', component: Videos } ] } ] }) ``` 在上面的示例中,我们定义了一个名为 `Home` 的路由组件,并在该组件嵌套了两个子路由 `News` 和 `Videos`,这样就可以实现在 `Home` 组件中展示新闻和视频内容的功能。在实际开发中,我们可以根据实际需求来定义不同的路由组件和子路由实现灵活的页面嵌套效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我叫985

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

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

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

打赏作者

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

抵扣说明:

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

余额充值