vue3+element-plus Sortable 实现table拖拽排序

vue3+element-plus 使用Sortable实现table拖拽排序

1、sortablejs实现表格拖拽
官网配置项
中文文档

1.1

npm install sortablejs --save // 安装也可使用yarn

1.2 在需要的页面中引入

import Sortable from "sortablejs"; // 安装也可使用yarn

1.3 具体使用
el-table中配置 给个row-key,且必须是唯一的,比如ID,否则会出现排序不对的情况

<el-table
  ref="dragTable"
  :data="cityConfigList"
   border
   row-key="CityCode"
 </el-table>

在setup()中编写行拖拽的实现方法,具体逻辑是创建一个Sortable的实例,将需要拖拽的元素给到Sortable实例,进行需要的配置,然后在拖拽结束的方法onEnd()中实现改变排序的逻辑(需要在dom后去调用,获取列表后.then里面也可以)。

// 表格行拖拽
    const rowDrop = () => {
      let tbody = document.querySelector(".el-table__body-wrapper tbody");
      Sortable.create(tbody, {
        // or { name: "...", pull: [true, false, 'clone', array], put: [true, false, array] }
        group: {
          name: "words",
          pull: true,
          put: true,
        },
        animation: 150, // ms, number 单位:ms,定义排序动画的时间
        onAdd: function (evt: any) {
          // 拖拽时候添加有新的节点的时候发生该事件
          console.log("onAdd.foo:", [evt.item, evt.from]);
        },
        onUpdate: function (evt: any) {
          // 拖拽更新节点位置发生该事件
          console.log("onUpdate.foo:", [evt.item, evt.from]);
        },
        onRemove: function (evt: any) {
          // 删除拖拽节点的时候促发该事件
          console.log("onRemove.foo:", [evt.item, evt.from]);
        },
        onStart: function (evt: any) {
          // 开始拖拽出发该函数
          console.log("onStart.foo:", [evt.item, evt.from]);
        },
        onSort: function (evt: any) {
          // 发生排序发生该事件
          console.log("onUpdate.foo:", [evt.item, evt.from]);
        },
        onEnd(evt: any) {
          // 结束拖拽
          console.log("结束表格拖拽", evt);
          // 如果拖拽结束后顺序发生了变化,则对数据进行修改
          if (evt.oldIndex !== evt.newIndex) {
            let currRow = fieldOptions.value.splice(evt.oldIndex, 1)[0];
            fieldOptions.value.splice(evt.newIndex, 0, currRow);
            // 将排序后的ID抽离成数组传给后端
            let optIDs: string[] = [];
            fieldOptions.value.forEach((item) => {
              optIDs.push(item.ID);
            });
            const params = {
              Params: {
                SpaceID: spaceID.value,
                LaunchID: launchID.value,
                OptIDs: optIDs,
              },
              Options: {
                APIServer: apiServer,
              },
            };
            // 发送改变顺序的请求
            store.commit("doRequest");
            spaceService.OrderOptions(params).then((res: any) => {
              store.commit("deResponse");
              if (res.Status === 0) {
                console.log("表格顺序修改成功");
              } else {
                ElMessage({
                  showClose: true,
                  message: res.ErrorMessage,
                  type: "error",
                  duration: 10000,
                });
              }
            });
          }
        },
      });
    };

如果需要加拖拽图标配置handle添加了 .drag-handler

const initSortable = () => {
  console.log(dragTable.value)
  const tbody = dragTable.value.$el.querySelector('.el-table__body-wrapper tbody')
  console.log(tbody)
  Sortable.create(tbody, {
    // or { name: "...", pull: [true, false, 'clone', array], put: [true, false, array] }
    ghostClass: 'sortable-ghost', // Class name for the drop placeholder,
    handle: '.drag-handler',
    animation: 150, // ms, number 单位:ms,定义排序动画的时间
    setData: function (dataTransfer) {
      // to avoid Firefox bug
      // Detail see : https://github.com/RubaXa/Sortable/issues/1012
      dataTransfer.setData('Text', '')
    },
    onEnd(evt) {
      // 结束拖拽
      console.log('结束表格拖拽', evt)
      // 如果拖拽结束后顺序发生了变化,则对数据进行修改
      if (evt.oldIndex !== evt.newIndex) {
        let currRow = cityConfigList.value.splice(evt.oldIndex, 1)[0]
        cityConfigList.value.splice(evt.newIndex, 0, currRow)
      }
    }
  })
}

页面代码里面需要安装@element-plus/icons-vue

# NPM
$ npm install @element-plus/icons-vue
# Yarn
$ yarn add @element-plus/icons-vue
# pnpm
$ pnpm install @element-plus/icons-vue
<el-table-column label="拖拽" align="center" width="50px">
   <div class="drag-handler">
   		<el-icon :size="20" style="cursor: pointer">
       		<Rank></Rank>
         </el-icon>
    </div>
</el-table-column>

<script setup>
import { Rank } from '@element-plus/icons-vue'
</script>
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现拖拽功能可以使用 SortableJS 库,并结合 Element Plus 的表格组件和 Vue3 的响应式数据。 首先需要在项目中安装 SortableJS: ``` npm install sortablejs --save ``` 然后在需要使用的组件中引入 SortableJS 和 Element Plus 的表格组件: ```javascript import Sortable from 'sortablejs'; import { ElTable, ElTableColumn } from 'element-plus'; ``` 接着,在组件中定义表格数据和表格列,以及拖拽回调函数: ```javascript export default { data() { return { tableData: [ { name: 'John', age: 20, address: 'New York' }, { name: 'Tom', age: 25, address: 'London' }, { name: 'Lucy', age: 18, address: 'Paris' }, { name: 'Lily', age: 22, address: 'Tokyo' } ], tableColumns: [ { label: 'Name', prop: 'name' }, { label: 'Age', prop: 'age' }, { label: 'Address', prop: 'address' } ] }; }, mounted() { // 绑定拖拽回调函数 const el = this.$refs.table.$el.querySelector('.el-table__body-wrapper tbody'); Sortable.create(el, { animation: 150, onEnd: evt => { const { newIndex, oldIndex } = evt; const item = this.tableColumns.splice(oldIndex - 1, 1)[0]; this.tableColumns.splice(newIndex - 1, 0, item); } }); }, render() { return ( <ElTable ref="table" data={this.tableData}> {this.tableColumns.map(column => ( <ElTableColumn label={column.label} prop={column.prop}></ElTableColumn> ))} </ElTable> ); } }; ``` 这里使用 `Sortable.create` 方法创建一个拖拽对象,并且绑定了 `onEnd` 回调函数,当拖拽结束后,将表格列数组中的相应元素移动到新位置。 最后渲染表格时,使用 `map` 方法动态创建表格列。 这样就实现了列拖拽功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小熊pc

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

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

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

打赏作者

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

抵扣说明:

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

余额充值