美文网首页编程Vue.js学习
vue-router 钩子函数(路由拦截)

vue-router 钩子函数(路由拦截)

作者: yonglei_shang | 来源:发表于2018-04-24 17:36 被阅读1214次
1、全局的钩子

beforeEach(to,from,next)
afterEach(to,from,next)

2、组建内的导航钩子

组件内的导航钩子主要有这三种:beforeRouteEnterbeforeRouteUpdatebeforeRouteLeave。他们是直接在路由组件内部直接进行定义的

methods: {},
beforeRouteLeave (to, from, next) {}

需要注意是:

beforeRouteEnter 不能获取组件实例 this,因为当守卫执行前,组件实例被没有被创建出来,剩下两个钩子则可以正常获取组件实例 this

beforeRouteEnter获取到this实例

beforeRouteEnter (to, from, next) {
  next(vm => {
    // 通过 `vm` 访问组件实例
  })
}

最后是完整的导航解析流程:

1、导航被触发
2、在失活的组件里调用离开守卫
3、调用全局的 beforeEach 守卫
4、在重用的组件里调用 beforeRouteUpdate 守卫
5、在路由配置里调用 beforEnter
6、解析异步路由组件
7、在被激活的组件里调用 beforeRouteEnter
8、调用全局的 beforeResolve 守卫
9、导航被确认
10、调用全局的 afterEach 钩子
11、触发 DOM 更新
12、在创建好的实例调用 beforeRouteEnter 守卫中传给 next 的回调函数


路由拦截登录例子

import Vue from 'vue'
import Router from 'vue-router'
 
Vue.use(Router)
 
const router = new Router({
 routes: [
 {
  path: '/',
  /*
  * 按需加载 
  */
  component: (resolve) => {
  require(['../components/Home'], resolve)
  }
 }, {
  path: '/record',
  name: 'record',
  component: (resolve) => {
  require(['../components/Record'], resolve)
  }
 }, {
  path: '/Register',
  name: 'Register',
  component: (resolve) => {
  require(['../components/Register'], resolve)
  }
 }, {
  path: '/Luck',
  name: 'Luck', 
  // 需要登录才能进入的页面可以增加一个meta属性
  meta: { 
  requireAuth: true
  },
  component: (resolve) => {
  require(['../components/luck28/Luck'], resolve)
  }
 }
 ]
})
// 判断是否需要登录权限 以及是否登录
router.beforeEach((to, from, next) => {
 if (to.matched.some(res => res.meta.requireAuth)) {// 判断是否需要登录权限
 if (localStorage.getItem('username')) {// 判断是否登录
  next()
 } else {// 没登录则跳转到登录界面
  next({
  path: '/Register',
  query: {redirect: to.fullPath}
  })
 }
 } else {
 next()
 }
})
 
export default router

当router的mode为history时,去掉#

router.beforeEach((route, redirect, next) => {
  let title = route.meta.title
  document.title = title || ''
  console.log(route.hash)
  if (route.hash !== '') {
    const id = route.hash.replace('#', '')
    const element = document.getElementById(id)
    if (element) element.scrollIntoView()
  }
  if (route.path !== '/') {
    indexScrollTop = document.body.scrollTop
  }
  next()
})
router.afterEach((route, redirect) => {
  if (route.hash !== '') {
    const id = route.hash.replace('#', '')
    const element = document.getElementById(id)
    if (element) element.scrollIntoView()
  }
  if (route.path !== '/') {
    document.body.scrollTop = 0
  } else {
    Vue.nextTick(() => {
      document.body.scrollTop = indexScrollTop
    })
  }
})

这样就做好了登录拦截.我们只需在main.js中引入router就可以了.

相关文章

  • vue-router路由守卫

    vue-router导航钩子 vue-router导航钩子的主要作用是拦截导航,让路由完成跳转或者取消; 导航钩子...

  • 2021-04-11

    vue-router 路由钩子函数(导航守卫) 路由钩子函数有三种: 全局钩子: beforeEach(全局前置守...

  • vue-router方法的记录

    记录一下vue-router中的路由钩子函数的基本用法 路由钩子函数分为三种类型如下: 第一种:全局钩子函数。 r...

  • vue-router 钩子函数(路由拦截)

    1、全局的钩子 beforeEach(to,from,next)afterEach(to,from,next) 2...

  • vue-router 2.0 钩子函数

    vue-router 提供的导航钩子主要用来拦截导航,让它完成跳转或取消。有多种方式可以在路由导航发生时执行钩子:...

  • vue-router 2.0 常用基础知识点之导航钩子

    导航钩子 vue-router 提供的导航钩子主要用来拦截导航,让它完成跳转或取消。有多种方式可以在路由导航发生时...

  • Vue2.0一个login跳转实例

    需要解决的问题:store存储登录状态Vue-Router导航钩子拦截路由Vue-Resource获取后台的数据需...

  • Vue-Router面试题

    一、vue-router有几种钩子函数?具体是什么及其参数 1、全局路由。(全局导航钩子主要有两种钩子:前置守...

  • 面试题

    vuex工作流程 vue-router导航守卫(钩子函数) 概念:导航发生变化时,导航钩子主要用来拦截导航,让它完...

  • vue组件级路由钩子函数介绍,及实际应用

    正如其名,vue-router提供的导航钩子主要用来拦截导航,让它完成跳转或取消。 有多种方式可以在路由导航发生时...

网友评论

  • Dmc_a8f0:现在如果是 在主页没登入或注册 要点击一下子路由才会进 绑定或登入页面 而不是 立即跳转登入或注册界面 这应该怎么做呢
    yonglei_shang:把你的那个主页面做判断,判断路由,排除主页面,当不需要调转的页面比较多时可以在定义路由的时候加一个字段,用那个字段来判断等等,方法很多看哪个更适合自己的项目

本文标题:vue-router 钩子函数(路由拦截)

本文链接:https://www.haomeiwen.com/subject/xcechftx.html