全局前置路由守卫(beforeEach)
- 功能:每一次切换任意路由组件之前都会被调用,相当于在进入另一个路由组件之前设置一个权限。
- 路由守卫的存在意义就是在不同的时间,不同的位置,去添加代码。
- 如:Java的filter(过滤器):在使用哪段代码前先进行过滤(效果类似)
使用方法
- 代码创建的位置:
- 在创建router之后(
const router = new VueRouter
) - 暴露router之前(
export default router
)
- beforeEach中的回调函数在什么时候被调用?
- 在初始化的时候执行一次,每一次切换任意路由组件之前都会调用一次
- 回调函数没有固定形式,普通函数或箭头函数都可以
- 回调函数有三个参数:
- to参数:to是一个路由对象,表示到哪儿去(跳转的下一个路由组件)。
- from参数:form是一个路由对象,表示从哪来(从哪个路由切换过来的)。
- next参数:next是一个函数,表示允许通过,可以继续向下走。
- 格式:
router.beforeEach((to, from, next) => {})
- 自定义属性(meta):在路由对象的添加meta(路由元)
- 格式:
meta : {属性名:''}
- title属性:可以修改页面标题
- 以下代码执行效果:通过修改网页标题实现beforeEach的效果
import VueRouter from 'vue-router'
import HuBei from '../pages/HuBei'
import City from '../pages/City'
const router = new VueRouter({
routes : [
{
name : 'bei',
path : '/hubei',
component : HuBei,
meta : {title : '湖北省'},
children : [
{
name : 'wh',
path : 'wuhan',
component : City,
props : true,
meta : {
isAuth : true,
title : '武汉市'
}
},
{
name : 'hs',
path : 'huangshi',
component : City,
props : true,
meta : {
isAuth : true,
title : '黄石市'
}
}
]
}
]
})
router.beforeEach((to, from, next) => {
let loginName = 'admin'
if(to.meta.isAuth){
if(loginName === 'root'){
document.title = to.meta.title
next()
}else{
alert('对不起,您没有权限')
}
}else{
document.title = to.meta.title
next()
}
})
export default router
<template>
<div>
<h2>省</h2>
<div>
<ul>
<li>
<router-link to="/hubei">湖北省</router-link>
</li>
</ul>
<router-view></router-view>
</div>
</div>
</template>
<script>
export default {
name : 'App'
}
</script>
<template>
<div>
<h2>市</h2>
<div>
<ul>
<li>
<router-link :to="{
name : 'wh',
params : {
a1 : wh[0],
a2 : wh[1],
a3 : wh[2],
}
}">
武汉市
</router-link>
</li>
<li>
<router-link :to="{
name : 'hs',
params : {
a1 : hs[0],
a2 : hs[1],
a3 : hs[2],
}
}">
黄石市
</router-link>
</li>
</ul>
<router-view></router-view>
</div>
</div>
</template>
<script>
export default {
name : 'HuBei',
data(){
return{
wh : ['江岸区', '江汉区', '桥口区'],
hs : ['下陆区', '铁山区', '西塞山区']
}
}
}
</script>
<template>
<div>
<h2>区</h2>
<ul>
<li>{{a1}}</li>
<li>{{a2}}</li>
<li>{{a3}}</li>
</ul>
</div>
</template>
<script>
export default {
name : 'City',
props : ['a1', 'a2', 'a3']
}
</script>