列表拖拽排序

需求背景:

         要求在对话框中,展示的动态表格数据可以进行拖拽排序。(vue2+ElementUI)

问题描述: 
        1:不是整个进行拖拽排序,只在排序这一列拖动才可以。
        2:拖拽过后数据错乱,明明拖动了,但是对应的顺序没有变化,即顺序为3拖拽到1的位置,正确顺序还是1、2、3......,错误顺序为:3、2、1、4......

示例图: 

问题解释:
         1.指定行拖拽实现,在排序这一列给了一个类<i class="el-icon-rank drag-handle" />,更改的时候指定带有drag-handle类的元素作为拖拽手柄handle: '.drag-handle', 参考了http://t.csdnimg.cn/hV2EE 。相关资料: sortablejs (Sortable.js中文网)。
相关代码如下:

        安装 sortablejs: 

npm install sortablejs --save

        在 Vue 组件中使用 sortablejs: 

<template>
  <div>
    <div ref="sortableList">
      <el-table
        :data="tableData"
        style="width: 100%"
        row-key="record.id"
      >
        <el-table-column
          prop="name"
          label="Name"
        ></el-table-column>
        <el-table-column
          prop="sortNum"
          label="顺序"
        ></el-table-column>
        <el-table-column label="排序" align="center">
            <i class="el-icon-rank drag-handle" />
        </el-table-column>
        <!-- 其他列 -->
      </el-table>
    </div>
  </div>
</template>

<script>
import Sortable from 'sortablejs';

export default {
  data() {
    return {
      tableData: [
        { id: 1, name: 'John', sortNum: 1 },
        { id: 2, name: 'Doe', sortNum: 2 },
        // 其他行数据
      ],
    };
  },
  mounted() {
    this.initSortable();
  },
  methods: {
    initSortable() {
      const sortableList = new Sortable(this.$refs.sortableList, {
        animation: 150,
        handle: '.drag-handle', // 指定带有drag-handle类的元素作为拖拽手柄
        onEnd: this.onSortEnd,
      });
    },
    onSortEnd(evt) {
      // 拖拽结束时的处理逻辑
      console.log('Drag ended', evt);
      // 在这里可以更新你的数据,以反映新的顺序
      var iList = JSON.parse(JSON.stringify(this.tableData))
      this.tableData = []
      var movedRow = iList[evt.oldIndex]
      iList.splice(evt.oldIndex, 1)
      iList.splice(evt.newIndex, 0, movedRow)
      iList.forEach((item, index) => {
        item.sortNum = index + 1
      })
      this.$set(this, 'tableData', JSON.parse(JSON.stringify(iList)))
    },
  },
};
</script>

        2.出现数据错乱的主要原因就是row-key='id',每一行的id都是唯一且不会重复的,若没有id可以用Math.round()随机数去代替减少重复率。因为我数据都没有id,参考使用Math.round()随机数去代替减少重复率,还是会出现重复的情况,因此又换用了++的方式。

import { dataList } from '@/api/baseData/dataListApi'

let uniqueId = 0

dataList(params).then((response) => {
	var iList1 = JSON.parse(JSON.stringify(response.data))
	// 设置sortNum字段
	iList1.forEach((item, index) => {
	  item.sortNum = index + 1
	  // Math.random() 函数的输出是伪随机的,可能会在不同的行上生成相同的值
	  // item.myId = parseInt(Math.random() * Math.random() * 10000)
	  item.myId = this.assignUniqueId()
	})
	this.$set(this, 'proData', iList1)
	this.listLoading = false
	})
	.catch(() => {
	  this.listLoading = false
	})
	.finally((_) => {
	  this.listLoading = false
	  // 在数据加载完成后,初始化拖拽功能
	  this.initDragAndDrop()
	})

assignUniqueId() {
    return ++uniqueId
},

则对应的:row-key就换成了如下形式。

:row-key="(record) => record.id ? record.id : record.myId"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现列表拖拽排序的方法有很多种,这里介绍一种基于HTML5的拖拽API实现的方法。 首先,需要用HTML的table标签创建一个表格,每行作为一个拖拽项。然后,在每个表格行中添加一个`draggable="true"`属性来启用拖拽功能。接着,给每个表格行添加`ondragstart`和`ondragover`事件处理程序。 在`ondragstart`事件处理程序中,需要设置拖拽数据(即要拖拽的行的数据)以及拖拽效果。例如: ```html <tr draggable="true" ondragstart="dragStartHandler(event)"> <td>Item 1</td> <td>Item 2</td> <td>Item 3</td> </tr> <script> function dragStartHandler(event) { // 设置拖拽数据 event.dataTransfer.setData("text/plain", event.target.innerHTML); // 设置拖拽效果 event.dataTransfer.effectAllowed = "move"; } </script> ``` 在`ondragover`事件处理程序中,需要阻止默认行为并设置拖拽效果。例如: ```html <tr draggable="true" ondragstart="dragStartHandler(event)" ondragover="dragOverHandler(event)"> <td>Item 1</td> <td>Item 2</td> <td>Item 3</td> </tr> <script> function dragOverHandler(event) { // 阻止默认行为 event.preventDefault(); // 设置拖拽效果 event.dataTransfer.dropEffect = "move"; } </script> ``` 最后,在`ondrop`事件处理程序中,需要获取拖拽数据并重新排列表格行。例如: ```html <tr draggable="true" ondragstart="dragStartHandler(event)" ondragover="dragOverHandler(event)" ondrop="dropHandler(event)"> <td>Item 1</td> <td>Item 2</td> <td>Item 3</td> </tr> <script> function dropHandler(event) { // 阻止默认行为 event.preventDefault(); // 获取拖拽数据 const data = event.dataTransfer.getData("text/plain"); // 重新排列表格行 event.target.innerHTML = data; } </script> ``` 以上代码仅为示例,具体实现还需要根据实际情况进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值