vue-cli---路由守卫
组件内的路由守卫---局部`beforRouterEnter() {}`----进入路由前执行的方法案例---拦截,不登陆不能进入购物车,自动跳转到登录界面案例---显示隐藏tabs
全局路由守卫案例---实现权限登录
组件内的路由守卫—局部
beforRouterEnter() {} 进入路由前执行的方法beforRouterLeave() {} 离开路由前执行的方法beforeRouterUpdate() {} 路由更新前执行的方法,如: produce/abc ==> produce/123
beforRouterEnter() {}----进入路由前执行的方法
beforRouterEnter(参数1,参数2,参数3) {}参数1:{router} to 去那个路由参数2:{router} from 从那个路由过来参数3:{function} next
next() || next(true) 直接去to中需要去的路由next(false) 阻止跳转next(/login) 跳转转到login页面next 方法必须执行
export default {
beforeRouteEnter(to
,from,next
) {
if(localStorage
.getItem("token")){next()}
else{
next("/login?redirect=/cart");
}
}
beforeRouteLeave(){},
beforeRouteUpdate(){}
}
案例—拦截,不登陆不能进入购物车,自动跳转到登录界面
使用beforeRouteEnter() {}—在需要拦截的地方进行拦截
<script
>
export default {
beforeRouteEnter(to
,from,next
) {
if(localStorage
.getItem("token")) {
next();
}else {
next('/login?redirect=/cart');
}
}
}
</script
>
案例—显示隐藏tabs
使用:路由独享:beforeEnter(to,from,next) {}使用:局部路由守卫-beforeEnter() {}–在router中的index.js中想要在那里设置路由守卫的额地方使用:beforeRouteLeave() {}–在需要触发的功能文件内进行调用使用:事件总线(组件间传参)-- 进行发送与接收数据
<template>
<div class="produce">
<h1>产品页面--{{$route.params.id}}
</h1>
<button @click="$router.go(-1)">返回
</button> |
<button @click="$router.push('/')">首页
</button> |
<button @click="$router.replace('/')">首页-replace
</button>
</div>
</template>
<script>
import Bus from '@/utils/Bus.js'
export default{
created(){
Bus.$emit("showtabs",false);
},
beforeRouteLeave(to,from,next){
Bus.$emit("showtabs",true);
next();
}
}
</script>
因为需要更改App.vue中的导航的显示与隐藏所以需要App.vue中进行数据的接收
<template>
<div id="app">
<router-view class="page"></router-view>
<div class="tabs" v-if="isShow">
<router-link class="col" to="/">首页
</router-link>
<router-link class="col" to="/category">分类
</router-link>
<router-link class="col" to="/about">星球
</router-link>
<router-link class="col" to="/cart">购物车
</router-link>
<router-link class="col" to="/user">我的
</router-link>
</div>
</div>
</template>
<script>
import Bus from '@/utils/Bus.js';
export default{
data(){return {isShow:true}},
created(){
Bus.$on("showtabs",$event=>{console.log($event,"showtabs");this.isShow=$event})
}
}
</script>
再router.js中进行局部设计进入详情页面 通知app.vue隐藏底部栏所以再详情页面的地方进行路由守卫数据的传递
{
path
: '/produce/:id',
name
: 'Produce',
component
: Produce
,
beforeEnter(to
,from,next
) {
Bus
.$emit("showtabs",false);
next();
}
},
全局路由守卫
在route文件夹中index.js中进行定义router.beforeEach( (to,from,next) => {})所有的路由导航守卫,全局
案例—实现权限登录
router
.beforeEach((to
,from,next
) => {
var user
= sessionStorage
.getItem("user") || '{}';
user
= JSON.parse(user
);
to
.meta
.auth
===undefined
? to
.meta
.auth
= -1:"";
if(to
.meta
.auth
<= -1) {
next();
}else {
if(user
.M_ID) {
if(user
.M_Rank
>= to
.meta
.auth
) {
next();
}else {
alert("权限不够,请充值");
next("/user");
}
}else {
next("/login?redirect=" + to
.path
);
}
next();
}
});