Vuetify 数据表将动态槽与行/项目槽相结合

SAS*_*ROG 5 datatable vue.js vuetify.js

我正在尝试制作一个可重用的 vuetify 数据表。如果我愿意的话,我希望能够传递动态槽或项目槽,并且两者都应该有效。这是代码

<v-data-table
    :headers="headers"
    :items="items"
    :dense="dense"
    :hide-default-header="hideDefaultHeader"
    :loading="loading"
    :options.sync="settings"
    :items-per-page="itemsPerPage"
    :server-items-length="itemLength"
    @click:row="handleClick"
    :height="height"
>
    <-- 1st part-->
    <template v-for="field in slots" v-slot:[field.field]="{ item }">
        <slot :name="field.field" :item="item"></slot>
    </template>
    <-- 2nd part -->
    <template v-slot:item="{item}">
        <slot name="item" v-bind="item"></slot>
    </template>
</v-data-table>
Run Code Online (Sandbox Code Playgroud)

然后创建一个组件,DataTable然后我像这样使用它

<DataTable
    v-if="tabs == n"
    :items="items"
    :loading="loading"
    :headers="headers"
    :options="serverOptions"
    :slots="slots"
    :total="toatl"
    @updateOptions="updateOptions($event, n)"
>
Run Code Online (Sandbox Code Playgroud)

我也有一个像这样的插槽数组

slots: [{ field: "item.CREATOR" }, { field: "item.BODY" }]
Run Code Online (Sandbox Code Playgroud)

我希望能够使用item槽位数组2nd part或使用槽位数组中定义的特定列槽位1st part。现在是动态插槽,除非我注释掉2nd part. 这就是我目前对每个部分进行定位的方式

第 1 部分:

<template v-slot:item.CREATOR="{ item }">
    <strong>{{item.FIRSTNAME}} {{item.LASTNAME}}</strong>
</template>
Run Code Online (Sandbox Code Playgroud)

第二部分:

<template v-slot:item="item">
    <tr>
        <td>{{item.MESSAGESTATUS}}</td>
        <td>sdsd</td>
        <td>sfsf</td>
    </tr>
</template>
Run Code Online (Sandbox Code Playgroud)

yur*_*uri 10

使用您想要的动态槽的计算属性可以轻松解决您尝试做的事情:

 computed: {
   creatorSlots: function () {
    //Filters the slots of type CREATOR
    return this.slots.filter(slot => slot.field==='CREATOR');
   }
 }
Run Code Online (Sandbox Code Playgroud)

所以现在您可以将第一部分用于插槽阵列上的每个“CREATOR”插槽:

<template v-for="(slot,i) in creatorSlots" v-slot:[`item.${slot.field}`]="{ item }">
    <strong :key="i">{{item.FIRSTNAME}} {{item.LASTNAME}}</strong>
</template>
Run Code Online (Sandbox Code Playgroud)

如果您有其他插槽需要以其他方式处理,您只需为其他插槽使用另一个计算属性并重复该过程...

 computed: {
   bodySlots: function () {
    //Filters the slots of type BODY
    return this.slots.filter(slot => slot.field==='BODY');
   }
 }
Run Code Online (Sandbox Code Playgroud)
<template v-for="(slot,i) in bodySlots" v-slot:[`item.${slot.field}`]="{ item }">
    <tr>
        <td>{{item.MESSAGESTATUS}}</td>
        <td>sdsd</td>
        <td>sfsf</td>
    </tr>
</template>
Run Code Online (Sandbox Code Playgroud)

希望它有帮助,我来到这里遇到了类似的问题,我用这种方法解决了。