Sometimes, we want to pass down Vue component slots in a wrapper component.
In this article, we’ll look at how to pass down Vue component slots in a wrapper component.
How to Pass Down Vue Component Slots Inside Wrapper Component
To pass down slots in a wrapper component, we can loop through all the slots and pass them down to the child.
For instance, we can write:
<wrapper>
<parent-table v-bind="$attrs" v-on="$listeners">
<slot v-for="slot in Object.keys($slots)" :name="slot" :slot="slot"/>
<template v-for="slot in Object.keys($scopedSlots)" :slot="slot" slot-scope="scope">
<slot :name="slot" v-bind="scope"/>
</template>
</parent-table>
</wrapper>
We get the slots with the $slots
variable.
Then we use Object.keys
to get names of the slots so that we can loop through all of them and pass the name down.
Likewise, we can loop through the scoped slots with the $scopedSlots
variables.
We get the keys the same way and loop through them with v-for
the same way.
With Vue 2.6, the v-slot=
directive is introduced to let is pass the slots down.
For instance, we can write:
<wrapper>
<parent-table v-bind="$attrs" v-on="$listeners">
<template v-for="(_, slot) of $scopedSlots" v-slot:[slot]="scope">
<slot :name="slot" v-bind="scope"/>
</template>
</parent-table>
</wrapper>
We loop through the slot with v-for
.
We get the scoped slots with the $scopedSlots
variable.
slot
is the slot name again.
This time, we pass it to the v-slot
directive as a modifier to pass down the named slot.
scope
has the scope from the scoped slot.
We use v-bind
to get the scope.
And we
Alternatively, we can use render function to pass down the slots.
For instance, we can write:
render(h) {
const children = Object.keys(this.$slots)
.map(slot => h('template', { slot }, this.$slots[slot]))
return h('wrapper', [
h('parent-table', {
attrs: this.$attrs,
on: this.$listeners,
scopedSlots: this.$scopedSlots,
}, children)
])
}
We get the slots with the this.$slots
property.
We call Object.keys
to get the slot names.
And we call map
on it to map the slot names to the template
components.
And we pass in the slots name and the scope down,.
Then we return a wrapper
component with the parent-table
component with the listeners, attributes, and scoped slots and children
as the children.
Conclusion
To pass down slots in a wrapper component, we can loop through all the slots and pass them down to the child.