zoukankan      html  css  js  c++  java
  • Vue导航守卫

    导航守卫:

    帮助我们解决一些在组件加载之前可以做一些操作,尤其是异步操作,这样可以避免组建加载完毕之后,却没有数据的尴尬。当然,你不应该在组件加载之前做太多的异步操作,这样会导致页面的白屏时间过长,用户体验也很差,所以,须慎用导航守卫。(异步操作是独立于生命周期之外的操作,因此vue并不会乖乖的先执行完beforeCreate周期中的异步操作,验证了信息后再执行下一周期,而是先执行完整个生命周期再执行异步操作,这样的做法会导致,vue实例在渲染dom的时候由于大量数据得不到,渲染出一个很丑的页面)

    完整的导航解析流程

    导航被触发。
    在失活的组件里调用离开守卫。
    调用全局的 beforeEach 守卫。
    在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。
    在路由配置里调用 beforeEnter。
    解析异步路由组件。
    在被激活的组件里调用 beforeRouteEnter。
    调用全局的 beforeResolve 守卫 (2.5+)。
    导航被确认。
    调用全局的 afterEach 钩子。
    触发 DOM 更新。
    用创建好的实例调用 beforeRouteEnter 守卫中传给 next 的回调函数。

    导航守卫分为:全局守卫、路由独享的守卫以及组件内的守卫

     vue路由钩子大致可以分为三类:

    1、全局钩子,主要包括beforeEach和afterEach

    这类钩子主要作用于全局,一般用来判断权限,以及页面丢失时需要执行的操作。

    //使用钩子函数对路由进行权限跳转
    router.beforeEach((to, from, next) => {
        const role = localStorage.getItem('ms_username');
        if(!role && to.path !== '/login'){
            next('/login');
        }else if(to.meta.permission){
            // 如果是管理员权限则可进入,这里只是简单的模拟管理员权限而已
            role === 'admin' ? next() : next('/403');
        }else{
            // 简单的判断IE10及以下不进入富文本编辑器,该组件不兼容
            if(navigator.userAgent.indexOf('MSIE') > -1 && to.path === '/editor'){
                Vue.prototype.$alert('vue-quill-editor组件不兼容IE10及以下浏览器,请使用更高版本的浏
                览器查看', '浏览器不兼容通知', {
                    confirmButtonText: '确定'
                });
            }else{
                next();
            }
        }
    })
    

     2、单个路由里的钩子

    主要用于写某个指定路由跳转时需要执行的逻辑

    {
                        path: '/dashboard',
                        component: resolve => require(['../components/page/Dashboard.vue'], resolve),
                        meta: { title: '系统首页' },
                        beforeEnter: (to, from, next) => {
                            
                          },
                        beforeLeave: (to, from, next) => {
                            
                        }
                    
    },

     3、组件路由

    主要包括beforeRouteEnter和beforeRouteUpdate,beforeRouteLeave,这几个钩子都写在组件里面,也可以传递三个参数(to,from,next)

    $route与$router的区别

    $route是"路由信息对象",包括path、params、hash、query,fullPath,matched,name等路由信息参数。

    而$router是“路由实例对象”,包括了路由的跳转方法,钩子函数等。

  • 相关阅读:
    Linux命令笔记
    Linux服务安装集合(1)
    浅谈GIT之通讯协议
    浅谈GIT之底层对象理解
    友情链接
    当黑客被抓是种怎样的体验?
    PHP 中 include 和 require 的区别详解
    论假如有一台无限算力的主机
    msf渗透安卓手机
    aws ec2 安装Elastic search 7.2.0 kibana 并配置 hanlp 分词插件
  • 原文地址:https://www.cnblogs.com/xiaoan0705/p/10277234.html
Copyright © 2011-2022 走看看