1、全局钩子
你可使用 router.beforeEach
注册一个全局的 before
钩子:session
const router = new VueRouter({ ... }) router.beforeEach((to, from, next) => { // ... })
一样能够注册一个全局的 after
钩子,不过它不像 before
钩子那样,after
钩子没有 next
方法,不能改变导航this
router.afterEach(route => { // ...})
2、某个路由独享的钩子
你能够在路由配置上直接定义 beforeEnter
钩子:spa
const router = new VueRouter({ routes: [ { path: '/foo', component: Foo, beforeEnter: (to, from, next) => { // ... } } ] })
这些钩子与全局 before
钩子的方法参数是同样的code
3、组件内的钩子
最后,你能够在路由组件内直接定义如下路由导航钩子:component
const Foo = { template: `...`, beforeRouteEnter (to, from, next) { // 在渲染该组件的对应路由被 confirm 前调用 // 不能获取组件实例 `this` // 由于当钩子执行前,组件实例还没被建立 }, beforeRouteUpdate (to, from, next) { // 在当前路由改变,可是该组件被复用时调用 // 举例来讲,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候, // 因为会渲染一样的 Foo 组件,所以组件实例会被复用。而这个钩子就会在这个状况下被调用。 // 能够访问组件实例 `this` }, beforeRouteLeave (to, from, next) { // 导航离开该组件的对应路由时调用 // 能够访问组件实例 `this` } }
beforeRouteEnter
钩子 不能 访问 this
,由于钩子在导航确认前被调用,所以即将登场的新组件还没被建立。router
不过,你能够经过传一个回调给 next
来访问组件实例。在导航被确认的时候执行回调,而且把组件实例做为回调方法的参数。blog
beforeRouteEnter (to, from, next) { next(vm => { // 经过 `vm` 访问组件实例 }) }
你能够 在 beforeRouteLeave
中直接访问 this
。这个 leave
钩子一般用来禁止用户在还未保存修改前忽然离开。能够经过 next(false)
来取消导航。内存
同时注意必须有这个next(),至关于一个按钮开启同样。路由
4、路由钩子在实际开发中的应用场景
一、清除当前组件中的定时器开发
当一个组件中有一个定时器时, 在路由进行切换的时候, 可以使用beforeRouteLeave将定时器进行清楚, 以避免占用内存:
beforeRouteLeave (to, from, next) { window.clearInterval(this.timer) //清除定时器 next() }
二、当页面中有未关闭的窗口, 或未保存的内容时, 阻止页面跳转
若是页面内有重要的信息须要用户保存后才能进行跳转, 或者有弹出框的状况. 应该阻止用户跳转
beforeRouteLeave (to, from, next) { //判断是否弹出框的状态和保存信息与否 if (this.dialogVisibility === true) { this.dialogVisibility = false //关闭弹出框 next(false) //回到当前页面, 阻止页面跳转 }else if(this.saveMessage === false) { //弹出警告 next(false) //回到当前页面, 阻止页面跳转 }else { next() //不然容许跳转 } }
三、保存相关内容到Vuex中或Session中
当用户须要关闭页面时, 能够将公用的信息保存到session或Vuex中
beforeRouteLeave (to, from, next) { localStorage.setItem(name, content); //保存到localStorage中 next() }