vue3实现el-table的拖拽

 我这里使用的是 sortablejs 插件;

安装命令: npm install sortablejs --save

注意点:

你的表格数据中要有id作为key去使用;

<div class="draggable">
          <el-table row-key="id" :data="form.tableData" style="width: 100%" max-height="250">
            <el-table-column type="index" width="80" label="数源顺序" />
            <el-table-column
              v-for="(column, index) in oldList"
              :key="index"
              :prop="column.prop"
              :label="column.label"
              :width="column.width"
              show-overflow-tooltip
            />
            <el-table-column fixed="right" label="操作" min-width="260">
              <template #default="scope">
                <el-button
                  type="primary"
                  @click="handleEdit(scope.row)"
                  link>
                  编辑
                </el-button>
                <el-button
                  link
                  type="danger"
                  @click.prevent="deleteRow(scope.$index)"
                >
                  删除
                </el-button>
                <el-button
                  v-if="scope.$index !== 0"
                  type="primary"
                  @click.prevent="moveUp(scope.row, scope.$index)"
                  link>
                  上移
                </el-button>
                <el-button
                  v-if="scope.$index !== form.tableData.length - 1"
                  type="primary"
                  @click.prevent="shiftDown(scope.row, scope.$index)"
                  link>
                  下移
                </el-button>
                <el-button
                  v-if="title === '数源配置' && scope.row.status === '0'"
                  type="primary"
                  @click.prevent="enable(scope.row)"
                  link>
                  启用
                </el-button>
                <el-button
                  v-if="title === '数源配置' && scope.row.status === '1'"
                  type="primary"
                  @click.prevent="forbidden(scope.row)"
                  link>
                  禁用
                </el-button>
              </template>
            </el-table-column>
          </el-table>
        </div>

<script setup>
import Sortable from 'sortablejs';


const form = ref({
  tableData: [
    { id: 1, status: '0', name: '哈哈哈111' },
    { id: 2, status: '1', name: '哈哈哈222' },
    { id: 3, status: '0', name: '哈哈哈333' },
    { id: 4, status: '0', name: '哈哈哈444' }],
});
const oldList = ref([]);
const columns = ref([
  { prop: 'state', label: '数源英文名称', width: '200' },
  { prop: 'name', label: '数源中文名称', width: '200' },
  { prop: 'name', label: '字段名称', width: '200' },
  { prop: 'name', label: '所属部门', width: '200' },
  { prop: 'state', label: '业务系统名称', width: '200' },
  { prop: 'state', label: '数源说明', width: '200' }
]);

// 行拖拽
const rowDrop = () => {
  // 要拖拽元素的父容器 tbody
  const tbody = document.querySelector('.draggable .el-table__body-wrapper tbody')
  Sortable.create(tbody, {
    //  可被拖拽的子元素
    draggable: ".draggable .el-table__row",
    onEnd({ newIndex, oldIndex }) {
      // newIndex 拖动到的新的索引
      // oldIndex 没拖动前的索引
      const currRow = form.value.tableData.splice(oldIndex, 1)[0]
      form.value.tableData.splice(newIndex, 0, currRow)
    }
  });
};

onMounted(() => {
  oldList.value = JSON.parse(JSON.stringify(columns.value))
  rowDrop()
})


</script>

### Vue3实现 Element Plus 的 `el-table` 和 `el-tree` 组件之间相互拖拽功能 为了实现Vue3 中使用 Element Plus 的 `el-table` 表格组件和 `el-tree` 树形组件之间的数据项相互拖拽,可以采用如下方法: #### 准备工作 确保项目已经安装并配置好 Vue3 及其依赖包以及 Element Plus 库。 #### 安装必要的插件 对于拖拽操作的支持,推荐引入第三方库如 `vuedraggable` 或者基于原生 HTML5 Drag API 来处理复杂的交互逻辑。这里以 `vuedraggable` 为例说明[^1]。 ```bash npm install vuedraggable@next --save ``` #### 创建基础模板结构 创建包含两个主要部分的应用程序布局——一个是用于显示表格的数据列表;另一个是用来展示树形结构的内容区。 ```html <template> <div class="container"> <!-- 左侧:Tree --> <el-card style="width: 40%;"> <draggable :list="treeData" @end="onDragEnd(&#39;tree&#39;)"> <el-tree ref="treeRef" node-key="id" default-expand-all :data="treeData"></el-tree> </draggable> </el-card> <!-- 右侧:Table --> <el-card style="margin-left: 2%; width: 57%;"> <draggable :list="tableData" item-key="id" @end="onDragEnd(&#39;table&#39;)"> <template #item="{ element }"> <el-table-row :row-class-name="&#39;custom-row&#39;" :key="element.id"> <el-table-column prop="name" label="Name"/> <el-table-column prop="value" label="Value"/> </el-table-row> </template> </draggable> </el-card> </div> </template> ``` 注意,在上述代码片段中,通过自定义指令 `draggable` 将拖放为绑定到了对应的容器上,并且指定了监听事件来捕获结束后的回调函数 `onDragEnd()` 方法。 #### 编写 JavaScript 部分 接下来编写相应的脚本文件,初始化状态变量、设置初始数据源、定义辅助工具函数等。 ```javascript <script setup lang="ts"> import { reactive, onMounted } from &#39;vue&#39;; import draggable from &#39;vuedraggable&#39;; // 初始化 state 数据 const treeData = reactive([ { id: 1, name: "Node One", children: [ { id: 2, name: "Child Node Two" } ] }, ]); const tableData = reactive([ { id: 3, name: "Item Three", value: "" }, { id: 4, name: "Item Four", value: "" }, ]); function onDragEnd(type) { console.log(`Dragging ended at ${type}`); } onMounted(() => {}); </script> ``` 这段 TypeScript 脚本设置了响应式的 `treeData` 和 `tableData` 数组作为各自组件的数据源,并实现了简单的日志记录器 `onDragEnd()` 当任意一项被移动完毕之后触发调用它。 #### 处理跨组件间的拖拽交换 为了让不同类型的条目可以在两者间自由转移,还需要额外考虑一些细节问题,比如当某个元素从一个地方移到另一处时应更新目标集合的状态。这通常涉及到修改原始数组中的索引位置或是直接替换整个对象实例。 可以通过调整 `onDragEnd()` 方法内部的具体业务流程来自定义这些规则。例如,判断当前正在发生的动作发生在哪个区域(即来源于哪一个组件),进而决定如何同步改变对方的数据集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开发那点事儿~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值