I’ve created a global components extending Bootstrap Vue Table component to made a custom template for each table named VTable
.
The Bootstrap Vue Table component have possibility to use named slots to customize the data rendering.
<template> <div> <b-table :items="items" :fields="fields" ... > </b-table> </div> </template> <script> import Table from 'bootstrap-vue/es/components/table/table'; export default { name: 'Vtable', extends: Table, ... }; </script>
I use the global table component inside another one using the new custom HTML tag.
<v-table v-if="items" :items="items" :fields="fields" ... > <template slot="timestamp" slot-scope="data" > ... </template> <template slot="row-details" slot-scope="row" > ... </template> </v-table>
The problem is that the named slots used in the VTable
component are not displayed inside the child component.
I also tried to create a custom named slot inside the global component
<template> <div> <b-table ... > <slot name="customRendering"/> </b-table> </div> </template>
And use it like
<v-table ... > <template slot="customRendering"> <template slot="timestamp" slot-scope="data" > ... </template> <template slot="row-details" slot-scope="row" > ... </template> </template> </v-table>
Without success
This is possible to simply use named slots defined inside grand-child component or does it totally not possible ?
I also think to loop through customRendering
slot value to recreated dynamically the Bootstrap Vue table slots.
Advertisement
Answer
In your vtable
component, you can define the slots you want to pass on.
so if you have a component my-component
with a child -> vtable
which extends -> btable
…
you could define the slots in your vtable
component, that you want to pass along using
<template slot="row-details" slot-scope="row" > <slot name="row-details"/> </template>
here’s a quick example of this https://jsfiddle.net/eywraw8t/308324/
You may need to set this up for each slot. If you want to pass all of them along dynamically(without knowing their names), a render function would work better, since you can loop over all slots that were sent by parent, and pass them to the child.
docs: https://v2.vuejs.org/v2/guide/render-function.html#Slots
example of a component with render function that will pass down scoped slots
const Bar = Vue.component('vtable', { render(h) { const children = Object.keys(this.$slots).map(slot => h('template', { slot }, this.$slots[slot])) return h('wrapper', [ h('foo', { attrs: this.$attrs, on: this.$listeners, scopedSlots: this.$scopedSlots, }, children) ]) } });