vue 三种路由守卫

Vue 路由守卫允许你在路由导航过程中对路由进行拦截和控制,这对于进行权限验证、数据预加载等任务非常有用。Vue Router 提供了三种类型的路由守卫:全局前置守卫、路由独享守卫和组件内的守卫。

全局前置守卫:

import Vue from 'vue';
import VueRouter from 'vue-router';

Vue.use(VueRouter);

// 假设这是你的用户角色
const user = {
  isAdmin: true
};

// 创建组件
const Home = { template: '<div>Home</div>' };
const Admin = { template: '<div>Admin</div>' };

// 创建路由实例
const router = new VueRouter({
  routes: [
    { path: '/', component: Home },
    { path: '/admin', component: Admin, meta: { requiresAdmin: true } }
  ]
});

// 全局前置守卫,用于权限控制
router.beforeEach((to, from, next) => {
  // 检查路由是否需要管理员权限
  if (to.matched.some(record => record.meta.requiresAdmin)) {
    // 如果用户是管理员,放行
    if (user.isAdmin) {
      next();
    } else {
      // 否则重定向到首页或者其他页面
      next('/');
    }
  } else {
    next();
  }
});

// 创建 Vue 实例并挂载到 #app 元素
new Vue({
  router,
  el: '#app'
});

在这个例子中,我们创建了两个简单的组件:Home 和 Admin。我们设置了一个路由 /admin,并且为它添加了一个 meta 属性 { requiresAdmin: true },表示这个路由需要管理员权限才能访问。

然后我们使用 router.beforeEach 创建了一个全局前置守卫,每次路由导航之前都会执行这个守卫。在守卫函数中,我们检查要跳转的路由是否需要管理员权限,如果需要并且当前用户不是管理员,我们就会重定向到首页 /

这样,我们就实现了一个简单的权限控制。当用户试图访问管理员页面时,如果他不是管理员,就会被重定向到首页;如果是管理员,就可以正常访问。



路由独享守卫:

import Vue from 'vue';
import VueRouter from 'vue-router';

Vue.use(VueRouter);

// 假设这是你的用户角色
const user = {
  isAdmin: true
};

// 创建组件
const Home = { template: '<div>Home</div>' };
const Admin = { template: '<div>Admin</div>' };

// 创建路由实例
const router = new VueRouter({
  routes: [
    { path: '/', component: Home },
    { path: '/admin', component: Admin, meta: { requiresAdmin: true }, beforeEnter: requireAdmin }
  ]
});

// 路由独享守卫,用于权限控制
function requireAdmin(to, from, next) {
  // 如果用户是管理员,放行
  if (user.isAdmin) {
    next();
  } else {
    // 否则重定向到首页或者其他页面
    next('/');
  }
}

// 创建 Vue 实例并挂载到 #app 元素
new Vue({
  router,
  el: '#app'
});

在这个修改后的示例中,我们为 /admin 路由添加了 beforeEnter 属性,这是一种路由独享的守卫。它的作用与全局前置守卫类似,但只应用于特定的路由。在这个示例中,我们将 requireAdmin 函数指定为 beforeEnter 守卫,用于检查用户是否是管理员。

组件内的守卫:

// 在你的组件定义中
export default {
  data() {
    return {
      formData: {
        // 表单数据
      },
      formChanged: false
    };
  },
  methods: {
    // 保存表单数据的方法
    saveForm() {
      // 这里实现保存表单数据的逻辑
      this.formChanged = false;
    }
  },
  beforeRouteLeave(to, from, next) {
    // 如果表单数据发生了更改,弹出确认框
    if (this.formChanged) {
      const answer = window.confirm('您有未保存的更改。确定要离开吗?');
      if (answer) {
        // 用户确认离开,直接离开
        next();
      } else {
        // 用户取消离开,停留在当前页面
        next(false);
      }
    } else {
      // 表单数据没有更改,直接离开
      next();
    }
  }
};

在这个示例中,我们定义了一个组件,其中包含一个表单和一个 formChanged 数据属性,用于跟踪表单数据是否发生了更改。在 beforeRouteLeave 守卫中,我们检查 formChanged 属性。如果表单数据发生了更改,我们弹出一个确认框询问用户是否确定离开。根据用户的选择,我们使用 next() 方法来允许或阻止路由的导航。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue Router 提供了路由守卫来控制页面的访问权限。在 Vue 3 中,路由守卫的使用方式与 Vue 2 有一些不同。 在 Vue 3 中,我们可以使用 `beforeRouteEnter`、`beforeRouteUpdate` 和 `beforeRouteLeave` 这三个路由守卫来进行页面导航的控制。 - `beforeRouteEnter`:在进入路由之前调用,可以访问组件实例 (`this`),但是此时组件实例还未被创建,因此无法访问组件的实例属性和方法。 - `beforeRouteUpdate`:在当前路由改变,但是该组件被复用时调用,可以访问组件实例 (`this`),可以根据新的路由参数来更新组件数据。 - `beforeRouteLeave`:在离开当前路由之前调用,可以访问组件实例 (`this`),可以进行一些离开前的确认操作。 下面是一个使用路由守卫的示例: ```javascript import { createRouter, createWebHistory } from 'vue-router'; const router = createRouter({ history: createWebHistory(), routes: [ { path: '/home', component: Home, beforeEnter: (to, from, next) => { // 在进入 /home 路由之前执行的逻辑 // 可以在这里进行权限判断等操作 next(); } }, { path: '/profile', component: Profile, beforeEnter: (to, from, next) => { // 在进入 /profile 路由之前执行的逻辑 // 可以在这里进行权限判断等操作 next(); } } ] }); ``` 在上面的示例中,我们定义了两个路由 `/home` 和 `/profile`,并分别为它们设置了 `beforeEnter` 路由守卫。在 `beforeEnter` 中,我们可以根据需要进行权限判断等操作,并通过调用 `next()` 方法来继续导航。 注意,这里的示例只涉及到了全局前置守卫,还有其他类型的守卫,如组件内的守卫和全局后置守卫等。你可以根据具体需求选择使用不同类型的守卫来实现路由控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值