导航守卫的理解和使用

1、导航守卫钩子

导航守卫的用途主要是在用户离开页面前提醒用户,和页面访问前先登录。共有7个钩子,其中全局钩子有3个,组件钩子有3个,路由管道钩子有1个。

全局钩子:

const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
    // ...(2)
    //全局前置守卫
})
router.beforeResolve((to, from, next) => {
   // ...(6)
    //全局解析守卫

})
router.afterEach((to, from) => {
  // ...(7)
  //全局后置守卫
}

组件内的钩子:

export default {
  data(){},
  beforeRouteEnter (to, from, next) {
    //....(5)
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不!能!获取组件实例 `this`
    // 因为当守卫执行前,组件实例还没被创建
  },
  beforeRouteUpdate (to, from, next) {
    // ... (3)
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 `this`
  },
  beforeRouteLeave (to, from, next) {
    // ... (1)
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
  }
}

路由管道钩子:

const router = new VueRouter({
  routes: [
    {
      path: ‘/foo‘,
      component: Foo,
      beforeEnter: (to, from, next) => {
        // ...(4)
      }
    }
  ]
})

2、参数解析

每个守卫方法接收三个参数:

  • to: Route: 即将要进入的目标 路由对象,该对象有目标页的路由信息。
  • from: Route: 当前导航正要离开的路由,该对象有当前页的路由信息。
  • next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。
    • next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。
    • next(false): 中断当前的导航。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。
    • next(‘/‘) 或者 next({ path: ‘/‘ }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。你可以向 next 传递任意位置对象,且允许设置诸如 replace: truename: ‘home‘ 之类的选项以及任何用在 router-link 的 to prop 或 router.push 中的选项。
    • next(error): (2.4.0+) 如果传入 next 的参数是一个 Error 实例,则导航会被终止且该错误会被传递给 router.onError() 注册过的回调。

确保要调用 next 方法,否则钩子就不会被 resolved。

3、导航流程

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

4、导航流程图(页面切换的执行顺序)

5、页面跳转前需登录  - 实验

1)首先需要给isLogin为false,表示未登录,将该值初始在store内,

export default new Vuex.Store({
  state: {
    isLogin: false,
  },
  mutations: {
    handleLogin(state, login) {
      state.isLogin = login;
    },
  },
});

2)在登录页- 登录按钮 设置点击时修改store内的isLogin为true,同时跳转到首页‘/home’

methods: {
    ...mapMutations([‘handleLogin‘]),
    handleSubmit() {
      // 修改store里的isLogin为true,表示登录了
      this.handleLogin(true)
      this.$router.push({path: ‘/home‘})
    }
  }

3)每一次页面切换时,全局钩子beforeEach都会触发,在该钩子内判断 是否登录了?若没有登录,需要跳转到 登录页 ‘/login’,否则 可以跳转

router.beforeEach((to, from, next) => {
  const isLogin = obj.state.isLogin;
  if (to.path === ‘/login‘ || isLogin) {
    next();
  } else {
    next(‘/login‘);
  }
});

6、参考文献

https://router.vuejs.org/zh/guide/advanced/navigation-guards.html#%E5%85%A8%E5%B1%80%E5%89%8D%E7%BD%AE%E5%AE%88%E5%8D%AB

https://www.cnblogs.com/minigrasshopper/p/7928311.html

route

原文地址:https://www.cnblogs.com/Ladai/p/11721177.html

时间: 2024-10-18 15:20:39

导航守卫的理解和使用的相关文章

Vue2.0 Router 导航守卫

官方文档地址:https://router.vuejs.org/zh-cn/advanced/navigation-guards.html 全局守卫 可以使用 router.beforeEach 注册一个全局前置守卫: 例如: 判断在用户未登录时, 跳转到 "/login" 的路由,  登录时,直接跳转到默认路由 const router = new VueRouter({ ... }) // 实例化 router router.beforeEach((to, from, next)

Vue导航守卫beforeRouteEnter,beforeRouteUpdate,beforeRouteLeave详解

Vue导航守卫以我自己的理解就是监听页面进入,修改,和离开的功能.每个守卫接受三个参数 to: Route: 即将要进入的目标路由对象 from: Route: 当前导航正要离开的路由 next: Function: 一定要调用该方法来 resolve 这个钩子.执行效果依赖 next 方法的调用参数. next(): 进行管道中的下一个钩子.如果全部钩子执行完了,则导航的状态就是 confirmed (确认的). next(false): 中断当前的导航.如果浏览器的 URL 改变了(可能是用

Vue的钩子函数[路由导航守卫、keep-alive、生命周期钩子]

前言 说到Vue的钩子函数,可能很多人只停留在一些很简单常用的钩子(created,mounted),而且对于里面的区别,什么时候该用什么钩子,并没有仔细的去研究过,且Vue的生命周期在面试中也算是比较高频的考点,那么该如何回答这类问题,让人有眼前一亮的感觉呢... 前端进阶积累.公众号.GitHub Vue-Router导航守卫: 有的时候,我们需要通过路由来进行一些操作,比如最常见的登录权限验证,当用户满足条件时,才让其进入导航,否则就取消跳转,并跳到登录页面让其登录. 为此我们有很多种方法

vue 导航守卫,验证是否登录

路由跳转前,可以用导航守卫判断是否登录,如果登录了就正常跳转,没有登录就把路由指向登录页面. router.beforeEach((to, from, next) => { const nextRoute = [ 'api', 'my/index, 'course']; if(nextRoute.indexOf(to.name) >= 0){ //可以在这里面判断是否登录了 if (!store.state.auth.IsLogin) { vueRouter.push({name: 'logi

vue导航守卫

三部分 router(VueRouter实例)守卫 -- 全局路由守卫 router守卫 -- 路由守卫 component守卫 -- 组件守卫 const router = new Router({}) router.beforeEach(function (to,from,next) {} // export default router router.beforeEach(function (to,from,next) { // console.log(to,from) if(to.nam

vue-router导航守卫(router.beforeEach())的使用

好久没写一些东西了,总是感觉有啥缺少的.~~~~恰好碰到最近在写一个移动端项目,遇到了如何使同一个链接在不同条件下跳转到不同路由组件问题,譬如大家经常看到手机中没登录跳转登录页,登陆后跳转个人信息页等.废话不多说了,直接上图: 这是没登录状态,点击下面mine按钮跳转至登录页 这个是我登录了自己的账号后,再次点击mine按钮会跳转至个人信息页面 好了,看到了这个效果今天咱们来实现下 实现方法 我们点击下面mine按钮其实是路由跳转,所以我们需要在跳转路由之前做一个判断,根据不同的条件让这个链接跳

vue之路由导航守卫-全局前置守卫

一.使用方式 全局前置守卫用于在路由配置生效之前进行一些动作,可以使用 router.beforeEach 注册一个全局前置守卫: const router = new VueRouter({ ... }) router.beforeEach((to, from, next) => { // ... }) 参数: to: Route: 即将要进入的目标 路由对象 from: Route: 当前导航正要离开的路由 next: Function: 一定要调用该方法来 resolve 这个钩子.执行效

VUE—路由(四)导航守卫&动态路由

1.在个人中心中做个表单,当表单中有内容时,跳转到其他页面做个提醒 除了beforeRouteLeave在组件中还有其他路由函数,统称导航守卫 2.当从个人中心跳到学术讨论的时候,学术讨论页面也知道跳转进来了,这个函数叫beforeRouteEnter 原文地址:https://www.cnblogs.com/tianya-guoke/p/11509461.html

vue-router有哪几种导航钩子( 导航守卫 )?

问题一:vue-router有哪几种导航钩子( 导航守卫 )? 1.全局守卫: router.beforeEach 2.全局解析守卫: router.beforeResolve 3.全局后置钩子: router.afterEach 4.路由独享的守卫: beforeEnter 5.组件内的守卫: beforeRouteEnter.beforeRouteUpdate (2.2 新增).beforeRouteLeave 导航表示路由正在发生改变,vue-router 提供的导航守卫主要用来:通过跳转