知海

表格列拖拽

vue-draggable-plus指南-教程

表格列拖拽

本教程介绍如何使用 vue-draggable-plus 实现表格列的拖拽排序。我们将表格的 <thead> 指定为目标容器,从而完成对表格列的顺序调整。下面分别展示组件、函数、指令三种使用方式。

组件使用

vue 复制代码
<template>
  <VueDraggable v-model="headers" target=".sort-target">
    <table class="table table-striped">
      <thead class="thead-dark">
        <tr class="sort-target">
          <th class="cursor-move" v-for="header in headers" :key="header.value">
            {{ header.text }}
          </th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="item in list" :key="item.name">
          <td v-for="header in headers" :key="header.value">
            {{ item[header.value] }}
          </td>
        </tr>
      </tbody>
    </table>
  </VueDraggable>
</template>

<script setup lang="ts">
import { ref } from 'vue'
import { VueDraggable } from 'vue-draggable-plus'

type Item = {
  name: string
  id: number
}

type Header = {
  text: string
  value: keyof Item
}

const headers = ref<Header[]>([
  {
    text: 'Id',
    value: 'id'
  },
  {
    text: 'Name',
    value: 'name'
  }
])
const list = ref<Item[]>([
  {
    name: 'Joao',
    id: 1
  },
  {
    name: 'Jean',
    id: 2
  },
  {
    name: 'Johanna',
    id: 3
  },
  {
    name: 'Juan',
    id: 4
  }
])
</script>

通过将 draggable 组件包裹在表格的列定义区域,并绑定相应数据,即可实现列拖拽。当表头被拖动时,数据顺序会自动更新,从而改变列的显示顺序。

函数使用

vue 复制代码
<template>
  <table class="table table-striped">
    <thead class="thead-dark">
      <tr ref="el" class="sort-target">
        <th class="cursor-move" v-for="header in headers" :key="header.value">
          {{ header.text }}
        </th>
      </tr>
    </thead>
    <tbody>
      <tr v-for="item in list" :key="item.name">
        <td v-for="header in headers" :key="header.value">
          {{ item[header.value] }}
        </td>
      </tr>
    </tbody>
  </table>
</template>

<script setup lang="ts">
import { ref } from 'vue'
import { useDraggable } from 'vue-draggable-plus'

type Item = {
  name: string
  id: number
}

type Header = {
  text: string
  value: keyof Item
}

const headers = ref<Header[]>([
  {
    text: 'Id',
    value: 'id'
  },
  {
    text: 'Name',
    value: 'name'
  }
])

const list = ref<Item[]>([
  {
    name: 'Joao',
    id: 1
  },
  {
    name: 'Jean',
    id: 2
  },
  {
    name: 'Johanna',
    id: 3
  },
  {
    name: 'Juan',
    id: 4
  }
])

const el = ref()
useDraggable(el, headers)
</script>

你也可以在业务逻辑中直接调用 useDraggable 等函数式 API,将拖拽行为绑定到指定的表格表头元素上,适合需要更灵活控制拖拽逻辑的场景。

指令使用

vue 复制代码
<template>
  <table class="table table-striped">
    <thead class="thead-dark">
      <tr v-draggable="headers">
        <th class="cursor-move" v-for="header in headers" :key="header.value">
          {{ header.text }}
        </th>
      </tr>
    </thead>
    <tbody>
      <tr v-for="item in list" :key="item.name">
        <td v-for="header in headers" :key="header.value">
          {{ item[header.value] }}
        </td>
      </tr>
    </tbody>
  </table>
</template>

<script setup lang="ts">
import { ref } from 'vue'
import { vDraggable } from 'vue-draggable-plus'

type Item = {
  name: string
  id: number
}

type Header = {
  text: string
  value: keyof Item
}

const headers = ref<Header[]>([
  {
    text: 'Id',
    value: 'id'
  },
  {
    text: 'Name',
    value: 'name'
  }
])

const list = ref<Item[]>([
  {
    name: 'Joao',
    id: 1
  },
  {
    name: 'Jean',
    id: 2
  },
  {
    name: 'Johanna',
    id: 3
  },
  {
    name: 'Juan',
    id: 4
  }
])
</script>

指令方式(如 v-draggable)可以最快捷地将拖拽能力附加到表头容器上,仅需在模板中添加指令并指定数据源即可完成列排序功能。


以上三种方式都基于同一套拖拽核心,使用户可以轻松通过拖拽表头来调整表格列的顺序。更多关于目标容器与具体配置,请参阅目标容器文档。

帮助我们改进文档

发现翻译问题或内容错误?请告诉我们。