在路由文件中定义全局钩子,在组件内定义组件内的钩子,运行观察各种路由钩子的执行顺序。
一. 路由文件
//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