实现效果:

(1)el-table的行拖拽(可整行拖拽)

(2)页面中有el-table,el-table中点击出现弹框,弹框中有el-table,实现弹框中的表格拖拽

 实现方法:

以上两种方式的共同步骤

1、安装sortablejs

cnpm install sortablejs --save

2.在对应的vue页面种引入Sortable

import Sortable from ‘sortablejs’

3.使用el-table需有唯一的key值,如id

<el-table row-key="id" :data="tableData" style="width: 100%">
  <el-table-column prop="date" label="日期" width="180"></el-table-column>
  <el-table-column prop="name" label="姓名" width="180"></el-table-column>
  <el-table-column prop="address" label="地址"></el-table-column>
</el-table>

4.vue 页面中的tableData数据

data() {
  return {
    tableData: [{
      id:7458963256145,
      date: '2016-05-02',
      name: '王小虎',
      address: '上海市普陀区金沙江路 1518 弄'
    }, {
      id:1256358945623,
      date: '2016-05-04',
      name: '王小虎',
      address: '上海市普陀区金沙江路 1517 弄'
    }, {
      id:7485968563232,
      date: '2016-05-01',
      name: '王小虎',
      address: '上海市普陀区金沙江路 1519 弄'
    }, {
      id:4230568745963,
      date: '2016-05-03',
      name: '王小虎',
      address: '上海市普陀区金沙江路 1516 弄'
    }]
  }
}

5.vue页面中使用mounted挂载行拖拽的方法,使其页面加载即可调用

mounted () {
  // 行拖拽排序
  this.rowDrop()
}

6.行拖拽方法

methods: {
  // 行拖拽
  rowDrop () {
    let tbody = document.querySelector('.el-table__body-wrapper tbody')
    let _this = this
    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) { // 拖拽时候添加有新的节点的时候发生该事件
        console.log('onAdd.foo:', [evt.item, evt.from])
      },
      onUpdate: function (evt) { // 拖拽更新节点位置发生该事件
        console.log('onUpdate.foo:', [evt.item, evt.from])
      },
      onRemove: function (evt) { // 删除拖拽节点的时候促发该事件
        console.log('onRemove.foo:', [evt.item, evt.from])
      },
      onStart: function (evt) { // 开始拖拽出发该函数
        console.log('onStart.foo:', [evt.item, evt.from])
      },
      onSort: function (evt) { // 发生排序发生该事件
        console.log('onUpdate.foo:', [evt.item, evt.from])
      },
      onEnd ({ newIndex, oldIndex }) { // 结束拖拽
        let currRow = _this.tableData.splice(oldIndex, 1)[0]
        _this.tableData.splice(newIndex, 0, currRow)
      }
    })
  }
}

以上行拖拽的方法适用于实现效果的第一种情况,即根据querySelector('.el-table__body-wrapper tbody')可找到页面中的el-table实现拖拽。

实现el-dialog中的el-table拖拽方式为:

template中的弹框样式:

<div class="data-box">
			<el-dialog title="xxxxx" :visible.sync="showDialog" width="42%">
				<el-table class="drow_table"></el-table>
			</el-dialog>
		</div>

在点击出现弹框的方法处初始化行拖拽的方法:

nextTick的使用十分关键,避免因表格没有加载完成出现查询不到el-table从而无法使用行拖拽的情况。

showData() {
				this.$nextTick(() => {
					this.rowDrop()
				})
			
		},

且在行拖拽的方法进行querySelector的查找时,需对查询到dialog的el-table的类中,即:

	rowDrop() {
			let tbody = document.querySelector('.drow_table .el-table__body-wrapper tbody')
// 以下与上面行拖拽的方法相同
}

这样就实现了el-table的行拖拽功能。

本博客参考了Vue Element 表格实现拖拽排序_阳光的男夹克的博客-CSDN博客_element table 拖拽排序

Logo

基于 Vue 的企业级 UI 组件库和中后台系统解决方案,为数万开发者服务。

更多推荐