您的位置:

VueRouter的使用技巧和最佳实践

Vue.js 是一款轻量级MVVM框架,可以帮助我们非常方便的构建单页应用,而 Vue Router 可以帮助我们实现单页应用的路由功能。

一、路由基础

1、创建Router实例

在使用Vue Router 之前,我们需要先创建一个Router实例。在main.js文件中引入Vue和Vue Router,并使用use()方法安装插件

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

Vue.use(VueRouter)

const router = new VueRouter({
    routes: [...] // 路由配置
})

代码解释:

  • 首先我们需要引入Vue和VueRouter
  • 然后调用Vue.use()方法安装VueRouter插件
  • 创建一个VueRouter实例,并传递routes参数,routes是一个路由配置数组,包含多个路由对象配置
  • 在最后导出VueRouter实例,以便在其他地方使用

2、路由配置

在创建Router实例的时候,我们需要配置routes参数。routes是一个路由配置数组,包含多个路由对象配置

const routes = [
  {
    path: '/home',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    component: About
  }
]

代码解释:

  • 我们定义了2个路由对象,即 /home 和 /about
  • 每个路由对象包含3个属性:path、name和component
  • path代表路由路径,name代表路由名称,component代表路由要渲染的组件

3、路由嵌套

在一些大型的应用中,我们需要使用到路由嵌套,这样能够更好的管理我们的路由配置。Router 嵌套还可以实现多人协同作业,路由规则按组或模块分开,不同的人维护不同的文件,避免人为冲突。

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home,
    children: [
      {
        path: 'profile',
        name: 'Profile',
        component: Profile
      },
      {
        path: 'dashboard',
        name: 'Dashboard',
        component: Dashboard
      }
    ]
  }
]

代码解释:

  • 在主路由下,我们添加了children数组,包含两个子路由
  • 每个子路由不再以/开头,而是以父路由的路径/作为前缀,同时子路由的component也是自己的组件。
  • 比如在这个例子中,子路由的路径就是 /profile 和 /dashboard ,对应的组件是 Profile 和 Dashboard

二、导航

1、跳转到路由

我们可以通过 router-link 标签在 Vue 模板中声明一个链接,使用户跳转到不同的路由。Vue Router 根据 link 的 href 属性自动激活对应的路由,Vue 会自动阻止默认事件的发生,所以不需要使用 v-on:click.prevent

<router-link to="/home">Home</router-link>

代码解释:

  • router-link 是Vue Router 提供的组件,to属性是路由路径,对应的是上文配置的 path 属性

2、编程式导航

我们也可以在代码中进行路由导航,比如跳转到另外一个路由,并且路径可以动态设置。这种方式叫做编程式导航

router.push('/home')

代码解释:

  • 使用 router.push 进行编程式导航,以 /home 为例

3、参数传递

在 Vue Router 中,可以通过在路由路径中加入参数来传递参数。这些参数可以是必须的,也可以是可选的。在路由配置项中,可以通过:来指定参数名,如 /user/:id 中的 :id

const routes = [
  {
    path: '/user/:id',
    name: 'User',
    component: User
  }
]

代码解释:

  • 在路由配置中,我们使用 /user/:id 定义了一个路由,其中 :id 表示参数
  • 在路由链接中,可以使用 $route.params.id 获取传递的参数
  • 在编程式导航中,可以使用 params 属性传递参数
// links
<router-link :to="'/user/' + user.id">{{ user.name }}</router-link>

// programmatic navigation
this.$router.push({ name: 'User', params: { id: this.userId } })

三、路由钩子

路由钩子就是在路由导航过程中的一些钩子函数,可以控制路由跳转、路由数据变化等方面的行为

1、全局前置守卫

全局前置守卫是在路由导航之前调用的,可以用于身份验证,日志记录等。多个全局前置守卫会按照注册顺序依次执行

router.beforeEach((to, from, next) => {
  // to 和 from 都是路由对象
  // to 是导航到的路由对象
  // from 是导航来源的路由对象
  // next 是一个函数,调用该函数,才会执行导航操作
  if (to.matched.some(record => record.meta.requiresAuth)) {
    // 判断是否需要身份验证,未登录则跳转到登录页
    if (!auth.loggedIn()) {
      next({
        path: '/login',
        query: { redirect: to.fullPath }
      })
    } else {
      next()
    }
  } else {
    next() // 不需要身份验证
  }
})

代码解释:

  • 在全局前置守卫中,我们可以根据 to 和 from 来判断是否需要身份验证
  • 如果需要身份验证,且未登录,则跳转到登录页面,可以使用 next({path: '/login'}) 转到登录页面
  • 如果不需要身份验证,直接调用 next()

2、全局后置钩子

全局后置钩子是在路由导航之后调用的,无法取消导航行为,也无法控制路由跳转。只能接收到路由导航的成功或失败。

router.afterEach((to, from) => {
  // to 和 from 都是路由对象
  // 这里可以添加一些日志记录等操作
})

3、组件内路由钩子

除了全局路由钩子,Vue Router 还提供了多个组件内的路由钩子函数,它们是定义在组件内部的方法,可以在特定组件内使用

export default {
  beforeRouteEnter (to, from, next) {
    // 在路由进入该组件前调用
    // 无法访问组件实例 this
    next() // 通过调用next()执行路由操作
  },

  beforeRouteUpdate (to, from, next) {
    // 在当前组件重新渲染时调用
    // 可以访问组件实例 this
    next()
  },

  beforeRouteLeave (to, from, next) {
    // 在路由离开该组件时调用
    // 可以访问组件实例 this
    next()
  }
}

四、代码拆分

在一个单页应用中,随着应用变得越来越大,JS 文件也会越来越大,这时候我们可以将不同的路由拆分成不同的代码块,仅在需要的时候再加载对应的组件。

const Home = () => import('./views/Home.vue')
const About = () => import('./views/About.vue')

const routes = [
  {
    path: '/home',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    component: About
  }
]

代码解释:

  • 在路由组件中使用动态导入语法,即使用 () => import(...) 的方式导入组件,在需要的时候才会加载。

结语

以上是关于VueRouter使用技巧和最佳实践的详细阐述,包括路由基础、导航、路由钩子、代码拆分等方面。通过灵活使用VueRouter,能够让我们更好的构建单页应用。