路由守卫
页面结构
<body>
<div id="app">
<h1>路由守卫</h1>
<router-view></router-view>
<br />
<router-link to="/">跳转首页</router-link>
<router-link to="/user">跳转会员中心</router-link>
<router-link to="/product">跳转产品页</router-link>
</div>
</body>
<script src="./vue.min.js"></script>
<script src="./vue-router.js"></script>
逻辑结构
const Home = {
template: `<h1>首页</h1>`
}
const User = {
template: `<h1>会员中心</h1>`
}
const Product = {
template: `<h1>产品中心</h1>`
}
const Login = {
template: `<h1>登录界面</h1>`
}
const router = new VueRouter({
routes: [
{
path: '/',
component: Home,
},
{
path: '/user',
component: User,
meta: {
IsLogin: true
}
},
{
path: '/product',
component: Product,
},
{
path: '/login',
component: Login,
},
]
})
router.beforeEach((to, from, next) => {
var IsLogin = to.meta.IsLogin ? to.meta.IsLogin : false
if(IsLogin)
{
next('/login')
}else
{
next()
}
})
router.afterEach((to, from) => {
})
var app = new Vue({
el:'#app',
router,
})
组件内的守卫
<template>
<div>
<h1>列表页面</h1>
</div>
</template>
<script>
export default {
beforeRouteEnter(to, from, next) {
//进入路由前
// 在渲染该组件的对应路由被 confirm 前调用
// 不!能!获取组件实例 `this`
// 因为当守卫执行前,组件实例还没被创建
next(vm => {
// 通过 `vm` 访问组件实例
console.log(vm)
})
next()
},
beforeRouteUpdate(to, from, next) {
//更新路由前
// 在当前路由改变,但是该组件被复用时调用
console.log("组件更新时触发");
next()
},
beforeRouteLeave(to, from, next) {
// 可以访问组件实例 `this`
console.log("导航离开该组件的对应路由时调用");
next()
},
};
</script>
脚手架中使用方式
const app = createApp(App)
.use(router)
.use(Vant)
.use(api)
.use(VueCookies)
.mount('#app')
router.beforeEach(async (to, from, next) => {
if(to.meta.auth)
{
var LoginUser = app.$cookies.get('LoginUser')
if(!LoginUser)
{
next('/user/base/login')
return
}
var userid = LoginUser.id ? LoginUser.id : 0;
var result = await api.check({userid:userid})
if(result.code == 0)
{
app.$cookies.remove('LoginUser')
next('/user/base/login')
return
}else
{
app.$cookies.set('LoginUser', result.data)
next()
}
}else
{
next()
}
})