Vue —— 进阶 vue-router 路由(三)(全局路由守卫)

简介: Vue —— 进阶 vue-router 路由(三)(全局路由守卫)

路由守卫

1. 分类
  1. 全局守卫
  2. 独享守卫
  3. 组件内守卫

一、全局路由守卫

1. 作用
  1. 全局路由守卫分为 全局_前置路由守卫 和 全局_后置路由守卫。
  2. 对路由进行权限控制。
2. 基本代码

全局前置路由守卫:初始化的时候被调用、每次路由切换之前被调用。

  router.beforeEach((to, from, next) => {
    console.log('前置路由守卫', to, from);
    if (to.meta.isAuth) { //判断当前路由是否需要进行权限控制
        if (localStorage.getItem('school') === 'shandong') { //控制权限的具体规则
          next() //放行
        } else {
          alert('学校名不对,无权限查看!')
        }
    } else {
      next() //放行
    }
  })

全局后置路由守卫:初始化的时候被调用、每次路由切换之后被调用。

  router.afterEach((to, from) => {
    console.log('后置路由守卫', to, from);
    if(to.meta.title) {
    document.title = to.meta.title //修改网页的title
      } else {
    doument.title = 'vue_test'  
    }
  })
3. 实例:路由守卫的拦截
  1. 当条件判断正确的时候(school 为 shandong),才能看到 News 和 Message 的信息。
  2. 利用全局守卫来授权

https://www.bilibili.com/video/BV1sY411u7k4?t=1.0

全局路由守卫

index.js

  1. 给每个路由配置 meta。
  2. 给路由的标题命名:meta: {title: 'xxx'}。
  3. 开启查看权限:meta: {isAuth: true, title: 'xxx'}
  const router = new VueRouter({
    ......
    children: [{
        name: 'xiangqing',
        path: 'detail/:id/:title',
        component: Detail,
        meta: {
          isAuth: true, //开始权限
          title: '详情' //路由标题
        },
        props($route) {
          return {
            id: $route.params.id,
            title: $route.params.title
          }
        } 
     }]
     ......
   })
  // 全局前置路由守卫——初始化的时候被调用、每次路由切换之前被调用
  router.beforeEach((to, from, next) => {
    console.log('前置路由守卫', to, from);
    if (to.meta.isAuth) {
      if (localStorage.getItem('school') === 'shandong') {
        next()
      } else {
        alert('学校名不对,无权限查看!')
      }
    } else {
      next()
    }
  })
  // 全局后置路由守卫——初始化的时候被调用、每次路由切换之后被调用
  router.afterEach((to, from) => {
    console.log('后置路由守卫', to, from);
    document.title = to.meta.title || '初始页'
  })
  export default router

二、独享路由守卫

1. 作用

只对当前路由进行权限控制

2. 实例:独享守卫的拦截

https://www.bilibili.com/video/BV1uT4y1B7an?t=1.1

独享路由守卫

  1. 只对 News 这一个路由组件进行权限控制。
  2. 独享守卫可以与全局守卫一起使用。
  ......
  name: 'xinwen',
  path: 'news',
  component: News,
  meta: {
      isAuth: true,
      title: '新闻'
  },
  beforeEnter: (to, from, next) => {
      console.log('独享路由守卫', to, from);
      if (to.meta.isAuth) {
        if (localStorage.getItem('school') === 'shandong') {
          next()
        } else {
          alert('学校名不对,无权限查看!')
        }
      } else {
        next()
      }
    }
    ......
    router.afterEach((to, from) => {
      document.title = to.meta.title || '初始页'
      console.log('后置路由守卫', to, from);
  })

三、组件内路由守卫

1. 两个守卫
  1. 进入守卫:通过路由规则,进入该组件时被调用。
  2. 离开守卫:通过路由规则,离开该组件时被调用。
2. 基本语法
    //进入守卫
    beforeRouteEnter(to, from, next) {...}
    //离开守卫
    beforeRouteLeave(to, from, next) {...}
3. 实例:组件内的守卫

https://www.bilibili.com/video/BV1BY4y1B7Sh?t=0.7

组件内守卫

About.vue

  1. 组件内的守卫也可以和其他守卫一起使用。
  <template>
    <h2>我是About的内容</h2>
  </template>
  <script>
  export default {
    name: "myAbout",
    // 通过路由规则,进入该组件时被调用
    beforeRouteEnter(to, from, next) {
      console.log("About——beforeRouteEnter", to, from);
      if (to.meta.isAuth) {
        if (localStorage.getItem("school") === "shandong") {
          next();
        } else {
          alert("学校名不对,无权限查看!");
        }
      } else {
        next();
      }
    },
    // 通过路由规则,离开该组件时被调用
    beforeRouteLeave (to, from, next) {
      console.log("About——beforeRouteLeave", to, from);
      next()
    }
  };
  </script>

不积跬步无以至千里 不积小流无以成江海

相关文章
|
5天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
6天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
5天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
5天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
|
19天前
|
数据采集 监控 JavaScript
在 Vue 项目中使用预渲染技术
【10月更文挑战第23天】在 Vue 项目中使用预渲染技术是提升 SEO 效果的有效途径之一。通过选择合适的预渲染工具,正确配置和运行预渲染操作,结合其他 SEO 策略,可以实现更好的搜索引擎优化效果。同时,需要不断地监控和优化预渲染效果,以适应不断变化的搜索引擎环境和用户需求。
|
6天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
6天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
7天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
7天前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
12天前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发