vue监控路由页面变化

vue yekong

在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>

使用这些守卫,你可以在路由变化时执行所需的操作。全局守卫适用于所有路由,而路由独享守卫和组件内守卫则可以针对特定的路由或组件来设置。

喜欢