在Vue中监控路由页面变化,通常是指监听路由的变化来执行某些操作,比如数据的更新、页面标题的改变或者执行页面跳转前的权限校验等。Vue Router提供了导航守卫(Navigation Guards)来帮助你实现这些功能。
以下是几种常见的路由变化监控方式:
全局导航守卫
你可以在路由实例上设置全局前置守卫或全局后置钩子:
// router.js 或 router/index.js
import Vue from 'vue';
import VueRouter from 'vue-router';
Vue.use(VueRouter);
const router = new VueRouter({
// ... 路由配置
});
// 全局前置守卫
router.beforeEach((to, from, next) => {
// 执行一些操作,比如检查用户登录状态
// ...
next(); // 确保要调用next()方法,否则钩子就不会被resolved
});
// 全局后置钩子
router.afterEach((to, from) => {
// 比如改变页面标题
document.title = to.meta.title || '默认标题';
});
export default router;
路由独享的守卫
你也可以在路由配置中直接定义beforeEnter
守卫:
const routes = [
{
path: '/foo',
component: Foo,
beforeEnter: (to, from, next) => {
// 只有/foo路由会被这个守卫拦截
// ...
next();
}
},
// ... 其他路由
];
组件内的守卫
还可以在组件内部直接定义一些守卫:
<template>
<!-- 组件模板 -->
</template>
<script>
export default {
beforeRouteEnter(to, from, next) {
// 在渲染该组件的对应路由被confirm前调用
// 不!能!获取组件实例 `this`
// 因为当守卫执行前,组件实例还没被创建
next();
},
beforeRouteUpdate(to, from, next) {
// 在当前路由改变,但是该组件被复用时调用
// 举例来说,对于一个带有动态参数的路径 /foo/:id,在/foo/1和/foo/2之间跳转的时候,
// 由于会渲染同样的Foo组件,因此组件实例会被复用。而这个钩子就会在这种情况下被调用。
// 可以访问组件实例 `this`
next();
},
beforeRouteLeave(to, from, next) {
// 导航离开该组件的对应路由时调用
// 可以访问组件实例 `this`
next();
}
}
</script>
使用这些守卫,你可以在路由变化时执行所需的操作。全局守卫适用于所有路由,而路由独享守卫和组件内守卫则可以针对特定的路由或组件来设置。