vue2插槽的透传

多组件嵌套的情况下,有时候会希望父组件向孙子组件(或者更小的辈分)的slot中插入内容, 显然,这需要在孙子组件里面用<slot :name="field.component" :data="formValue" />, 在父组件里面用<childComponent #slotName="childData"><childComponent/>。但是在子组件中应该如何进行插槽的声明,才能做到类似中继的作用呢。

一般地,我们可以用下面的方式来声明:

  <!--子组件 -->
<grandsonComponent
      v-bind="$props"
      @action-handle="actionHandle"
      @fetched-data="($event) => $emit('fetched-data', $event)"
    >
      <template v-for="slot in Object.entries(this.$slots)" :slot="slot[0]">
        <slot :name="slot[0]"></slot>
      </template>
      <template v-for="(_, name) in $scopedSlots" v-slot:[name]="data">
        <slot :name="name" v-bind="data" />
      </template>
</grandsonComponent>

这样,在父组件中,可以用

  <!--父组件 -->
<childComponent>
      <template #slot-prop="childData">
    .........
      </template>
</childComponent>

在子组件中,可以用

  <!--子组件 -->
。。。。
 <slot :name="slotName" :data="formValue" />
。。。。

posted @ 2023-06-06 11:13  Bravo_Jack  阅读(1139)  评论(0编辑  收藏  举报