表格列拖拽
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)可以最快捷地将拖拽能力附加到表头容器上,仅需在模板中添加指令并指定数据源即可完成列排序功能。
以上三种方式都基于同一套拖拽核心,使用户可以轻松通过拖拽表头来调整表格列的顺序。更多关于目标容器与具体配置,请参阅目标容器文档。
帮助我们改进文档
发现翻译问题或内容错误?请告诉我们。
