• 路由守卫(全局钩子(全局路由守卫)、路由单独钩子(router独享守卫))


    全局钩子(全局路由守卫

    vue中路由守卫(路由钩子,或者 叫做 路由导航守卫)一共有三种,一个全局路由守卫,一个是组件内路由守卫,一个是router独享守卫。

    路由钩子,即导航钩子,其实就是路由拦截器,vue-router一共有三类:

    1. 全局钩子:最常用

    2. 路由单独钩子

    3. 组件内钩子

    6.4.3.1 全局钩子(全局路由守卫)

    所谓全局路由守卫,就是小区大门,整个小区就这一个大门,你想要进入其中任何一个房子,都需要经过这个大门的检查。 全局路由守卫有个两个:一个是全局前置守卫beforeEach(), 一个是全局后置守卫afterEach() 。

    在src/router/index.js中使用,代码如下:

    1. // 给路由实例对象添加全局守卫
    2. // 全局前置守卫
    3. router.beforeEach((to,from,next)=>{
    4. // 读取数据
    5. let token = localStorage.getItem('token');
    6. console.log(token);
    7. if(token){//如果有token,就允许去访问 对应的组件
    8. next();//放行---页面执行放行操作
    9. }else{//如果没有token,就跳转到登录页
    10. if(to.path === '/login'){
    11. next();
    12. }else{
    13. next('/login');
    14. }
    15. }
    16. })
    17. export default router

    每个钩子方法接收三个参数: to: Route : 即将要进入的目标 [路由对象] from: Route : 当前导航正要离开的路由 next: Function : 继续执行函数

    • next():继续执行

    • next(false):中断当前的导航。

    • next(‘/‘) 或 next({ path: ‘/‘ }):跳转新页面,常用于登陆失效跳转登陆

      例如:

      创建 user.vue 用户中心组件,login.vue登录组件。我们 希望 通过通过 登录且 成功登录,去访问用户中心,否则,做路由拦截。

      user.vue

    1. <template>
    2. <div>
    3. <h1>用户中心</h1>
    4. </div>
    5. </template>

     login.vue

    1. <template>
    2. <div class="login">
    3. <h1>系统登录</h1>
    4. <div class="login-box">
    5. <div>
    6. <!-- v-model.trim后面加上.trim是为了去除表单修饰符 -->
    7. 用户名:<input type="text" v-model.trim="username">
    8. </div>
    9. <div>
    10. &emsp;码:<input type="password" v-model.trim="password">
    11. </div>
    12. <div>
    13. <button @click="login">登录</button>
    14. </div>
    15. </div>
    16. </div>
    17. </template>
    18. <script>
    19. export default {
    20. name: 'login',
    21. data() {
    22. return {
    23. username:'',
    24. password:''
    25. };
    26. },
    27. mounted() {
    28. },
    29. methods: {
    30. login(){
    31. let result = this.username && this.password;
    32. if(!result){
    33. alert('用户名和密码不能为空');
    34. return false;
    35. }
    36. // 如果用户名不是admin,并且密码不是123456
    37. // 注意:用户名 和 密码 当其中有一个输入错误的时候,都会有下面这个提示
    38. if(this.username !== 'admin' || this.password !== '123456'){
    39. alert('用户名或密码错误');
    40. return false;
    41. }
    42. // 在登录的时候 同时 向 本地存储 存一个值,存到token中
    43. // 保存数据
    44. localStorage.setItem('token',Date.now());
    45. // 同上面那个一样,只是形式不同
    46. // localStorage.token = Date.now();
    47. // 登录成功
    48. // $router
    49. this.$router.push({path:'/user'})
    50. }
    51. },
    52. };
    53. </script>
    54. <style lang="scss" scoped>
    55. .login{
    56. display: flex;
    57. // 主轴垂直
    58. flex-direction: column;
    59. align-items: center;
    60. }
    61. .login-box div{
    62. margin: 10px 0;
    63. }
    64. .login-box input{
    65. outline: none;
    66. height: 26px;
    67. }
    68. .login-box button{
    69. width: 80px;
    70. height: 30px;
    71. }
    72. </style>

    在路由配置文件中router/index.js 去配置 全局路由守卫(路由拦截):

    1. // 给路由实例对象添加全局守卫
    2. // 全局前置守卫
    3. router.beforeEach((to,from,next)=>{
    4. // 读取数据
    5. let token = localStorage.getItem('token');
    6. console.log(token);
    7. if(token){//如果有token,就允许去访问 对应的组件
    8. next();//放行---页面执行放行操作
    9. }else{//如果没有token,就跳转到登录页
    10. if(to.path === '/login'){
    11. next();
    12. }else{
    13. next('/login');
    14. }
    15. }
    16. // console.group('from---');
    17. // console.log(from);
    18. // console.group('to---');
    19. // console.log(to);
    20. })

    路由单独钩子(router独享守卫)

    使用:在路由配置中单独加入钩子,在src/router/index.js中使用,代码如下:

    创建one.vue组件:

    1. <template>
    2. <div>
    3. <h1>我是首页组件中的子组件--one.vue</h1>
    4. </div>
    5. </template>

    在src/router/index.js中, 在one组件中单独加 钩子:

    1. const routes = [
    2. // 定向
    3. {
    4. path:'/home',
    5. redirect:'/'
    6. },
    7. {
    8. path: '/',
    9. name: 'home',
    10. component: HomeView,
    11. // 嵌套路由(子路由)
    12. children:[
    13. {
    14. path:'/home/one',
    15. component:one,
    16. // 路由单独钩子(router独享守卫)
    17. beforeEnter:(to,from,next)=>{
    18. console.log('进入前执行');
    19. next();
    20. }
    21. }
    22. ]
    23. },

     在HomeView.vue组件中,访问子组件:

    1. <template>
    2. <div class="home">
    3. <img alt="Vue logo" src="../assets/logo.png">
    4. <router-link to="/home/one">访问one组件</router-link>
    5. <router-view></router-view>
    6. </div>
    7. </template>
    8. <script>
    9. export default {
    10. name: 'HomeView',
    11. components: {
    12. }
    13. }
    14. </script>

    预览:

     

  • 相关阅读:
    linux 对防火墙开启,关闭,并制定ip和端口进行外界访问
    Redis 常用的数据结构简介与实例测试【Redis 系列二】
    领域驱动模型DDD(四)——Eventuate Tram Saga源码讲解
    Midjourney视觉垫图
    在 HarmonyOS 上使用 ArkUI 实现计步器应用
    Pytest教程:Fixture详解
    计算机毕业设计(附源码)python音蕾心动
    【时序预测-SVM】基于鲸鱼算法优化支持向量机SVM实现时序数据预测附matlab代码
    【Java转Go】Go中使用WebSocket实现聊天室(私聊+群聊)
    DHCPsnooping 配置实验(2)
  • 原文地址:https://blog.csdn.net/m0_71814235/article/details/127267930