vue导航守卫

在开发过程经常会遇到譬如在没有登录时点击页面内容,提醒用户登录,跳转到登录页面的需求等等;vue提供了导航守卫主要用来通过跳转或者取消的方式守卫导航。
首先看一下完整的导航解析流程
1、导航被触发。
2、在失活的组件里调用离开守卫(beforeRouteLeave)。
3、调用全局守卫(beforeEach )。
4、在重用的组件里调用更新守卫( beforeRouteUpdate) (2.2+)。
5、在路由配置里调用 beforeEnter。
6、解析异步路由组件。
7、在被激活的组件里调用组件内守卫beforeRouteEnter。
8、调用全局的 beforeResolve 守卫 (2.5+)。
9、导航被确认。
10、调用全局的 afterEach 钩子。
11、触发 DOM 更新。
12、用创建好的实例调用 beforeRouteEnter 守卫中传给 next 的回调函数。
下面介绍一下全局守卫、路由独享守卫和组件内守卫。
1、全局守卫:
router.beforeEach((to,from,next) => {})
to、from、next三个参数如下

router.beforeEach((to,from,next) => {
  // to,from,next 3个参数
  // to: Route, 即将要进入的路由对象
  // from: Route, 当前导航将要离开的路由对象
  // next: Function, 切记要调用该函数来resolve这个钩子,里面可以写自己想要的参数
  // 1、next(): 进行管道中的下一个钩子函数,如果全部钩子函数执行完,导航的状态就说明确认了
  // 2、next(false): 中断当前导航,重置到from路由对应的地址
  // 3、next('/drinks'): 或者next({path:'/drinks'}): 当前导航被中断,跳转到指定的路由
  // 4、next(error): 如果传入参数是Error的实例,导航会被终止且该错误会被传递给router.onError()注册过的回调
// 这里可以写逻辑判断,比如没有登录,点击某个tab就跳转到登录页面
 if (to.path == '/food') {
     alert('还没登录,请先登录');
     next('/drinks');
 } else {
     next();
  }
})

2、全局后置钩子

// 全局后置钩子
router.afterEach((to,from) => {
  // to from 2个参数 和守卫相比少了next参数,因此不能改变导航本身
  // to: Route, 即将要进入的路由对象
  // from: Route, 当前导航将要离开的路由对象
  // alert('确定要离开吗?')
})

3、路由独享守卫

// 在路由配置上直接定义 beforeEnter 守卫:
const routes = [
  {
    path: '/drinks',
    name: 'Drinks',
    component: Drinks,
    // 路由独享守卫 参数含义和全局守卫一样
     beforeEnter:(to, from,next) =>{
       alert('drinks')
       next()
     }
  },
  {
    path: '/fruits',
    name: 'Fruits',
    component: Fruits,
    redirect: '/fruits/apple', // 设置默认展示 Apple
    children:[  //二级路由
      {
        path: '/fruits/apple',
        name: 'Apple',
        component: Apple
      }
    ]
  },
  { // 当路由导航地址错误时默认跳转路径
    path:'*',
    redirect: '/' 
  }
]

3、组件内守卫

// 组件内守卫
    // 进入
    beforeRouteEnter:(to,from,next) => {
        // alert('hello world ' + this.name) 注意:这里不能获取组件实例 `this`,可以通过传一个回调给 next来访问组件实例。在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数
        next(vm => {
           alert('hello world ' + vm.name) 
           next()
        })
    },
  // 更新 (2.2 新增)
    beforeRouteUpdate (to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 `this`
          alert('hello world ' + this.name) 
    },
    // 离开  这个离开守卫通常用来禁止用户在还未保存修改前突然离开。该导航可以通过 next(false) 来取消。
    beforeRouteLeave(to,from,next){
 // 可以访问组件实例 `this`
        if (confirm('确定离开吗?') == true) {
            next()
        } else {
            next(false)
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容

  • 导航解析流程 导航被触发。 在失活的组件里调用离开守卫。 调用全局的 beforeEach 守卫。 在重用的组件里...
    喜欢未来你的我阅读 515评论 0 1
  • 1、全局守卫 router.beforeEach全局前置守卫 next: Function:一定要调用该方法来 r...
    _conquer_阅读 430评论 0 1
  • VUE Vue :数据驱动的M V Vm框架 m :model(后台提供数据),v :view(页面),vM(模板...
    wudongyu阅读 5,298评论 0 11
  • 组件相关钩子函数: beforeCreate、created、beforeMount、mounted、before...
    744354889606阅读 18,832评论 0 37
  • 前言 vue-router是什么:是vue.js官方的路由管理器和vue.js的核心深度的集成,让开发者更加简单的...
    GUAN_one阅读 3,628评论 0 2