1.导航守卫:
“导航”表示路由正在发⽣改变
完整的导航解析流程:
-
导航被触发。
-
在失活的组件⾥调⽤离开守卫。
-
调⽤全局的
·beforeEach守卫。 -
在重⽤的组件⾥调⽤
beforeRouteUpdate守卫 (2.2+)。 -
在路由配置⾥调⽤
beforeEnter。 -
解析异步路由组件。
-
在被激活的组件⾥调⽤
beforeRouteEnter。 -
调⽤全局的
beforeResolve守卫 (2.5+)。 -
导航被确认。
-
调⽤全局的
afterEach钩⼦。 -
触发
DOM更新。 -
⽤创建好的实例调⽤
beforeRouteEnter守卫中传给next的回 调函数。
2.全局守卫:
之前src/router/index.js中的router被导出了,这里就在main.js中做全局的路由守卫了。
🍊使⽤router.beforeEach注册⼀个全局前置守卫:
🤖需求:
有个需求,⽤户访问在浏览⽹站时,会访问很多组件,当⽤户跳转到 /notes ,发现⽤户没有登录,此时应该让⽤户登录才能查看,应该让⽤户跳转到登录⻚⾯,登录完成之后才可以查看我的笔记的内容,这个时候全局守卫起到了关键的作⽤。
- 有两个路由
/notes和/login
router.vue
const router = new VueRouter({
routes:[
{
path: '/notes',
name: 'notes',
component: () => import('@/views/Notes')
},
{
path: "/login",
name: "login",
component: () => import('@/views/Login')
},
main.js中的全局路由守卫:
router.beforeEach会监听每次路由的变化,如果to.path等于"/notes",就去获取用户信息:- 有用户信息:直接放行,渲染
/notes路由的页面 - 如果没有用户信息,通过
next("/login")跳转到login页去登录
- 有用户信息:直接放行,渲染
import Vue from 'vue'
import App from './App.vue'
import router from "./router";
Vue.config.productionTip = false
//全局路由守卫
router.beforeEach((to,from,next)=>{
console.log("我来自",from);
console.log("我来到",to);
if(to.path === "/notes"){
//获取用户登录的信息
const user = JSON.parse(localStorage.getItem("user"));
//🍊如果里面有登录信息直接获取并放行否则跳转到login页面
if(user){
next()
}else{
next("/login")
}
}
next();
})
new Vue({
//4、挂载到vue实例上
router,
render: h => h(App)
}).$mount('#app')
login页面:
<template>
<div>
想看笔记您需要登录<br>
<input type="text" v-model="name"><br>
<input type="password" v-model="password"><br>
<button @click="login">点击登录</button>
</div>
</template>
<script>
export default {
data() {
return {
name: "",
password: ""
}
},
methods: {
login() {
//1.获取用户名和密码(这里通过settimeout来模拟后台请求)
//2.与后端发生交互
setTimeout(() => {
console.log(this.name);
console.log(this.password);
let data = {
user: this.user
};
//将信息存到缓存中去
localStorage.setItem("user", JSON.stringify(data));
this.$router.push({
name: "notes"
});
}, 2000)
}
}
}
</script>