VUE--导航守卫触发顺序

307 阅读1分钟

在路由文件中定义全局钩子,在组件内定义组件内的钩子,运行观察各种路由钩子的执行顺序。

一. 路由文件

//index.js

import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    redirect: '/home'
  },
  {
    path: '/home',
    name: 'home',
    component: Home,
    beforeEnter: (to, from, next) => {
      console.log('路由表:before Enter Home')
      next()
    },
  },
  {
    path: '/foo/:id',
    name: 'foo',
    component: () => import('../views/Foo.vue'),
    beforeEnter: (to, from, next) => {
      console.log('路由表:before Enter Foo')
      next()
    },
  }
]

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})

router.beforeEach((to, from, next) => {
  console.log('全局:beforeEach')
  next()
})
router.afterEach((to, from) => {
  console.log('全局:afterEach')
})
router.beforeResolve((to, from, next) => {
  console.log('全局:beforeResolve')
  next()
})

export default router

二. 组件一

// Home.vue

<template>
  <div class="home">
    <router-link to="/foo/123">foo</router-link>
  </div>
</template>


<script>
export default {
  name: 'Home',
  created () {
    console.log('home created')
  },
  beforeRouteEnter (to, from, next) {
    console.log('组件内:beforeRouteEnter Home')
    next()
  },
  beforeRouteUpdate (to, from, next) {
    console.log('组件内:beforeRouteUpdate Home')
    next()
  },
  beforeRouteLeave (to, from, next) {
    console.log('组件内:beforeRouteLeave Home')
    next()
  }
}
</script>

三. 组件二

// Foo.vue

<template>
  <div class="about">
    <h1>This is foo page</h1>
    <router-link to="/home">home</router-link>
    <router-link to="/foo/123">foo1</router-link>
    <router-link to="/foo/456">foo2</router-link>
  </div>
</template>
<script>
export default {
  created () {
    console.log('foo created')
  },
  beforeRouteEnter (to, from, next) {
    console.log('组件内:beforeRouteEnter Foo')
    next()
  },
  beforeRouteUpdate (to, from, next) {
    console.log('组件内:beforeRouteUpdate Foo')
    next()
  },
  beforeRouteLeave (to, from, next) {
    console.log('组件内:beforeRouteLeave Foo')
    next()
  }
}
</script>

四. 运行结果

  • 第一次加载 /home 打印顺序:

    全局:beforeEach

    路由表:before Enter Home

    组件内:beforeRouteEnter Home

    全局:before resolve

    全局:afterEach

    home created

  • 从 /home 进入 /foo/123 打印顺序:

    组件内:beforeRouteLeave Home

    全局:beforeEach

    路由表:before Enter Foo

    组件内:beforeRouteEnter Foo

    全局:before resolve

    全局:afterEach

    foo created

  • 从 /home/123 到 /home/456 打印顺序:

    全局:beforeEach

    组件内:beforeRouteUpdate Foo

    全局:before resolve

    全局:afterEach