vue router中meta路由元信息&多套路由权限匹配

如果我们想要写一个面包屑的效果,而且切换不同的路由,能够展示不同的面包屑。比如下面的页面中所展示的,左侧是二级路由,右侧是路由页面展示。每次点开不同的路由,所展示的面包屑进行一个切换。

在这里插入图片描述
如何实现这种效果?或者反过来想,既然不能把它写死,那肯定得动态加载。又是与路由相关,那么该怎么将这个信息记录在路由里面呢?

可以用meta路由元信息,将这些琐碎的信息归纳。

路由meta 路由记录 / 路由元信息

可以给每个路由添加一个自定义的meta对象,在meta对象中可以设置一些状态,来进行一些操作,供页面组件或者路由钩子函数中使用。

在这里插入图片描述

页面中得到路由信息:$router.options.routes

相关单页面中使用:this.$route.meta.xxx

那么就可以根据路由信息,动态创建页面中的导航。

在这里插入图片描述
参考官方:Vue Router路由元信息

下面来看看我是怎么使用这个meta的。

首先要先创建一级二级路由,我把二级路由进行了封装,再引入一级路由里面。

>>一级路由index.js

import Vue from 'vue'
import VueRouter from 'vue-router'
import {errouter} from './indexerrouter.js'

Vue.use(VueRouter)
	const routes = [
	 {
	   path: '/index',
	   name: 'index',
	   component: () => import('../views/index.vue'),
	   children:errouter
	 },
	 ......
]
const router = new VueRouter({
	mode: 'history',
	base: process.env.BASE_URL,
	routes
})
export default router

>>二级路由indexerrouter.js

export let errouter=[
	......
    {
        path:'eruser',
        name:'eruser',
        meta:{
            Breadcrumb:["首页","人员管理"],
            title:"用户导航",
            path:'/index/eruser'
        },
        component:()=>import('@/views/indexer/eruser.vue')
    }
]

路由搞定之后,就需要写布局进行数据渲染了。我们先来看一下当前页面路由信息是怎么获取的吧。我是先把index.js页面的路由信息拿到,然后渲染二级路由。详细的就不看了,只看一下当前页面路由信息的获取:this.$router.options.routes[0].children,使用的时候可以直接metaRouter.meta.title

computed: {
    metaRouter() {
        return this.$router.options.routes[0].children;
    }
},

下面是在页面上打印的所有页面路由信息以及当前页面的子路由信息。
在这里插入图片描述
在这里插入图片描述
然后再去每个二级路由页面,将面包屑搞效果定,通过获取该路由的meta信息,动态渲染面包屑里的数据。
遍历该页面路由的meta信息,不再通过上面的方式拿到meta,而是直接$route.meta.Breadcrumb拿到meta里的面包屑数据。

>>element ui的面包屑

{{$route.meta}} <!--我就打印看下啥内容-->
<el-breadcrumb separator="/">
    <el-breadcrumb-item v-for="(item,index) in $route.meta.Breadcrumb" :key="index">{{item}}
    </el-breadcrumb-item>
</el-breadcrumb>

在这里插入图片描述
这样就算meta应用成功。

根据不同的用户权限分配不同的路由导航

另外有个效果,当我登录是,通过判断是管理员还是普通用户,引导他们进入不同的内容的index.vue组件页面。没错,只用一个页面,实现两种权限。
在这里插入图片描述 在这里插入图片描述
如何做到呢?有多种方式,下面看看其中一种方式:两套完整的路由,进行切换。

1、可以提前创建几套路由规则,然后在需要切换的页面中进行引用。

在这里插入图片描述
2、将路由规则从后台传入 。


下面来看看我是怎么切换整套路由的。

1、首先要另外新创建一套路由,将所有的路由规则拷贝过去,只在这个一级路由的子路由那进行内容更改。

在这里插入图片描述
在这里插入图片描述
2、然后在登录页面里面,通过判断后台返回的登录状态码,分配不同的权限。

import { newrouter } from "@/router/userrouter.js"
......
if (ok.data.data.loginid == 9527) {
	// console.log("登陆成功");
	// 验证权限
	if (ok.data.data.uid === 1) {
		// 用户权限 更换整套路由
		this.$router.options.routes = newrouter
		this.$router.addRoutes(newrouter)
		this.$router.push("/index")
	} else {
		//管理员权限
		// this.$router.push("/index/eruser")
		this.$router.push("/index")
	}
}else{
	// console.log("登陆失败");
	alert("用户名密码错误 请重新登录!!!")
}

这样就能实现普通用户进入普通页面,超管进入超管页面了。

总结

总结了几个需要注意的事项:

(1)路由出口<router-view></router-view>放在哪,下级路由里的内容就显示在什么地方。

在这里插入图片描述
(2)给属性绑定值时,一定记得加上"v-bind"或者":"。

在这里插入图片描述
(3)首次打开哪个二级路由,如果这个一级路由没有路由展示入口,可以直接在路由跳转时直接重定向到某个二级路由。
在这里插入图片描述

在这里插入图片描述
(4)在有package.json的情况下,直接运行npm install 就可以下载全部依赖包。

(5)addRouter可以动态改变路由。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用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(); } }); ``` 通过以上方法,我们可以确保动态添加的嵌套路由路由守卫执行时已经被添加到路由,从而避免了无效路由的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值