Vue重学之路---------二
9、路由组件的显示与隐藏
在Home、Search显示Footer
在登录注册时隐藏的,消失的
v-if|v-show :v-if操作Dom在节点树上是真有真没有,v-show只是display:none
因为频繁显示隐藏,使用v-show
不推荐的做法:可以使用组件身上的$route获取当前路由信息,通过路由路径判断Footer的显示与隐藏
<Footer v-show="$route.path=='/home'||$route.path=='/search'">Footer>
?
推荐(路由元数据):在配置路由的时候可以添加路由元数据【meta】,路由需要配置对象,它的key不能瞎写乱写
{
path:"/home",
component:Home,
meta:{show:true}
},
10、路由的跳转方式
1、声明式跳转导航
router-link (务必要有to属性)、可以实现路由的跳转
2、编程式跳转
利用的是组件实例的$router.push|replace方法,可以实现路由的跳转。(可以书写一些自己的业务)
11、路由传参
参数的几种写法:
1、parmas参数:属于路径当中的一部分,需要注意,配置路由的时候,需要占位
2、query参数:不属于路由当中的一部分,类似于ajax中的queryString 带?的形式
//路由传参
//1、字符串形式
// this.$router.push('/search/'+this.keyword+"?k="+this.keyword.toUpperCase()) //点击搜索进行页面
//2、模板字符串
//this.$router.push(`/search/${this.keyword}?k=${this.keyword.toUpperCase()}`)
//3、对象 一般使用这种方式,注意需要在router配置的js文件里面配置name
this.$router.push({
name:"search",
params:{keyword:this.keyword},
query:{k:this.keyword.toUpperCase()}
})
}
12、路由传参相关面试题目
1、路由传递参数(对象写法)path是否可以结合params参数一起使用?
答:路由跳转传参的时候,对象的写法可以是name、path形式,但需要注意的是,path这种写法不能与params参数一起使用
2、如何指定parmas参数可传可不传
//配置路由的时候 parmas参数已经占位了,但是路由跳转的时候就不传递,路径(URL)会出现问题
this.$router.push(name:"search",query:{k:"asdas"})
?
//正确解法
//在配置路由的时候在parmas参数后面加上【?】
{
path:"/search/:keyword?", //加上?表示这个params参数可传可不传
component:Search,
meta:{show:true},
name:"search"
},
3、params参数可以传递特可以传递,但是如果传递的是空串如何解决?
//传递空串,路径(URL)会出现问题
//解决方案:使用undifiend解决
this.$router.push({
name:"search",
params:{keyword:''||undifined},
query:{k:this.keyword.toUpperCase()}
})
4、路由组件能不能传递props传递数据
答:可以
//三种写法
1、布尔值写法,在router配置js文件中,只有params参数能够使用props接收,不常用
//传递:使用传递params参数方式传递
{
path:"/search/:keyword?", //加上?表示这个params参数可传可不传
component:Search,
meta:{show:true},
name:"search",
props:true
},
//接收:
props:["keyword"]
?
2、对象写法,在router配置js文件中,不常用
{
path:"/search/:keyword?", //加上?表示这个params参数可传可不传
component:Search,
meta:{show:true},
name:"search",
props:{a:1,b:2}
},
?
3、函数写法,可以params参数,query参数,通过props传递给路由组件
{
path:"/search/:keyword?", //加上?表示这个params参数可传可不传
component:Search,
meta:{show:true},
name:"search",
props($route)=>{
(
{
keyword:$route.params.keyword,
k:$route.query.k
}
)
}
},
13、重写push和replace方法
重写原因:编程式路由跳转到当前路由(参数不变),多次执行会抛出NavgationDuplicated错误
声明式跳转没有这类问题,因为vue-router已经处理好了
为什么会有这个问题:因为push和replace使用promise封装,跳转完之后没有指定回调函数所以会报错,但是不会影响程序的执行
解决方案
1、指定两个空的回调函数,治标不治本,将来在别的组件中使用push|replace编程式导航还是有类似的错误
this.$router.push({
name:"search",
params:{keyword:''||undifined},
query:{k:this.keyword.toUpperCase()}
},()=>{},()=>{})
2、封装,重写push|replace
this:当前组件实例 (search)
this.$router属性:这个属性的属性值是VueRouter的实例对象,当在入口文件注册路由的时候,给组件添加$router|$route属性
push:VueRouter原型对象的方法 VueRouter.property.push=function(){}
具体实现,在路由js文件当中添加如下代码
//1、备份原方法
let originPush=VueRouter.prototype.push;
let originRepalce=VueRouter.prototype.replace;
//重写push|replace
//第一个参数:告诉原来push方法,你往那里跳、传递那些参数
VueRouter.prototype.push=function(location,reslove,reject){
if(reslove&&reject){
originPush.call(this,location,reslove,reject);
}else{
originPush.call(this,location,()=>{},()=>{});
}
}
VueRouter.prototype.replace=function(location,reslove,reject){
if(reslove&&reject){
originRepalce.call(this,location,reslove,reject);
}else{
originRepalce.call(this,location,()=>{},()=>{});
}
}