vue.js - Vue.Draggable 能否与 Vuetify v-data-table 一起使用并允许使用表 v-slot :item. <name>?

标签 vue.js vuedraggable v-data-table

验证 v-data-table支持多种类型的插槽:v-slot:body , v-slot:itemv-slot:item.<name> .

我们一直在使用v-slot:item.<name>广泛,因为它们提供了一种灵活的方式来设计和处理各个列中的内容,并允许以编程方式更改表标题。

我想为我的 v-data-table 添加可拖动性行并使用 Vue.Draggable 使其正常工作.

然而 draggable组件需要使用 v-data-table v-slot:body即控制了整个 table ,从而失去了 v-slot:item.<name> 的灵 active 。 .

有没有办法将这两个组件一起使用并提供v-slot:item.<name>支持吗?

最佳答案

我创建了一个 DataTableRowHandler允许 v-slot:item.<name> 的组件支持。

这是放在 draggable 里面的组件,插入表 <tr>元素并提供相同的“标题”数组以插入 <td>元素和 v-slot:item.<name>条目。如果没有 v-slot:item.<name>被定义然后单元格值被输出,以与v-data-table相同的方式有效。

下面是示例组件用法:

<v-data-table
  ref="myTable"
  v-model="selected"
  :headers="headers"
  :items="desserts"
  item-key="name"
  class="elevation-1"
>
  <template v-slot:body="props">
    <draggable
      :list="props.items"
      tag="tbody"
      :disabled="!allowDrag"
      :move="onMoveCallback"
      :clone="onCloneCallback"
      @end="onDropCallback"
    >
      <data-table-row-handler
        v-for="(item, index) in props.items"
        :key="index"
        :item="item"
        :headers="headers"
        :item-class="getClass(item)"
      >
        <template v-slot:item.lock="{ item }">
          <v-icon @click="item.locked = item.locked ? false : true">{{
            item.locked ? "mdi-pin-outline" : "mdi-pin-off-outline"
          }}</v-icon>
        </template>

        <template v-slot:item.carbs="{ item }">
          {{ item.carbs }}
          <v-icon>{{
            item.carbs > 80
              ? "mdi-speedometer"
              : item.carbs > 45
              ? "mdi-speedometer-medium"
              : "mdi-speedometer-slow"
          }}</v-icon>
        </template>
      </data-table-row-handler>
    </draggable>
  </template>
</v-data-table>

这是 DataTableRowHandler组件代码

<template>
  <tr :class="getClass">
    <td v-for="(header, index) in headers" :key="index">
      <slot :item="item" :name="columnName(header)">
        <div :style="getAlignment(header)">
          {{ getNonSlotValue(item, header) }}
        </div>
      </slot>
    </td>
  </tr>
</template>

<script>
export default {
  name: "DataTableRowHandler",
  components: {},
  props: {
    itemClass: {
      type: String,
      default: "",
    },
    item: {
      type: Object,
      default: () => {
        return {};
      },
    },
    headers: {
      type: Array,
      default: () => {
        return [];
      },
    },
  },
  data() {
    return {};
  },
  computed: {
    getClass() {
      return this.itemClass;
    }
  },
  methods: {
    columnName(header) {
      return `item.${header.value}`;
    },
    getAlignment(header) {
      const align = header.align ? header.align : "right";
      return `text-align: ${align}`;
    },
    getNonSlotValue(item, header) {
      const val = item[header.value];

      if (val) {
        return val;
      }

      return "";
    },
  },
};
</script>

它的一个使用示例在这个 codesandbox link 中。

关于vue.js - Vue.Draggable 能否与 Vuetify v-data-table 一起使用并允许使用表 v-slot :item. <name>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66090612/

相关文章:

javascript - 如何使用VueDraggable自动更新项目的 "order"字段?

javascript - 如何在 vue draggable 中保持拖动项目直到释放

vuetify.js - 自定义 vuetify 数据表分隔符

vue.js - 如何在 vuetify 数据表上导出 csv、excel 按钮?

json - 如何让 Vue 显示来自 json 文件的本地路径的图像

html - 需要在 html anchor 上单击两次才能转到 id 或名称

vue.js - 有什么方法可以让 Tailwind 旋转过渡工作吗?

javascript - Firestore : Unable to fetch nested documents. 为什么?

vuejs2 - 如何在没有 webpack 的情况下使用 Vue.Draggable CDN?

vue.js - 验证 : Show pagination controls at the top of my v-data-table as well as in the footer