问题
vue的动态组件component在使用时,如果需要展示的是两个完全不同的组件,那么props怎么传递,将两个组件所需要的props都在component组件上一次传递吗?
比如:A组件接受啊a,b,c;B组件接受d,e,f,那在使用component时是像下面一样使用吗(这样使用我测了下是可以的,但不知道有没有什么风险)
<component
:is="currentSelect"
:a="a"
:b="b"
:c="c"
:d="d"
:e="e"
:f="f"
></component>
解决方案
首先,上面这种写法没有问题(真要有风险那也就是别人一眼看过去不知道什么组件要什么props,我觉得一个比较好的做法可以考虑直接v-bind,值可以是computed,或者其他),只不过这要是每种组件有二十个参数要传、有个七八种组件可咋整?这么写得累死。
解决:包装成一个大对象就可以了!!!
写法1
<component
:is="currentSelect"
v-bind="currentSelectProps"
></component>
<script>
export default {
data() {
// 仅做举例,这些值到底咋来的看你自己业务需要
let currentSelect;
let currentSelectProps;
switch (currentSelect) {
case 'A':
currentSelectProps = { a: 'foo', b: 'bar', c: 'baz' };
break;
case 'B':
currentSelectProps = { d: 1, e: 2, f: 3 };
break;
}
return {
currentSelect,
currentSelectProps
}
}
}
</script>
写法2
<component
:is="currentSelect"
v-bind="nestedProps"
></component>
//...省略
computed: {
currentSelect() {
switch(this.someState) {
case 'A':
return 'AC'
default:
return 'DC'
}
},
nestedProps() {
switch(this.someState) {
case 'A':
return {
a: 'name',
b: 101,
}
default:
return {
d: true,
e: []
}
}
}
}
//...省略