element关于table拖拽排序问题

element关于table拖拽排序问题element关于table拖拽排序问题

大家好,又见面了,我是你们的朋友全栈君。

博客地址:http://www.globm.top/blog/1/detail/41
最近在使用element table的时候,经常会遇到排序的问题,如果只是简单的排序的话,element官方已经给出了指定的方法

//table的默认排序方式是按ID排序 顺序为递减 这里可以改成其它 比如 order
    <el-table :data="tableData" :default-sort="{prop: 'ID', order: 'descending'}">
      //设置sortable属性时出现排序按钮
      <el-table-column prop="ID" label="座号" sortable>
    </el-table>

但是,element官方组件并不支持拖拽排序,我在这里引入sortablejs实现拖拽排序的功能

  • sortablejs GitHub地址
//sortablejs GitHub地址
https://github.com/SortableJS/Sortable#readme
//安装sortable.js
Install with NPM:

$ npm install sortablejs --save

//在组件内引入
import Sortable from 'sortablejs'

//为需要拖拽排序的表格添加ref属性
<el-table  ref="dragTable">

//在数据渲染完毕添加拖拽事件
created(){ 
   
   this.getBanner()
},
methods:{ 
   
	async getBanner(val){ 
   
          await apiGetBanner().then((res)=>{ 
   
               this.bannerTable = res.data.data;
          })
         this.oldList = this.bannerTable.map(v => v.id);
         this.newList = this.oldList.slice();
         this.$nextTick(() => { 
   
             this.setSort()  //数据渲染完毕执行方法
         })
    }
    setSort() { 
   
        const el = this.$refs.dragTable.$el.querySelectorAll(
        		'.el-table__body-wrapper > table > tbody'
        )[0];
        this.sortable = Sortable.create(el, { 
   
        	// Class name for the drop placeholder,
        		ghostClass: 'sortable-ghost', 
                setData: function(dataTransfer) { 
   
                dataTransfer.setData('Text', '')
            },
           //拖拽结束执行,evt执向拖拽的参数
           onEnd: evt => { 
   
              //判断是否重新排序
              if(evt.oldIndex !== evt.newIndex){ 
   
                  let data = { 
   
                     id:this.bannerTable[evt.oldIndex].id,
                     banner_order:evt.newIndex
                  }
                  //数据提交失败则恢复旧的排序
                  apiPutBanner(data).catch(()=>{ 
   
                     const targetRow = this.bannerTable.splice(evt.oldIndex, 1)[0];
                     this.bannerTable.splice(evt.newIndex, 0, targetRow);
                  })
              }
            }
        })
    }
}

如果需要列拖拽的话,可以参考下面的代码,和上面是一样的原理,在这里我就不赘述了

//行拖拽
    rowDrop() { 
   
      const tbody = document.querySelector('.el-table__body-wrapper tbody')
      const _this = this
      Sortable.create(tbody, { 
   
        onEnd({ 
    newIndex, oldIndex }) { 
   
          const currRow = _this.tableData.splice(oldIndex, 1)[0]
          _this.tableData.splice(newIndex, 0, currRow)
        }
      })
    },
    //列拖拽
    columnDrop() { 
   
      const wrapperTr = document.querySelector('.el-table__header-wrapper tr')
      this.sortable = Sortable.create(wrapperTr, { 
   
        animation: 180,
        delay: 0,
        onEnd: evt => { 
   
          const oldItem = this.dropCol[evt.oldIndex]
          this.dropCol.splice(evt.oldIndex, 1)
          this.dropCol.splice(evt.newIndex, 0, oldItem)
        }
      })
    }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149205.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Mysql explain-type使用详解

    Mysql explain-type使用详解下面是测试用例,楼主的测试使用的MySQL版本是5.6.27-log。show createtableuser_man;CREATETABLE`user_man`( `manid`bigint(20)NOTNULLAUTO_INCREMENT, `manname`varchar(32)DEFAULTNULL, `manage`int(6)DEFAULTNULL…

    2022年10月17日
    0
  • 利用两个dll实现全局钩子

    利用两个dll实现全局钩子全局消息钩子的钩子函数一定要再dll中,然后启动安装钩子不能在dll中,要是我想在程序开始时安装钩子怎么办。很简单利用两个钩子就行了,只要安装钩子和钩子函数不在同一个dll就行了。下面请看案例(编译

    2022年7月2日
    16
  • mysql中的时间字段用什么数据类型

    mysql中的时间字段用什么数据类型Mysql中用来存储日期的数据类型有三种:Date、Datetime、TimestampDate数据类型:用来存储没有时间的日期。Mysql获取和显示这个类型的格式为“YYYY-MM-DD”。按照标准的SQL,不允许其他格式。在UPDATE表达式以及SELECT语句的WHERE子句中应使用该格式。例如:mysql> SELECT * FROM tbl_nameWHERE d…

    2022年6月13日
    55
  • 漫画网站服务器,建立家庭漫画服务器,从iPad上看漫画

    漫画网站服务器,建立家庭漫画服务器,从iPad上看漫画好,故事开始。以前就在想,在retina屏幕的iPad上看漫画该多爽。可是现在捧着iPad却发现看漫画很困难,自己电脑上下载了一堆漫画都是jpg图片,导入iBook也很麻烦。现在通过家里的iMac建立一个家庭漫画服务器,直接在线浏览速度快、体验好,而且还很方便。以后下载了漫画往目录里一扔,就可以拿起iPad看了。需要工具:MAMP是Mac下出名的Apache-MySQL-PHP服务器套件。…

    2022年6月17日
    22
  • 程序解码错误:Accept-Encoding“: “gzip, deflate, br[通俗易懂]

    程序解码错误:Accept-Encoding“: “gzip, deflate, br[通俗易懂]请求头设置”Accept-Encoding”:”gzip,deflate,br”返回的数据是乱码,无论设置utf-8、gbk、gb2312都无法解码一个奇怪的现象是本地测试可以正常解码,代码在服务器上运行就无法解码,最终将该请求头去除就正常了。…

    2022年7月15日
    50
  • Android游戏引擎_开源可视化规则引擎

    Android游戏引擎_开源可视化规则引擎1、AngleAngle是一款专为Android平台设计的,敏捷且适合快速开发的2D游戏引擎,基于OpenGLES技术开发。该引擎全部用Java代码编写,并且可以根据自己的需要替换里面的实现,缺陷在于文档不足,而且下载的代码中仅仅包含有少量的示例教程。最低运行环境要求不详。项目地址:http://code.google.com/p/angle/2、Rokonrokon是一

    2022年9月19日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号