/search/$ {this.keyword}?k= $ {this.keyword}) 这种模板字符串 的形式。
这里得先在路由路径中使用/:keyword进行占位,在后面加一个问号表示可传可不传:/:keyword?

其中k使用query的方式传递参数的,k是一个变量名自己定义的,使用的方式就是"?变量名"=要传递的参数
params传递参数的方式是/要传递的参数






路由导航的两种形式:声明式导航、编程式导航。

解决办法:在你使用编程式导航$router.push中加两个回调函数解决报错,并且可以打印出错误提示:
给出我的例子:
this.$router.push({name:'search',params:{keyword:this.keyword||undefined},query:{k:this.keyword.toUpperCase()}},()=>{},(err)=>{
console.log(err.message)
})
效果图:

但是这个方法治标不治本,因为你这个只能解决当前的这个组件中不报错,其他的组件还是会报错,难道每一次都要写的那么复杂吗?
具体可见尚硅谷的尚品汇课程第10集10分钟左右。
治标:
//重写push或replace
//第一个参数:告诉原来的push方法,你往哪里跳(传递哪些参数)
let originPush =VueRouter.prototype.push;
VueRouter.prototype.push=function(location,resolve,reject){
if(resolve&&reject){//resolve和reject都有值,也就是执行成功了,直接调用原来的方法就可以了
originPush.call(this,location,resolve,reject);
}else{//否则自定义一个方法,包含两个回调函数
originPush.call(this,location,()=>{},()=>{})
}
}
//重写replace回调
let originReplace =VueRouter.prototype.replace;
VueRouter.prototype.replace=function(location,resolve,reject){
if(resolve&&reject){//resolve和reject都有值,也就是执行成功了,直接调用原来的方法就可以了
originReplace.call(this,location,resolve,reject);
}else{//否则自定义一个方法,包含两个回调函数
originReplace.call(this,location,()=>{},()=>{})
}
}
具体可见尚硅谷的尚品汇课程第10集21分钟左右
必须要等到组件已经有了页面结构和数据后swiper才能够产生作用,因为swiper本身就是要遍历页面结构产生效果,可以使用watch加$nextTick解决这个问题。但是在父传子中没有这个问题,因为此时页面结构已经渲染好了,数据也是通过父串子的。所以就没有这个问题。