Vuetify 访问数据表自定义组件中的 v-slot:item

Posted

技术标签:

【中文标题】Vuetify 访问数据表自定义组件中的 v-slot:item【英文标题】:Vuetify access v-slot:item in datatable custom compoent 【发布时间】:2021-11-26 01:02:09 【问题描述】:

您好,我制作了自定义数据表组件,我的 Table.vue 文件如下所示:

<template>
    <div>
        <v-data-table
            :headers="headers"
            :items="items"
            :search="search"
            :loading="loading"
            loading-text="Loading... Please wait"
            dense
            >
            <template v-slot:top>
                <v-toolbar dark flat dense>
                    <v-toolbar-title> title </v-toolbar-title>
                    <v-spacer></v-spacer>
                    <v-text-field
                        v-model="search"
                        append-icon="mdi-magnify"
                        label="Search"
                        single-line
                        hide-details
                        ></v-text-field>
                    <v-spacer></v-spacer>
                </v-toolbar>
            </template>
        </v-data-table>
    </div>
</template>

<script>
    export default 
        name: "Table",
        props: [
            "headers",
            "items",
            "title",
            "itemsPerPage",
            "loading",
        ],
        data: function () 
            return 
                search: '',
            
        ,
        methods: 
        ,
    ;
</script>

我就是这样使用它的:

<Table
    :headers="headers"
    :items="groups"
    :loading="loading"
    title="Baseny"
    >
</Table>

一切都很好,但我想为每个输入添加带有操作的自定义列(每个输入都有不同的 ID)

通常没有自定义组件我这样写:

<v-data-table
            :headers="headers"
            :items="times"
            :items-per-page="5"
            :search="search"
            :loading="loading"
            loading-text="Ładowanie... Proszę czekać"
            >

            <template v-slot:top>
                <v-toolbar dark flat dense>
                    <v-toolbar-title>Lista zajęć</v-toolbar-title>
                    <v-spacer></v-spacer>
                    <v-text-field
                        v-model="search"
                        append-icon="mdi-magnify"
                        label="Szukaj"
                        single-line
                        hide-details
                        ></v-text-field>
                    <v-spacer></v-spacer>
                    <v-btn
                        color="primary"
                        :to=" name: 'admin.times.create' "
                        >
                        Dodaj zajęcie
                    </v-btn>
                </v-toolbar>
            </template>

            <template v-slot:item.actions=" item ">
                <v-icon
                    small
                    class="mr-2"
                    @click="show(item)"
                    >
                    mdi-pool
                </v-icon>
                <v-icon
                    small
                    class="mr-2"
                    @click="edit(item)"
                    >
                    mdi-pencil
                </v-icon>
            </template>
        </v-data-table>

我正在使用这个 v-slot:

<template v-slot:item.actions=" item ">
                <v-icon
                    small
                    class="mr-2"
                    @click="show(item)"
                    >
                    mdi-pool
                </v-icon>
                <v-icon
                    small
                    class="mr-2"
                    @click="edit(item)"
                    >
                    mdi-pencil
                </v-icon>
            </template>

但是当我编写自定义可重用表格组件时它不起作用,当我将这些行放入标签时。这个怎么做?

【问题讨论】:

【参考方案1】:

你想要实现的是我相信一个包装器组件。您想将一个组件包装在另一个组件之上,让他拥有一些您想在应用程序中重用的自定义属性。

你需要的是一个小型的 sn-p,它可以让你的插槽被使用:

<!-- pass through scoped slots -->
<template v-for="(_, scopedSlotName) in $scopedSlots" v-slot:[scopedSlotName]="slotData">
  <slot :name="scopedSlotName" v-bind="slotData" />
</template>

<!-- pass through normal slots -->
<template v-for="(_, slotName) in $slots" v-slot:[slotName]>
  <slot :name="slotName" />
</template>

你可以找到这个here的出处

基本上,您可以在这里重写您的 CustomTable.vue:

<template>
  <div>
    <v-data-table
      v-bind="$attrs"
      v-on="$listeners"
      :search="search"
      loading-text="Loading... Please wait"
      dense
    >
      <!-- pass through scoped slots -->
      <template
        v-for="(_, scopedSlotName) in $scopedSlots"
        v-slot:[scopedSlotName]="slotData"
      >
        <slot :name="scopedSlotName" v-bind="slotData" />
      </template>

      <!-- pass through normal slots -->
      <template v-for="(_, slotName) in $slots" v-slot:[slotName]>
        <slot :name="slotName" />
      </template>
      <template v-slot:top>
        <v-toolbar dark flat dense>
          <v-toolbar-title> title </v-toolbar-title>
          <v-spacer></v-spacer>
          <v-text-field
            v-model="search"
            append-icon="mdi-magnify"
            label="Search"
            single-line
            hide-details
          ></v-text-field>
          <v-spacer></v-spacer>
        </v-toolbar>
      </template>
    </v-data-table>
  </div>
</template>

<script>
export default 
  name: "CustomTable",
  props: ["title"],
  data: function () 
    return 
      search: "",
    ;
  ,
  methods: ,
;
</script>

我制作了一个代码框来向您展示它是如何工作的: https://codesandbox.io/s/vuetify-2-forked-3lp9y?file=/src/components/CustomTable.vue

我还在您的表上添加了自动属性和侦听器绑定,以允许您使用 Vuetify 提供的所有功能。

【讨论】:

以上是关于Vuetify 访问数据表自定义组件中的 v-slot:item的主要内容,如果未能解决你的问题,请参考以下文章

使用 v-slot:activator 时关闭自定义组件中的 Vuetify v-dialog

如何在 Vuetify 组件上应用自定义/覆盖 CSS?

如何将 Vuetify 注入我的自定义 vue 插件

添加自定义滚动条以 vuetify 数据表

将自定义数据属性添加到 Vuetify v-select 选项

想在 vuejs 中使用 vuetify 小吃吧作为全局自定义组件