Vue-路由守卫
路由守卫有点像是Java中的Filter过滤器,它可以在路由页面切换前后去执行一些功能代码
- 全局前置守卫:在路由切换前被调用,可以用于验证用户登录、中断导航、请求数据等
- 全局后置守卫:在路由切换之后被调用,可以用于处理数据、操作Dom、记录日志等
守卫代码写在 router.js文件中
全局守卫
每次路由切换页面前,都会执行beforeEach中的回调函数
回调函数提供三个参数:
这三个参数的顺序不能变,一定得是to,from,next
next()的作用就像是filter中的filterChain.doFilter(servletRequest, servletResponse);
to和from是两个对象,调用其path属性即可打印路径
全局前置守卫
1 2 3 4 5 6 7
| router.beforeEach( (to, from, next) => { console.log(to.path) console.log(from.path) next() } )
|
全局后置守卫
1 2 3 4 5
| router.afterEach( (to, from) => {
} )
|
守卫练习
Login.vue
建立登陆组件,写一些功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| <script setup> import { ref } from 'vue'; let username = ref("") let password = ref("")
import {useRouter} from "vue-router" const router = useRouter()
function login(){ if(username.value == "xiaobai" && password.value == "123456"){ router.push("/home") window.sessionStorage.setItem("username",username.value) }else{ alert("用户名或者密码错误") } } </script>
<template> <div> 账号: <input type="text" v-model="username"> <br> 密码: <input type="password" v-model="password"> <button @click="login()">登录</button> </div> </template>
<style scoped>
</style>
|
Home.vue
建立一个home组件,写一些功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <script setup> import {useRouter} from "vue-router" const router = useRouter()
let username = window.sessionStorage.getItem("username")
function logout(){ window.sessionStorage.removeItem("username") router.push("/login") }
</script>
<template> <div> <h1>home页面</h1> <h3>欢迎{{username}}登录</h3> <button @click="logout">退出登录</button> </div> </template>
<style scoped>
</style>
|
router.js
建立router.js,编写路由规则和路由守卫
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| import {createRouter,createWebHashHistory} from 'vue-router'
import Login from '../components/Login.vue' import Home from '../components/Home.vue' const router = createRouter({ history:createWebHashHistory(), routes:[ { path:"/home", component:Home }, { path:"/login", component:Login } ] } )
router.beforeEach((to, from, next) => { if (to.path == '/login') { next(); }else{ const username = sessionStorage.getItem("username") if(null != username) next() else{ next("/login") } } }); export default router
|