vue尚品汇商城项目-day05【36.导航守卫理解】

简介: vue尚品汇商城项目-day05【36.导航守卫理解】

1.jpeg

36.导航守卫理解

路由守卫:分为全局守卫、独享守卫、组件内守卫。

  • 分为全局守卫(常用):一旦配置,那么作用范围就是所有的路由,只要路由发生改变就会触发,全局路由又分为全局前置守卫全局后置守卫
  • 独享守卫(常用):是在进入组件时被调用,区别就在于,想对哪个路由进行权限控制就直接在其路由配置项中添加守卫,作用域也仅限于该路由。举例:假设用户刚登录成功,能直接跳转支付成功页面或者订单页面吗?答案是不能。
  • 组件内守卫(不常用):当使用路由规则进入该组件或离开该组件时,就会触发组件内守卫的调用,而组件内守卫一般写在组件内部,它的作用于范围也仅限于该组件。举例:进某个屋子之前怎么怎么地,离开后又怎么怎么地,有点类似于后端的切面,进入方法前怎么怎么地,离开方法后怎么怎么地。

重难点说明

  1. 理解导航守卫

2) 使用导航守卫实现以下功能

​ a. 只有登陆了, 才能查看交易/支付/个人中心界面

​ b. 只有没有登陆, 才能查看登陆界面

​ c. 只有携带的skuNum以及sessionStorage中有skuInfo数据, 才能查看添加购物车成功的界面

​ d. 只能从购物车界面, 才能跳转到交易界面

​ e. 只能从交易界面, 才能跳转到支付界面

​ f. 只有从支付界面, 才能跳转到支付成功的界面

导航守卫是什么?

1). 导航守卫是vue-router提供的下面2个方面的功能

​ a. 监视路由跳转 -->回调函数

​ b. 控制路由跳转

2). 应用

​ a. 在跳转到界面前, 进行用户权限检查限制(如是否已登陆)

​ b. 在界面离开前, 做收尾工作

导航守卫分类

1). 全局守卫: 针对任意路由跳转

​ a. 全局前置守卫

​ b. 全局后置守卫

​ 2). 路由独享的守卫

​ 前置守卫

3). 组件守卫: 只针对当前组件的路由跳转

​ a. 进入

​ b. 更新

​ c. 离开

相关API

1). 全局前置守卫: 在准备跳转到某个路由组件之前 (在开发中用的比较多)

​ router.beforeEach((to, from, next) => {// before enter each route component

​ ...

​ })

​ 说明:

​ ①. to: 目标route

​ ②. from: 起始route

​ ③. next: 函数

​ next(): 执行下一个守卫回调, 如果没有跳转到目标路由

​ next(false)/不执行: 跳转流程在当前处中断, 不会跳转到目标路由组件

​ next(path): 跳转到指定的另一个路由

2). 全局后置守卫: 在跳转到某个路由组件之后

​ router.afterEach((to, from) => {

​ })

​ 3). 路由独享守卫

​ beforeEnter: (to, from, next) => {

​ }

3). 组件守卫

​ // 在当前组件对象被创建前调用, 不能直接访问this(不是组件对象)

​ // 但可以通过next(component => {}), 在回调函数中访问组件对象

​ beforeRouteEnter (to, from, next) {

​ next(component => {})

​ },

​ // 当前组件对象将要更新前调用, 可以访问this

​ beforeRouteUpdate (to, from, next) {

​ },

​ // 在当前组件离开前调用, 可以访问this

​ beforeRouteLeave (to, from, next) {

​ next()

​ }

修改代码:

src/pages/Home/index.vue Home组件中删除触发action

删除this.$store.dispatch('reqUserInfo');

src/router/index.js

let router = new VueRouter({
    ...
})

//全局守卫:前置守卫(在路由跳转之间进行判断)
router.beforeEach(async (to, from, next) => {
    //to:获取到要跳转到的路由信息
    //from:获取到从哪个路由跳转过来来的信息
    //next: next() 放行  next(path) 放行  
    //获取仓库中的token-----可以确定用户是登录了
    let token  = store.state.user.token;
    let name = store.state.user.userInfo.name;
    //用户登录了
    if(token){
        //已经登录而且还想去登录------不行
        if(to.path=="/login"||to.path=='/register'){
            next('/');
        }else{
            //已经登陆了,访问的是非登录与注册
            //登录了且拥有用户信息放行
            if(name){
                next();
            }else{
                //登陆了且没有用户信息
                //在路由跳转之前获取用户信息且放行
                try {
                    await store.dispatch('reqUserInfo');
                    next();
                } catch (error) {
                    //token失效从新登录
                    await store.dispatch('reqLogout');
                    next('/login')
                }
            }
        }
    }else{
        //未登录:不能去交易相关、不能去支付相关【pay|paysuccess】、不能去个人中心
        //未登录去上面这些路由-----登录
        let toPath = to.path;
        if(toPath.indexOf('/trade')!=-1 || toPath.indexOf('/pay')!=-1||toPath.indexOf('/center')!=-1){
            //把未登录的时候向去而没有去成的信息,存储于地址栏中【路由】
            next('/login?redirect='+toPath);
        }else{
            //去的不是上面这些路由(home|search|shopCart)---放行
            next();
        }

    }
});

export default router;

src/pages/Login/index.vue

methods: {
   
      //登录的回调函数
      async reqUserLogin() {
   
        try {
   
           //成功
          const {
   phone, password} = this;
          phone && password && await this.$store.dispatch('reqUserLogin',{
   phone, password});
          //判断query是否有参数,有就登录后重定向
          let goPath = this.$route.query.redirect||'/home';
          //跳转到首页
          this.$router.push(goPath);
        } catch (error) {
   
           //失败
           alert(error.message)
        }
      }
    }

注意点1:

问题:全局组件中to, from, next都代表啥?

答案:

  • to:获取到要跳转到的路由信息
  • from:获取到从哪个路由跳转过来来的信息
  • next: next() 放行 next(path) 放行

注意点2:跳转路由的逻辑很复杂,具体梳理如下:

  • 判断是否用户登录?

    • 已登录:判断跳转路由是否想去('/login')或者('/register')?

      • 是:禁止跳转,并跳转到首页('/')

      • 不是:判断是否拥有用户信息?

        • 有:派发getUserInfo并放行
        • 没有:派发userLogout并路由跳转到登录页('/login')
    • 未登录:判断跳转路由是否想去交易相关('/trade')、支付相关('/pay')、个人中心相关('/center')

      • 是:禁止跳转,并路由跳转到登录页('/login')
      • 不是:放行

注意点3:

问题:如何设置路由守卫呢?

答案:在src/router/index.js中就可以配置,只不过由原来的默认导出路由改为先定义router变量接收,然后中间配置路由守卫,最后导出路由。

注意点4:

问题:为啥else里面的登录后面会有个重定向?干啥用的?

答案:会有这种场景需求:之前是登录后默认都是跳转的/home首页,现在有个需求:用户未登录情况下点击跳转订单页 -> 先跳转到登录页 -> 当登陆成功后应该跳转到订单页而不是首页,所以这块补充了redirect并配合登录方法重定向到想去的位置。

本人其他相关文章链接

1.vue尚品汇商城项目-day05【30.登录与注册静态组件(处理公共图片资源问题)+31.注册的业务+登录业务】
2.vue尚品汇商城项目-day05【33.token令牌理解+34.用户登录携带token获取用户信息+35.退出登录】
3.vue尚品汇商城项目-day05【36.导航守卫理解】

目录
相关文章
|
6天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
vue学习第四章
|
6天前
|
JavaScript 前端开发
vue学习第九章(v-model)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生,自学前端2年半,正向全栈进发。此篇介绍v-model在不同表单元素中的应用及修饰符的使用,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
vue学习第九章(v-model)
|
6天前
|
JavaScript 前端开发 开发者
vue学习第十章(组件开发)
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文深入讲解Vue组件的基本使用、全局与局部组件、父子组件通信及数据传递等内容,适合前端开发者学习参考。持续更新中,期待您的关注!🎉🎉🎉
vue学习第十章(组件开发)
|
11天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
11天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
|
11天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
12天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
12天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
12天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
13天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
下一篇
无影云桌面