如何在自定义组件中使用Vuetify 3 Data-Table的v-slot功能?
问题解决:封装Vuetify v-data-table后插槽失效
问题根源
自定义组件MyDataTable未将父组件传入的插槽透传给内部的v-data-table。Vue组件的插槽是作用域封闭的,父组件传给自定义组件的插槽不会自动传递给其内部子组件,必须显式处理。
解决方案
修改@/components/MyDataTable.vue,通过插槽遍历将所有传入的插槽转发给内部的v-data-table,同时传递对应的插槽作用域参数:
<template> <div> <v-data-table :headers="headers" :items="items"> <!-- 透传所有插槽给内部v-data-table --> <template v-for="(_, slotName) in $slots" v-slot:[slotName]="slotProps"> <slot :name="slotName" v-bind="slotProps"></slot> </template> </v-data-table> </div> </template> <script> export default { props: { items: { type: Array, default: () => [], }, headers: { type: Array, default: () => [], }, }, }; </script>
原理说明
- Vue 3中
$slots包含所有普通插槽和作用域插槽,通过v-for遍历所有插槽名称,再通过动态插槽名v-slot:[slotName]绑定到内部v-data-table的对应插槽上。 v-bind="slotProps"会将插槽的作用域参数(如column、item)完整传递,保证父组件的插槽能获取到v-data-table提供的原始数据。
修改后,App.vue中定义的column.name和item.name插槽即可正常作用于内部的v-data-table,实现与原生组件一致的插槽效果。
内容的提问来源于stack exchange,提问作者Ersin Güvenç
相关产品推荐
相关产品推荐

