vue的动态组件component传参

912 阅读1分钟

问题

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: []
                }
        }
    }
}
//...省略