router编程式导航(push-replace)及同一事件触发多次路由跳转报错

目录

一、路由跳转

二、push与replace的区别

三、路由传参(name-path)

四、多次路由跳转报错


一、路由跳转

1. 声明式导航

格式:< router-link :to = “…” >

2. 编程式导航

格式:< router.push(…) > // 该方法的参数可以是一个字符串路径,或者一个描述地址的对象。

二、push与replace的区别

1. push:

  • 跳转到指定URL,向history栈添加一个新的纪录,点击后退会返回至上一个页面。

2. replace:

  • 跳转到指定的URL,替换history栈中最后一个记录,点击后退会返回至上一个页面。(A-->B-->C 结果B被C替换 A-->C)
  • 设置replace属性(默认值:false)的话,当点击时,会调用router.replace(),而不是router.push(),于是导航后不会留下history记录。即使点击返回按钮也不会回到这个页面。加上replace: true时,它不会向 history 添加新纪录,而是跟它的方法名一样——替换当前的history记录。

三、路由传参(name-path)

push和replace都用两种方式进行传参(name或者path) 格式如下:

1. name

push({

    name: '命名路由',

    params: {      

        key:value

    },

    query: {

        key:value

    }

})

2. path     只能query

push({

    path:'/路径',

    query: {

        key:value

    }

})

上面是以对象形式进行跳转和传参,而字符串和模板字符串的形式进行跳转,书写不方便,并不推荐

 具体使用方法,看看下面的例子:

 handleRouter(id){
         //方法一:
         this.$router.push({
                name: 'Detail',
                params:{
                    myid: id,
                },

                /*或者query: {
                    myid: id
                }*、
            }) 

             //方法二:
            /*this.$router.push({
                path:'/detail',
                query:{
                    myid: id,
                }
            })  */    
        } 

name和path两种方法,其路由配置也不同:

 // 对应方法一:
    {
        path:'/detail/:myid?', 
        name:'Detail',
        component: Detail
    },

    // 对应方法二
   /*  {
     path: '/detail',
     component: Detail,
    }, */

 注意:push以name方式跳转时,params的key值,需和路由配置中该路径上的占位符一致。

两种传参的区别:

name:

  • 能进行params和query传参
  • 路由需要配置 “命名路由”,path路径需要跟占位符
  • params:{key:value}中key值需要跟路由中占位符名一致
  • query没有key值限制

注意后面跟? 表示路由跳转时,可以不用传参。

path:

  • 只能进行query传参 , params传参无效
  • 路由不需要配置 命名路由、占位符

四、多次路由跳转报错

编程式导航有个问题,在vue-router:"^3.5.3" 引入promise,如果用上面push方式进行路由跳转,同一个事件触发多次会报错

handleRouter(val){
  let a =this.$router.push({
    name: 'home',
    params: {
      title: val
    }
  })
  console.log(a)   //promise
}

解决方法:传入两个函数,分别对应resolve,rejust

push( { path(name):'/路径', query:{key:value} },()=>{},()=>{} )  

 设想每次调用push,都要传入两个函数,很麻烦。 如果传与不传都不报错岂不快哉 ,那就需要重写push方法了

思路分析:

通过 console.log(this.$router) 发现它是个VueRouter对象,说明this.$router是VueRouter类的实例,push方法是在原型对象中

 所以我们要在VueRouter实例化时,重写push方法(那就是在router路由文件中重写)

// 在路由配置文件
improt Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)

// 先把VueRouter原型对象的push,保存一份
let originPush = VueRouter.prototype.push

// 重写push方法

//@parame:location 跳转路径相关参数

VueRouter.prototype.push = function(location,resolve,resolve){
        if (resolve || resolve) {
          // originPush原本指向window
          originPush.call(this,location,resolve,resolve)
        } else {
          originPush.call(this,location,()=>{},()=>{})
        }
}
// 引入组件
......
exprot defalt new VueRouter({
  // 配置路由
  ......
})

这样我们就可以不参两个函数,实现一劳永逸了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,可以非常方便的实现单页面应用程序的路由功能。 Vue Router 提供了以下两种方实现页面路由跳转: 1. 声明导航:通过 `<router-link>` 组件实现页面跳转,该组件会被渲染成一个 `<a>` 标签,点击该标签后会触发路由跳转。 2. 编程导航:通过 `$router` 对象提供的方法实现页面跳转,例如 `$router.push()`、`$router.replace()`、`$router.go()` 等方法。 下面我们来看一个简单的示例,在 Vue Router 中如何实现页面路由跳转: ```html <!-- 在模板中使用 router-link 组件 --> <router-link to="/home">Home</router-link> <!-- 在组件中使用 $router 对象实现编程导航 --> <button @click="$router.push('/about')">About</button> ``` 在上面的示例中,我们分别演示了如何使用 `<router-link>` 组件和 `$router` 对象实现页面路由跳转,其中 `to` 属性表示跳转的目标路由地址。 此外,Vue Router 还支持路由嵌套的功能,可以通过嵌套路由的方实现页面的嵌套展示。下面我们来看一个嵌套路由的示例: ```javascript const router = new VueRouter({ routes: [ { path: '/home', component: Home, children: [ { path: 'news', component: News }, { path: 'videos', component: Videos } ] } ] }) ``` 在上面的示例中,我们定义了一个名为 `Home` 的路由组件,并在该组件中嵌套了两个子路由 `News` 和 `Videos`,这样就可以实现在 `Home` 组件中展示新闻和视频内容的功能。在实际开发中,我们可以根据实际需求来定义不同的路由组件和子路由,实现灵活的页面嵌套效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值