编程式路由导航是指不通过<router-link>创建<a>标签来定义导航链接,而是借助路由组件实例中的$router实例,通过编写代码来实现路由导航。

使用编程式路由导航,可以让路由的跳转方式变得更加灵活。


两种导航方式

$router也有与<router-link>相同两种导航方式,分别是pushreplace。这两种方式分别调用两个不同的API,不过这两个API的使用方式是一致的。并且他们传入的参数与<router-link>to props的值一样,可以传入两种类型的参数。

  • $router.push()

    this.$router.push('/user/zhangsan')
    
    router.push({
      name: 'user', 
      params: { 
        name: 'zhangsan' 
      } 
    })
    
  • $router.replace()

    this.$router.replace('/user/zhangsan')
    
    router.replace({
      name: 'user', 
      params: { 
        name: 'zhangsan',
      }
    })
    

一般情况下,pushreplace的区别是,replace模式不会向history添加新记录。

$router.push()可以在配置对象中加入一个replace:true,起到与$router.replace()相同的效果:

router.push({
  path: '/user/zhangsan', 
  replace: true,
})
// 相当于
router.replace({
  path: '/user/zhangsan', 
})

移动历史记录

$router还封装了一些用于操作当前应用历史浏览记录的API:

  • $router.forward():向前移动一条记录。

  • router.back():回退上一条记录。

  • $router.go(n):携带一个整数类型的参数,用于在历史堆栈中前进后退$n$步(类似于window.history.go(n))。

    • 当$n$为正整数时,在历史堆栈中前进$n$步。
    • 当$n$为负整数时,在历史堆栈中后退$|n|$步。
    • 如果移动的步数超过历史堆栈的长度($|n|$过大),那么移动静默失败。

    例如:

    • $router.go(1):向前移动一条记录。与$router.forward()相同。
    • $router.go(-1):回退上一条记录。与$router.back()相同。
    • $router.go(3):向前移动3条记录。