# 导航守卫

# 全局守卫

# beforeEach

router.beforeEach((to, from, next) => {
  console.log('before each')
  next()
})
  • 路由开始时被调用
  • 所有路由都会调用

# beforeResolve

router.beforeResolve((to, from, next) => {
  console.log('before resolve')
  next()
})
  • 路由确认前被调用,即经过全局守卫、路由守卫、组件守卫之后,即将确认该路由之前被调用
  • 所有路由都会调用

# afterEach

router.afterEach((to, from) => {
  console.log('after each')
})
  • 路由确认之后被调用
  • 所有路由都会调用
  • 没有next,因为不需要

# 路由守卫

# beforeEnter

const routes = [
  {
    path: '/about/:id',
    name: 'About',
    component: About,
    beforeEnter(to, from, next) {
      console.log('in router: before enter')
      next()
    },
  }
]
  • 全局守卫之后进入路由守卫
  • 路由参数(/path/:id)或查询参数(/path?id=xx)的变化不触发

# 组件守卫

# beforeRouteEnter

export default {
  name: 'Home',
  beforeRouteEnter(to, from, next) {
    console.log('in component: before route enter home')
    next()
  }
}
  • 路由守卫之后进入组件守卫

  • 路由参数(/path/:id)或查询参数(/path?id=xx)的变化不触发

  • 函数内this为undefined,因为此时组件实例还未创建

  • 可以在next()中传入回调函数,该回调将在路由结束后调用(只有该守卫可以传入回调,其他组件守卫不支持,因为不需要)

     beforeRouteEnter(to, from, next) {
        console.log('in component: before route enter home')
        next((vm) => {
          console.log('callback')
        })
      },
    

# beforeRouteUpdate

export default {
  name: 'Home',
  beforeRouteUpdate(to, from, next) {
    console.log('in componet: before route update home')
    next()
  }
}
  • 路由参数(/path/:id)或查询参数(/path?id=xx)的变化时触发

# beforeRouteLeave

export default {
  name: 'Home',
  beforeRouteLeave(to, from, next) {
    console.log('in componet: before route leave home')
    next()
  }
}
  • 导航离开该组件对应的路由时调用

# 参数说明

  • to: 目标路由对象(Route)
  • from: 离开的路由对象(Route)
  • next: 函数对象,调用next()指定下一步的行为
    • next(): 传递给下一个守卫
    • next(false): 终止导航
    • next('/'): 导航至新地址,传入path
    • next({path: '/'}): 导航至新地址,传入目标地址的对象,参考router.push (opens new window)的传参
    • next(error): 终止导航,并将Error对象传递router.onError()回调
上次更新: 2/13/2025, 3:29:47 AM