Third-party components are often wrapped in a custom component. But in that way, the slots of the third-party component get lost.
The following solution exposes all slots of the third-party component to the parent component:
<template>
<div class="wrapper">
<ThirdPartyComponent v-bind="$attrs">
<!-- Expose all slots of the third-party component -->
<template v-for="(_, name) in $slots" #[name]="slotProps">
<slot :name="name" v-bind="slotProps || {}"></slot>
</template>
</ThirdPartyComponent>
</div>
</template>
Now every component that uses WrapperComponent can use the slots of ThirdPartyComponent.
What's happening:
$attrs component instance object (official docs)$slots component instance object (official docs) and bind the slots props to the slot name via #[name]="slotProps"slot, we use v-bind to bind all third-party slot properties (slotProps) to pass out to a parentIf you liked this Vue tip, follow me on Twitter to get notified about new tips, blog posts, and more. Alternatively (or additionally), you can subscribe to my weekly Vue & Nuxt newsletter :
