Vue.js学习笔记(七)使用sortablejs或el-table-draggable拖拽ElementUI的el-table表格组件

文章目录


前言

记录 el-table-draggable 插件使用方法。


一、el-table-draggable是什么?

el-table-draggable的存在就是为了让vue-draggable支持element-ui中的el-table组件,让表格可以进行行列拖动等功能。

项目地址:https://gitcode.com/gh_mirrors/el/el-table-draggable

二、使用步骤

1.安装使用

javascript 复制代码
npm i -S el-table-draggable

(示例):拖动修改数据排序,输入修改逻辑为,【1,2,3,4】,修改2为3,则3-1。

javascript 复制代码
<template>
	<el-table-draggable @input="dragInputHandler">
		<el-table :data="tableData" row-key="id" v-loading="loading" size="mini" 
		max-height="500px">
			<el-table-column label="展示排序" width="160" prop="sort" align="center" sortable>
              <template slot-scope="{row}">
                <el-input-number v-model="row.newSort" controls-position="right" :min="1"
                  @change="(newSort) => { editSort(row, newSort) }" @blur="() => {
                if (!row.newSort) { $message.warning('序号不能为空'); row.newSort = row.sort;};
                if (Number(row.newSort) <= 0) { $message.warning('序号不能小于1'); row.newSort= row.sort; };
                  }"></el-input-number>
              </template>
            </el-table-column>
          </el-table>
        </el-table-draggable>
</template>


import ElTableDraggable from "el-table-draggable";
export default {
 components: {
    ElTableDraggable,
  },
 methods:{
    /** 输入修改排序 */
    editSort(row, rowSort) {
      if (!rowSort) return;
      const oldSort = Number(row.sort);
      const newSort = Math.min(Number(rowSort), this.tableData.length);
      this.$nextTick(() => {
        this.tableData = this.tableData.map((item) => {
          const itemData = { ...item };
          if (itemData.id === row.id) {
            itemData.sort = newSort;
            itemData.newSort = newSort;
          } else if (oldSort < newSort) {
            if (itemData.sort > oldSort && itemData.sort <= newSort) {
              itemData.sort -= 1;
              itemData.newSort -= 1;
            }
          } else if (oldSort > newSort) {
            if (itemData.sort >= newSort && itemData.sort < oldSort) {
              itemData.sort += 1;
              itemData.newSort += 1;
            }
          }
          return itemData;
        });
      })
    },
     /** 拖拽排序 */
    dragInputHandler(data) {
      this.$nextTick(() => {
        this.tableData = data.map((item, index) => { return { ...item, sort: index + 1,newSort: index + 1 } });
      });
    },
  },
}

2.sortablejs

el-table-draggable插件是基于sortablejs进行封装的,如果已经安装了sortablejs,想实现element的el-table拖拽,则可以进行以下操作。

javascript 复制代码
<template>
    <el-table ref="tableList" :data="tableList" row-key="id" tooltip-effect="dark" 
    max-height="500"  border v-loading="loading" class="draggable">
      <el-table-column label="拖拽排序" width="80" align="center">
        <template slot-scope="{ row }">
          <i class="el-icon-rank allowDrag" style="cursor:pointer"></i>
        </template>
      </el-table-column>
     </el-table>
</template>


import Sortable from "sortablejs";
export default {
 mounted() {
	this.$nextTick(() => {
        this.lineDrop();
	});
 },
 methods:{
     /** 拖拽 */
    lineDrop() {
      const tbody = document.querySelector(".draggable .el-table__body-wrapper tbody");
      const _this = this;
      new Sortable(tbody, {
        animation: 150,
        ghostClass: "ghostClass",
        handle: ".allowDrag",//设置操作区域
        onEnd(evt) {
          const newIndex = evt.newIndex;
          const row = _this.tableList[newIndex];
          const oneRow = _this.tableList[newIndex - 1];
          hotLangSort({
            id: oneRow.id,
            langId: _this.searchParams.langId,
            sort: row.sort,
            type: _this.activeTab === 'series' ? 0 : 1
          }).then(res => {
            _this.$message.success('操作成功')
            _this.$parent.getInfo();
            _this.getInfo()
          }).catch(err => { _this.$message.error('操作失败') }).finally(() => { })
        }
      })
    },
 }
}

总结

以上为拖拽插件学习记录。

相关推荐
泉城老铁14 分钟前
Vue2实现语音报警
前端·vue.js·架构
q***040520 分钟前
Vue项目中 安装及使用Sass(scss)
vue.js·sass·scss
临江仙45538 分钟前
前端骚操作:用户还在摸鱼,新版本已悄悄上线!一招实现无感知版本更新通知
前端·vue.js
lingggggaaaa1 小时前
免杀对抗——C2远控篇&PowerShell&有无文件落地&C#参数调用&绕AMSI&ETW&去混淆特征
c语言·开发语言·笔记·学习·安全·microsoft·c#
lxmyzzs1 小时前
作为一名工程师,何不试试瑞芯微?
笔记·rk3588
前端加油站1 小时前
一种新HTML 页面转换成 PDF 技术方案
前端·javascript·vue.js
w***Q3501 小时前
Vue打包
前端·javascript·vue.js
有事没事实验室1 小时前
router-link的custom模式
前端·javascript·vue.js
wgego2 小时前
polarctf-web做题笔记
笔记·web安全
S***H2833 小时前
Vue语音识别案例
前端·vue.js·语音识别