vue + ElementUI 封装的公用表格table组件实现拖拽列表功能(Sortablejs)

vue + ElementUI 封装的公用表格table组件实现拖拽列表功能(Sortablejs)

vue 实现表格拖拽功能有几种方式,比如vuedraggablevue cardDraggervue-draggingSortablejs。本文主要是介绍在table是封装的公用组件的时候,使用sortablejs有时候拖拽出现效果失效、拖拽延迟(其实就是父子组件之间的通信问题,没有达到数据实时响应,有的不行也可以使用this.$set(Vue.set)改变表格数据的数组)。

Sortablejs

Sortable.js中文文档链接:http://www.itxst.com/sortablejs/neuinffi.html.

在vue里安装Sortablejs:

npm install sortablejs --save

在vue项目文件引用:方式一

import Sortable from ‘sortablejs’;

使用方法

在vue组件的mounted方法里,执行需要行拖拽或者列拖拽的方法 rowDrop()、columnDrop().
HTML

// An highlighted block
<el-table ref="table" :id="'table_'+toolbarId" :data="tableData" border :height="height" row-key="id"
@selection-change="handleSelectionChange" 
@row-click="rowclick" :row-class-name="tableRowClassName" :row-style="selectHignLiaght"
:highlight-current-row="highlightCurrentRow" @current-change="handleChange">
   <el-table-column v-if="showSelection" type="selection" width="55" align="center">
   </el-table-column>
   <el-table-column v-if="highlightCurrentRow" width="55" align="center">
       <template slot-scope="scope">
           <el-radio v-model="radiovlaue" :label="scope.$index+''">{{&nbsp;}}</el-radio>
       </template>
   </el-table-column>
   <slot></slot>
</el-table>

JS

// An highlighted block
mounted() {
	this.rowDrop();
	this.columnDrop();
}

在vue组件methods里定义行拖拽和列拖拽的方法

行拖拽

rowDrop() { // 行拖拽
     // 此时找到的元素是要拖拽元素的父容器
     console.log(this.toolbarId) // 只是表格id,可以忽略
     const tbody = document.querySelector('#table_'+this.toolbarId+' .el-table__body-wrapper tbody');
     const _this = this;
     Sortable.create(tbody, {
         //  指定父元素下可被拖拽的子元素
         draggable: ".el-table__row",
         animation: 180,
         sort: true, // 是否排序
         onEnd (evt) {
         //这里为什么和网上的不太一样,是因为我的是table是公用组件,子组件调用的时候需要数据双向绑定
             _this.tableData.splice(evt.newIndex, 0, _this.tableData.splice(evt.oldIndex, 1)[0]);
             var newArray = _this.tableData.slice(0);
             _this.tableData = [];
             _this.$nextTick(function () {
                 _this.tableData = newArray;
             });
         }
     });
 },
}

列拖拽

rowDrop() { // 行拖拽
 const wrapperTr = document.querySelector('#table_'+this.toolbarId+' .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);
      }
  });
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值