📜  程序化导航 vue 路由器 - Javascript (1)

📅  最后修改于: 2023-12-03 14:56:35.886000             🧑  作者: Mango

程序化导航 Vue 路由器 - Javascript

程序化导航是指通过代码来控制路由器的导航。在Vue.js中,我们可以使用Vue Router来实现程序化导航。本文将介绍Vue Router的基础知识,并讲解如何通过代码来控制路由器的导航。

Vue Router基础知识

Vue Router是Vue.js官方的路由管理插件,它可以帮助我们实现单页面应用程序(SPA)中的路由功能。Vue Router提供了一些核心概念,包括路由、路由路径、路由组件和路由导航守卫。

路由

路由是指根据URL地址匹配到的组件。在Vue Router中,我们需要定义每个路由对应的路由路径和组件。

路由路径

路由路径指的是匹配到该路由所需要的URL地址。在Vue Router中,路由路径可以是一个字符串或者一个正则表达式。路由路径可以通过$route对象来访问。

路由组件

路由组件是指与路由路径相匹配的Vue组件。在Vue Router中,我们需要为每个路由路径指定一个对应的Vue组件。

导航守卫

路由导航守卫是指在路由变化时触发的钩子函数。Vue Router提供了多个导航守卫,包括全局导航守卫、路由独享的导航守卫和组件内的导航守卫。

程序化导航

程序化导航是指通过代码来控制Vue Router的路由导航。在Vue.js中,我们可以通过$router对象来实现程序化导航。

基础路由导航

基础路由导航是指通过$router.push()方法来进行路由导航。这个方法会让路由器跳转到指定的路由路径。如果该路径与当前路径相同,则不会进行跳转。

// 使用 $router.push() 方法进行路由导航
this.$router.push('/path')

在上面的代码中,我们使用了$router.push()方法来进行路由导航。我们传入的参数是一个路由路径字符串,$router.push()方法会让路由器跳转到该路径。

路由传参

有时候我们需要传递一些参数给路由组件。在Vue Router中,我们可以通过props属性来传递参数。

// 路由传参
this.$router.push({ name: 'path', params: { id: 123 }})

在上面的代码中,我们使用了$router.push()方法来进行路由导航。我们传入的参数是一个对象,其中name属性是路由的名称,params属性是一个对象,其中包含了我们要传递的参数。

带查询参数的路由

通过路由传参的方式,我们只能传递简单的数据类型。如果需要传递一个复杂的参数对象,我们可以使用查询参数来实现。在Vue Router中,我们可以通过$router.push()方法的query属性来传递查询参数。

// 带查询参数的路由
this.$router.push({ path: '/path', query: { name: 'Tom', age: 18 }})

在上面的代码中,我们使用了$router.push()方法来进行路由导航。我们传入的参数是一个对象,其中path表示路由路径,query属性是一个对象,其中包含了我们要传递的查询参数。

导航守卫

路由导航守卫可以让我们在路由变化时执行一些逻辑操作。在Vue Router中,我们可以使用全局导航守卫、路由独享的导航守卫和组件内的导航守卫。

全局导航守卫

全局导航守卫会在每次路由导航时执行。Vue Router提供了三个全局导航守卫:beforeEach、beforeResolve和afterEach。这三个导航守卫的使用方法都很相似,只是在执行时机上有所不同。

// 全局导航守卫
const router = new VueRouter({ ... })

router.beforeEach((to, from, next) => {
  console.log('跳转前')
  next()
})

router.beforeResolve((to, from, next) => {
  console.log('解析完毕')
  next()
})

router.afterEach((to, from) => {
  console.log('跳转后')
})

在上面的代码中,我们使用了全局导航守卫。我们在跳转前、解析完毕和跳转后执行了一些逻辑操作。在导航守卫中,我们可以添加一些逻辑判断逻辑,例如判断用户是否有权限跳转到该路由。

完整代码

下面是一个完整的Vue Router程序化导航的代码示例:

<template>
  <div>
    <button @click="goPath">跳转到路径</button>
    <button @click="goName">跳转到名称</button>
  </div>
</template>

<script>
export default {
  methods: {
    goPath() {
      this.$router.push('/path')
    },
    goName() {
      this.$router.push({ name: 'path', params: { id: 123 }})
    }
  },
  created() {
    this.$router.beforeEach((to, from, next) => {
      console.log('跳转前')
      next()
    })

    this.$router.beforeResolve((to, from, next) => {
      console.log('解析完毕')
      next()
    })

    this.$router.afterEach((to, from) => {
      console.log('跳转后')
    })
  }
}
</script>

在上面的代码中,我们定义了一个包含两个按钮的Vue组件,通过按钮来实现不同的路由导航。我们在创建组件时,添加了全局导航守卫,在跳转前、解析完毕和跳转后执行了一些逻辑操作。