leiwuhen-67's blog leiwuhen-67's blog
首页
    • 《Vue》笔记
    • 《React》笔记
    • 《NodeJs》笔记
    • 《CSS》笔记
    • 《Redis》笔记
    • 基础入门
    • 《Mock》笔记
    • 《MySQL》笔记
    • 《Git》相关
影音视听
收藏
关于
GitHub (opens new window)

我的公众号

首页
    • 《Vue》笔记
    • 《React》笔记
    • 《NodeJs》笔记
    • 《CSS》笔记
    • 《Redis》笔记
    • 基础入门
    • 《Mock》笔记
    • 《MySQL》笔记
    • 《Git》相关
影音视听
收藏
关于
GitHub (opens new window)
  • Vue2

    • 项目国际化
    • element ui之图片预览
    • element ui之图片上传到阿里云oss上
    • element ui之表格拖拽排序
    • vue动态添加路由后刷新页面白屏问题
    • vue项目安装依赖报错
    • vue项目使用postcss-pxtorem来实现移动端适配
    • vue之低版本浏览器兼容
    • eslint报错汇总
  • Vue3

  • 《Vue》笔记
  • Vue2
心欲无痕
2023-03-02

element ui之表格拖拽排序

最近有这样一个需求,就是需要拖拽表格里的数据进行排序,由于 element ui 中 table 组件自身并不具有拖拽功能,所以这里借助第三方插件 sortablejs 来实现此功能。

SortableJS 是一款功能强大的 js 拖拽库,是基于原生 HTML5 中的拖放 api,不依赖 jQuery 等其他框架,并且支持多种框架(angular、vue、react)等。

1、安装 SortableJS

npm install sortablejs -S
1

2、在需要使用拖拽功能的页面引入该插件。

import Sortable from 'sortablejs'
1

3、实现该拖拽功能:

handleDrop () {
  const tbody = document.querySelector('.el-table__body-wrapper tbody')
  const that = this
  that.sortable && that.sortable.destroy()
  that.sortable = Sortable.create(tbody, {
    onEnd ({ newIndex, oldIndex }) {
      const currRow = that.tableData.splice(oldIndex, 1)[0]
      that.tableData.splice(newIndex, 0, currRow)
      //   拖动后获取newIdex
      const arr = Array.from(that.tableData)
      that.apiObjDrag = arr.map((item, index) => {
        return {
          giftId: item.giftId,
          sort: index + 1
        }
      })
      // 发请求将该数据传递给服务端即可
    }
  })
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

4、在 mounted 生命周期中执行该方法。

mounted () {
  this.$nextTick(() => {
    this.handleDrop()
  })
}
1
2
3
4
5

注意:el-table 中必须指定 row-key,row-key 必须是唯一的,如 ID,不然会出现排序不对的情况,不可用 index,因为拖拽后 index 会变,会有问题。

<el-table
  ref="multipleTable"
  border
  size="mini"
  :data="tableData"
  row-key="giftId"
  tooltip-effect="dark"
  style="width: 100%">
  <el-table-column
    prop="giftId"
    label="礼物ID"
    width="70"
    align="center">
  </el-table-column>
  <el-table-column
    prop="name"
    label="礼物名称"
    align="center">
  </el-table-column>
</el-table>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
编辑 (opens new window)
上次更新: 7/1/2024, 4:56:33 PM
element ui之图片上传到阿里云oss上
vue动态添加路由后刷新页面白屏问题

← element ui之图片上传到阿里云oss上 vue动态添加路由后刷新页面白屏问题→

Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式