element-table 行的拖拽更改顺序(无需下载sortableJs

样例展示:vue+element+

通过阅读element文档我们发现element并不提供拖拽相关的api 

本博客通过element提供的行类名 注册函数  实现行与行的拖拽

原理:

通过el-table的 row-class-name 设置行的自定义class类名

在mount和el-table更新时调用this.$nextTick获取dom元素

设置dom的 draggable为true和注册增加拖拽事件

在拖拽事件内 通过 修改数据的index的方式实现 行位置的移动

1.设置el-table 的行样式类名

 这里是用的是 function  

            <el-table
              :data="outputData"
              :row-class-name="activeClass"
              class="outputTable"
              >
               .....
             </el-table>
    activeClass ({ row, rowIndex }) {
      if (rowIndex === this.newDragIndex) {
        return 'isDragBox active-drag'
      }
      return 'isDragBox'
    }

 2.在mounted获取到row元素

将row设置为的draggable:true拖拽的类型

注册监听函数:

dragstart-拖拽开始 获取拖拽的当前元素index

dragover-拖拽中途 获取拖拽停留的元素的new index

dragEnd-拖拽结束 将数据进行变化

this.$nextTick(() => {
    const dragBox = document.querySelectorAll('.outputTable .isDragBox')
    dragBox.forEach((i, idx) => {
        i.setAttribute('draggable', 'true')
        i.ondragstart = () => this.dragStartItem(idx)
        i.ondragover = () => this.dragOverItem(idx)
        i.ondragend = () => this.dragEndItem()
    })
})

3.dragEnd获取拖拽元素的数据data

将table表格数据去除掉原有的元素 ,将新元素添加到新坐标

    dragStartItem (idx) {
      this.dragIndex = idx
    },
    dragOverItem (index) {
      this.newDragIndex = index
    },
    dragEndItem () {
      const data = this.outputData[this.dragIndex]
      this.outputData.splice(this.dragIndex, 1)
      this.outputData.splice(this.newDragIndex, 0, data)
    },

 4.css美化 增加蓝色下划线

注意这里 z-index一定要加否则下划线无法超过table层级无法显示

.isDragBox{
    cursor: move;
    position: relative;
}
.active-drag{
     position: relative;
      &::after {
        content: '';
        position: absolute;
        top: -1px;
        left: 0;
        width: 100%;
        height: 2px;
        background-color: #4B79F3;
        z-index:99;
  }
}

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Element UI 的 el-table 中实现拖拽并且对数据的顺序更改,可以使用 `vue-draggable` 插件。以下是实现步骤: 1. 安装 `vue-draggable` 插件: ```bash npm install vuedraggable --save ``` 2. 在需要使用的组件中引入: ```js import draggable from 'vuedraggable' ``` 3. 在 el-table 中添加拖拽指令和 `draggable` 组件: ```html <el-table v-draggable="{ group: 'table', ghostClass: 'dragging', handle: '.drag-handle', animation: 300, onEnd: onDragEnd }" > <el-table-column label="名称" prop="name"> <template slot-scope="{ row }"> <span class="drag-handle">☰</span> <span>{{ row.name }}</span> </template> </el-table-column> <el-table-column label="类型" prop="type"></el-table-column> <el-table-column label="值" prop="value"></el-table-column> </el-table> <draggable v-model="tableData" :options="{ group: 'table', handle: '.drag-handle', animation: 300, onEnd: onDragEnd }" > <template slot="item" slot-scope="{ element }"> <tr> <td> <span class="drag-handle">☰</span> <span>{{ element.name }}</span> </td> <td>{{ element.type }}</td> <td>{{ element.value }}</td> </tr> </template> </draggable> ``` 其中 `v-draggable` 是 el-table 的自定义指令,`draggable` 是 `vue-draggable` 组件,`tableData` 是 el-table 的数据源。在 el-table 中,通过 `slot-scope` 将数据传递给模板,以便在中添加拖拽手柄。在 `draggable` 组件中,使用 `v-model` 绑定数据源,通过 `slot` 插槽渲染数据。 4. 实现拖拽结束后的回调函数 `onDragEnd`: ```js methods: { onDragEnd(event) { this.tableData.splice( event.newIndex, 0, this.tableData.splice(event.oldIndex, 1)[0] ) } } ``` 在拖拽结束后,将拖拽前的数据从数组中删除,再将其插入到拖拽后的位置。 这样就可以在 el-table 中实现拖拽并且对数据的顺序更改了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值