Объединение базовых слотов в один requiredTableFields
не будет работать, потому что нет (простого) способа вырвать дочерние слоты обратно после их объединения.
Вместо этого вы можете просто держите отдельные слоты:
<TheTable ...>
<template v-slot:name="{ item }">
<td>
...
</td>
</template >
<template v-slot:registered="{ item }">
<td>
...
</td>
</template>
</TheTable>
Это позволяет передать два слота с областями действия, name
и registered
, в TheTable
.
Предполагая, что вы не хотите кодируйте имена слотов в TheTable
, после чего вам нужно будет выполнить итерацию по $scopedSlots
для их динамического включения.
<CDataTable ...>
<template v-for="(x, slotName) in $scopedSlots" v-slot:[slotName]="context">
<slot :name="slotName" v-bind="context" />
</template>
</CDataTable>
Некоторые примечания по этому вопросу:
x
не используется, нам просто нужно l oop над именами слотов. - «Данные», связанные с определенным слотом, называются
context
и просто передаются. - Если бы слоты не были ограничены слотами, это было бы немного иначе. Вместо этого мы перебрали бы
$slots
и удалили все части, которые ссылаются на context
. - В начале атрибута
:name
есть :
, так как мы хотим передать динамику c имя. К сожалению, одно из мест в исходном вопросе также называется name
, что может привести к некоторой путанице. - Часть
v-bind="context"
аналогична оператору распространения JavaScript, если это делает это более ясным. Думайте об этом как attributes = { name: slotName, ...context }
.
Ниже приведен полный пример, иллюстрирующий эту технику, изложенную выше. Он не использует CDataTable
, но основной принцип передачи слотов точно такой же.
const Comp2 = {
template: `
<div>
<h4>Left</h4>
<div><slot name="top" item="Red" /></div>
<h4>Right</h4>
<div><slot name="bottom" item="Green" /></div>
</div>
`
}
const Comp1 = {
template: `
<div>
<comp2>
<template v-for="(x, slotName) in $scopedSlots" v-slot:[slotName]="context">
<slot :name="slotName" v-bind="context" />
</template>
</comp2>
</div>
`,
components: {
Comp2
}
}
new Vue({
el: '#app',
components: {
Comp1
}
})
<script src="https://unpkg.com/vue@2.6.11/dist/vue.js"></script>
<div id="app">
<comp1>
<template v-slot:top="{ item }">
<button>Slot 1 - {{ item }}</button>
</template>
<template v-slot:bottom="{ item }">
<button>Slot 2 - {{ item }}</button>
</template>
</comp1>
</div>