详解Vue中的路由与多种守卫

详解Vue中的路由与多种守卫

在Vue中,路由是前端开发中非常重要的一个概念,它提供了页面之间切换的功能。而在实际开发中,为了更好的控制页面的访问权限和交互行为,我们需要使用路由守卫来进行相关的操作。

路由的基本概念

在Vue中,使用Vue Router来进行路由的管理。Vue Router是Vue.js官方提供的路由管理器,可以实现页面跳转、路由拦截等功能。

路由配置

首先,我们需要在路由文件中配置路由信息,以便Vue Router管理页面跳转。以下是一个示例:

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

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    redirect: '/home'
  },
  {
    path: '/home',
    component: () => import('../views/home.vue')
  },
  {
    path: '/about',
    component: () => import('../views/about.vue')
  }
]

const router = new VueRouter({
  routes
})

export default router
  • path: 页面路由路径,可以是字符串或者正则表达式。
  • redirect: 路由重定向,如果用户访问了重定向的路由,Vue Router会把请求重定向到目标路由。
  • component: 路由对应的组件。

路由跳转

在Vue中,使用router-link进行跳转,以下是一个示例:

<router-link to="/home">Home页面</router-link>
<router-link to="/about">About页面</router-link>

在页面中使用router-link组件,可以实现路由跳转,指定to属性为目标路由的path。

路由参数

在实际开发中,页面常常需要根据不同的参数展示不同的内容。在路由中,可以使用参数进行动态路由匹配。

以下是一个动态路由匹配的示例:

{
  path: '/user/:id',
  component: () => import('../views/user.vue'),
}

在上面的路由例子中,:id就是动态路由参数,可以通过$route.params.id来获取。

路由钩子函数

在路由跳转的过程中,我们可以使用路由钩子函数来进行一些自定义操作。Vue Router提供了三种路由钩子函数:

  • 全局守卫
  • 路由独享守卫
  • 组件内守卫

全局守卫

全局守卫会对所有路由进行拦截,可以在路由跳转前后进行一些操作,例如验证用户是否登录等。

以下是一个全局守卫的示例:

const router = new VueRouter({
  routes
})

router.beforeEach((to, from, next) => {
  // to: 即将要进入的目标路由对象
  // from: 当前导航即将离开的路由对象
  // next: 进入到目标路由之前执行的函数,next()表示继续执行路由,next(false)表示中断当前路由,next('/')表示跳转到指定路由

  if (to.path === '/login') {
    next()
  } else {
    const token = sessionStorage.getItem('token')
    if (!token) {
      next('/login')
    } else {
      next()
    }
  }
})

在上面的例子中,我们通过router.beforeEach()注册了一个全局前置守卫,通过to对象获取到目标路由的path,判断如果是登录路由则放行,否则检查用户是否登录,未登录则跳转到登录页面。

路由独享守卫

路由独享守卫只作用于某个路由,可以在该路由跳转前后进行一些操作,例如页面访问权限校验等。

以下是一个路由独享守卫的示例:

{
  path: '/admin',
  component: () => import('../views/admin.vue'),
  beforeEnter: (to, from, next) => {
    const token = sessionStorage.getItem('token')
    if (!token) {
      next('/login')
    } else {
      next()
    }
  }
}

在上面的路由例子中,我们通过beforeEnter属性来定义路由独享守卫,通过to对象获取到目标路由的path,判断用户是否登录,未登录则跳转到登录页面。

组件内守卫

组件内守卫只作用于当前组件,可以在该组件跳转前后进行一些操作,例如表单信息未保存提示等。

以下是一个组件内守卫的示例:

export default {
  data() {
    return {
      formData: {}
    }
  },
  beforeRouteLeave(to, from, next) {
    if (this.$route.meta.dirty) { // 如果表单信息有修改
      if (confirm('表单信息尚未保存,确定要离开页面吗?')) {
        next()
      } else {
        next(false) // 中断当前路由
      }
    } else {
      next()
    }
  }
}

在组件内使用beforeRouteLeave钩子函数来定义组件内守卫,如果表单信息有修改,弹出确认框提示用户是否离开页面,如果用户点击确定则继续路由跳转,否则中断路由跳转。

示例说明

示例1

在公司内部系统中,只有管理员才能访问管理员页面。以下是一个路由独享守卫的示例代码:

{
  path: '/admin',
  component: () => import('../views/admin.vue'),
  beforeEnter: (to, from, next) => {
    const token = sessionStorage.getItem('token')
    const role = sessionStorage.getItem('role')
    if (!token || role !== 'admin') {
      next('/login')
    } else {
      next()
    }
  }
}

在管理员页面路由中使用beforeEnter属性来定义路由独享守卫,判断用户是否登录和用户角色是否为管理员,若登录且角色为管理员则放行,否则跳转到登录页面。

示例2

在一个新闻编辑页面中,如果用户修改了表单信息但未保存,则在离开页面时提示用户是否离开。以下是一个组件内守卫的示例代码:

export default {
  data() {
    return {
      formData: {},
      dirty: false // 用来记录表单信息是否有修改
    }
  },
  methods: {
    saveData() {
      // 表单信息保存操作
      // ...
      this.dirty = false
    }
  },
  watch: {
    formData() {
      this.dirty = true
    }
  },
  beforeRouteLeave(to, from, next) {
    if (this.dirty) { // 如果表单信息有修改
      if (confirm('表单信息尚未保存,确定要离开页面吗?')) {
        next()
      } else {
        next(false) // 中断当前路由
      }
    } else {
      next()
    }
  }
}

在组件内使用beforeRouteLeave钩子函数来定义组件内守卫,使用dirty变量来记录表单信息是否有修改,在表单信息有修改时弹出确认框提示用户是否离开页面,用户点击确定则继续路由跳转,否则中断路由跳转。保存表单信息时需要将dirty标记为false。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Vue中的路由与多种守卫 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • vscode vue 文件模板的配置方法

    下面我将对“vscode vue 文件模板的配置方法”进行完整的讲解,包括配置步骤、示例说明等内容。 配置方法 打开 VS Code,点击左侧最后一个 扩展 图标,搜索并安装拓展 Vue VSCode Snippets 在 VS Code 中新建一个 .vue 文件 使用快捷键 Ctrl+Shift+P 或者 Cmd+Shift+P 打开命令面板,输入 Pr…

    Vue 2023年5月28日
    00
  • 微信js-sdk地理位置接口用法示例

    下面我会分为几个部分讲解“微信js-sdk地理位置接口用法示例”的完整攻略。 一、前置条件 在使用微信js-sdk地理位置接口之前,需要确保以下几个条件已经满足: 已经在微信公众平台中配置了JS接口安全域名。 已经在页面中引入微信公众平台提供的js文件(如:http://res.wx.qq.com/open/js/jweixin-1.4.0.js)。 已经申…

    Vue 2023年5月28日
    00
  • vue使用技巧及vue项目中遇到的问题

    Vue使用技巧及Vue项目中遇到的问题攻略 一、技巧篇 1. 路由懒加载 路由懒加载可以大幅提高页面加载速度,特别是对于单页面应用程序。可以将异步组件绑定到动态导航。在用户需要更新或者运行应用程序时,将会调度这个组件。项目越大,使用路由懒加载越有必要。 假设我们有如下代码: import Home from ‘../views/Home.vue’ impor…

    Vue 2023年5月27日
    00
  • 在Vue3中使用BabylonJs开发 3D的初体验

    在Vue3中使用BabylonJs开发 3D的初体验 BabylonJs是一个基于WebGL的3D游戏引擎,其强大的性能和灵活的API接口使其成为了前端3D开发的首选之一。本文将介绍如何在Vue3项目中使用BabylonJs进行3D开发,希望对读者有所启发。 步骤1:安装BabylonJs 在Vue项目中使用BabylonJs需要先安装相应的依赖,可以通过n…

    Vue 2023年5月27日
    00
  • vue新手入门出现function () { [native code] }错误的解决方案

    问题背景: 当vue新手在编写Vue的代码时,可能会遇到“function () { [native code] }”错误,这个错误通常是由于代码中调用了未定义的变量或者方法,导致Vue无法正常解析代码,从而引发错误。 解决方案: 要解决这个问题,我们需要检查代码、引入正确的Vue库等多个方面来进行排查,以下是详细解决方案: 检查代码 首先,我们需要从代码中…

    Vue 2023年5月27日
    00
  • vue中如何使用embed标签PDF预览

    下面我来详细讲解“vue中如何使用embed标签PDF预览”的完整攻略。 一、前置条件 在使用embed标签预览PDF文件前,需要先安装Vue CLI工具,同时安装Vue PDF Viewer插件。 二、使用embed标签预览PDF文件的方法 以下是两种使用embed标签预览PDF文件的方法。 方法一:使用第三方组件库 Vue PDF Viewer是一个Vu…

    Vue 2023年5月28日
    00
  • 浅谈如何优雅处理JavaScript异步错误

    当我们在JavaScript中处理异步操作的时候,难免会遇到一些错误,如何优雅地处理这些错误是很重要的。以下是几条有用的攻略: 1. Promise捕获错误 在处理异步任务的时候,我们通常会使用Promise。我们可以通过Promise的catch方法来捕获Promise中的错误,然后进行处理。 fetch(‘https://api.example.com’…

    Vue 2023年5月28日
    00
  • vue 实现在函数中触发路由跳转的示例

    当我们在使用 Vue.js 开发 SPA(单页应用)时,使用路由跳转是必不可少的功能。在函数中触发路由跳转,可以让我们更加灵活地控制页面跳转,满足我们的设计需求。下面是实现这一功能的完整攻略: 创建 Vue 项目并安装所需依赖 我们首先需要创建一个 Vue 项目并在其中安装所需的依赖。可以使用 Vue CLI 快速创建一个项目,然后在项目根目录下运行以下命令…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部