el-table实现可拖拽移动列和动态排序字段

news2025/1/11 22:43:34
🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿
🍟欢迎来到前端初见的博文,本文主要讲解在工作中以一个案例el-table实现可拖拽移动列和动态排序字段🍟
👨‍🔧 个人主页 : 前端初见
🥞喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

  • 前言
  • 一、el-table实现可拖拽移动列
        • 1.调取接口获取数据table数据
        • 2.参考接口表格字段mock页面要调整的数据
        • 3.引入mock的字段顺序h和相关第三方表格拖拽
        • 4.el-table渲染相关数据
        • 5.el-table拖拽实现
  • 二、el-table表格动态排序字段
        • 1.根据mock的动态表头实现一个控制字段的表格
        • 2.相关方法
        • 3.表格字段下移方法
  • 总结


前言

  1. 背景
    公司给了一个需求,需要拖拽表格和自定义表格字段,于是我就开始网上冲浪,于是自己封装了一套方法,分享给大家,有不明白的可以私信我或者发在评论区
    el-table自带支持按列排序,但是当用户需要自己拖拽进行排序时,现有组件无法满足。
    是时候安利五脏俱全的js库了,SortableJS
    简单易用,官方文档上有简单列表排序,多列表相互拖拽,克隆,禁止sorting等多种demo,现在只记录关于简单排序的使用方法
    SortableJS官网

一、el-table实现可拖拽移动列

需要安装插件Sortable.js

npm i  sortablejs --save
或者
yarn add sortablejs --save

1.调取接口获取数据table数据

this.$axios
        .post("personnel/list", formData)
        .then((response) => {
          // console.log(response);
          this.dynamicTableData = response.data;
        }))

接口数据
在这里插入图片描述

2.参考接口表格字段mock页面要调整的数据

注意这些数据prop是对应接口的字段的,以下数据的顺序会控制页面显示顺序
动态表头数据

export default [
  {
    disabled: true,
    isCheck: true,
    fixed:true,
    width: "100px",
    label: "姓名",
    prop: "name"
  },
  {
    disabled: false,
    isCheck: true,
    width: "180px",
    label: "单位",
    prop: "unitName"
  },
  {
    disabled: false,
    isCheck: true,
    width: "80px",
    label: "部门",
    prop: "departmentName"
  },
  {
    disabled: false,
    isCheck: true,
    width: "80px",
    label: "性别",
    prop: "sex"
  },
  {
    disabled: false,
    isCheck: true,
    width: "80px",
    label: "出生年月",
    prop: "birthday"
  },
  {
    disabled: false,
    isCheck: true,
    width: "100px",
    label: "籍贯",
    prop: "places"
  },
  {
    disabled: false,
    isCheck: true,
    width: "140px",
    label: "参加工作时间",
    prop: "workTime"
  },
  {
    disabled: false,
    isCheck: true,
    width: "100px",
    label: "行政职务",
    prop: "duty"
  },
  {
    disabled: false,
    isCheck: true,
    width: "140px",
    label: "行政职务时间",
    prop: "dutyTime"
  },
  {
    disabled: false,
    isCheck: true,
    width: "80px",
    label: "行政职级",
    prop: "jobGrade"
  },
  {
    disabled: false,
    isCheck: true,
    width: "140px",
    label: "行政职级时间",
    prop: "jobGradeTime"
  },
  {
    disabled: false,
    isCheck: true,
    width: "110px",
    label: "等级",
    prop: "rank"
  },
  {
    disabled: false,
    isCheck: true,
    width: "80px",
    label: "等级时间",
    prop: "rankTime"
  },
  {
    disabled: false,
    isCheck: true,
    width: "100px",
    label: "法律职务",
    prop: "legislation"
  },
  {
    disabled: false,
    isCheck: true,
    width: "140px",
    label: "法律职务时间",
    prop: "legislationTime"
  },
  {
    disabled: false,
    isCheck: true,
    width: "80px",
    label: "全日制学历",
    prop: "fullTimeEducation"
  },
  {
    disabled: false,
    isCheck: true,
    width: "80px",
    label: "全日制学位",
    prop: "fullTimeDegree"
  },
  {
    disabled: false,
    isCheck: true,
    width: "80px",
    label: "全日制专业",
    prop: "fullTimeMajor"
  },
  {
    disabled: false,
    isCheck: true,
    width: "100px",
    label: "政治面貌",
    prop: "politicsStatus"
  },
];

3.引入mock的字段顺序h和相关第三方表格拖拽

import Sortable from "sortablejs";
// 引入Sortable表格拖拽插件
import schemas from "./DynamicTableLabels";
// 引入mock的数据

4.el-table渲染相关数据

  • 注意点:
  • el-table组件中的data绑定的是接口字段
  • el-table-column通过遍历mock的数据渲染prop,lable, 字段和接口数据需要一一对应,这样就可以实现完成渲染
  • 复选框和序号是固定
    <el-table
      v-if="isShowSchemaTable"
      :data="tableData.list"
      :height="getTableHeight"
      style="margin-bottom: 5px"
      ref="schema-table"
      class="ELtable"
      size="small"
      stripe
      :key="tableKey"
      :row-key="
        (row) => {
          return row.id;
        }
      "
      id="outTable"
      @select="handleSelect"
      @select-all="handleSelectAll"
      @selection-change="updateSelection"
    >    
      <!-- 复选框-->
      <el-table-column type="selection" width="55" :reserve-selection="true">
      </el-table-column>
      <el-table-column
        label="序号"
        type="index"
        align="center"
        fixed
        width="50px"
      ></el-table-column>
        <el-table-column
        v-for="(item, index) in schemas"
        v-if="item.isCheck && item.prop !== 'remark'"
        :label="item.label"
        :prop="item.prop"
        :width="item.width"
        align="center"
      >
        <template slot-scope="sc">
          <div>
            <span v-if="dateFileds.includes(item.prop)">
              {{ getFormatDate(sc.row[item.prop]) }}
            </span>
            <span v-else>{{ sc.row[item.prop] }}</span>
          </div>
        </template>
      </el-table-column>
    </el-table>

5.el-table拖拽实现

挂载时开始调用列拖拽方法

  async mounted() {
    //表格拖拽方法
    this.columnDrop();
  },

相关方法封装

    /**
     * 列拖拽
     */
    columnDrop() {
      const _this = this;
      // console.log("数据", this.schemas);
      const wrapperTr = document.querySelector(".el-table__header-wrapper tr");
      this.sortable = Sortable.create(wrapperTr, {
        animation: 180,
        delay: 0,
        onEnd: (evt) => {
          const empty = 2;
          // 跳过显示的列数量,如开头我们用了一个多选框,h和序号 
          const oldItem = this.schemas[evt.oldIndex - empty];
          this.schemas.splice(evt.oldIndex - empty, 1);
          this.schemas.splice(evt.newIndex - empty, 0, oldItem);
          _this.reDrawTable();
          // 每一次拖拽后都要重绘一次
        },
      });
    },
    /**
     * 触发表格重绘
     */
    reDrawTable() {
      this.tableKey = Math.random();
      this.$nextTick(() => {
        // this.rowDrop();
        this.columnDrop();
      });
    },

二、el-table表格动态排序字段

1.根据mock的动态表头实现一个控制字段的表格

  • 注意
    • el-table是mock的数据
    • 排序的上移和下移传入点击事件传入索引
      在这里插入图片描述
    <el-dialog
      title="自定义表格排序顺序"
      :visible.sync="dialogVisibleShow"
      append-to-body
      :close-on-click-modal="false"
      width="500px"
      border
      id="uptishi"
    >
      <p style="font-size: 14px; color: red; margin: 0px 0 5px 15px">
        <i style="font-size: 16px" class="el-icon-warning"></i>
        温馨提示:修改后的结果视图设置会立即生效
      </p>
      <el-table id="uptable" :data="schemas" ref="curtable" height="500">
        <el-table-column type="index" label="序号" width="80"></el-table-column>
        <el-table-column prop="label" align="cneter" label="列名" width="150">
        </el-table-column>
        <el-table-column label="排序" min-width="150">
          <template slot-scope="scope">
            <el-button
              type="text"
              style="padding: 0"
              :disabled="scope.$index == 0"
              @click="moveUpward(scope.row, scope.$index)"
              >上移</el-button
            >
            <el-button
              type="text"
              style="padding: 0"
              :disabled="scope.$index + 1 == schemas.length"
              @click="moveDown(scope.row, scope.$index)"
              >下移</el-button
            >
          </template>
        </el-table-column>
      </el-table>
    </el-dialog>

2.相关方法

    /**
     * 表格字段上移方法
     */
    moveUpward(row, index) {
      // schemas 列数据
      if (index > 0) {
        let upData = this.schemas[index - 1];
        this.schemas.splice(index - 1, 1);
        this.schemas.splice(index, 0, upData);
        console.log("移动成功");
      } else {
        console.log("第一条数据");
        this.$message({
          message: "已经是第一条,上移失败",
          type: "error",
        });
      }
    },

3.表格字段下移方法

    /**
     * 表格字段下移方法
     */
    moveDown(row, index) {
      if (index + 1 == this.schemas.length) {
        this.$message({
          message: "已经是最后一条,下移失败",
          type: "error",
        });
      } else {
        let downData = this.schemas[index + 1];
        this.schemas.splice(index + 1, 1);
        this.schemas.splice(index, 0, downData);
      }
    },

效果图:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

总结

如果这篇【文章】有帮助到你💖,希望可以给我点个赞👍,创作不易,如果有对前端端或者对python感兴趣的朋友,请多多关注💖💖💖,咱们一起探讨和努力!!!
👨‍🔧 个人主页 : 前端初见

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/561316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能Python-python_nanmean

Python的nanmean函数&#xff1a;用于计算数组的平均值 Python引入的nanmean函数是一种快速而有效的计算数组平均值的方法。与其他Python中的平均值函数不同&#xff0c;nanmean函数可以处理NaN值&#xff0c;即缺失值。在数据科学和统计学中&#xff0c;处理缺失值是一个常见…

chatgpt赋能Python-python_nontype

介绍Python中的NoneType: 完整的解释和实例 在Python编程中&#xff0c;有一个特殊的数据类型叫做"NoneType"&#xff0c;它通常被简称为"None"。这个数据类型被用于表示没有值或空值&#xff08;null&#xff09;。在本文中&#xff0c;我们将探索NoneTy…

Spring(五大类注解,对象的三种注入方式及其优缺点)

目录 1.存储 Bean 对象 1.1前置工作:配置扫描路径 1.2添加注解存储 Bean 对象 1.2.1 Controller [控制器存储] 1.2.2 Service&#xff08;服务存储&#xff09; 1.2.3 Repository&#xff08;仓库存储&#xff09; 1.2.4 Component&#xff08;组件存储&#xff09; 1.…

chatgpt赋能Python-python_os怎么用

Python OS模块&#xff1a;让你的文件操作更高效 在Python编程中&#xff0c;文件和文件夹的操作是非常常见的&#xff0c;例如创建、删除、修改、读取等等。这些任务都需要使用操作系统的命令&#xff0c;但是如果每次都手动调用操作系统命令&#xff0c;这样会使编程效率低下…

Vulkan Tutorial 2 presentation

目录 5 窗口表面 6 交换链 7 图像视图 5 窗口表面 由于Vulkan是一个与平台无关的API&#xff0c;它自己不能直接与窗口系统对接。为了在Vulkan和窗口系统之间建立连接&#xff0c;将结果呈现在屏幕上&#xff0c;我们需要使用WSI&#xff08;窗口系统集成&#xff09;扩展。…

【瑞萨RA_FSP】DMAC/DTC——直接存储器访问与数据传输

文章目录 一、DMAC和DTC模块简介1. DMAC 特性2. DTC 特性 二、DMAC 模块框图分析三、DMAC 传输模式1. 正常传输模式2. 重复传输模式3. 块传输模式4. 重复-块传输模式 四、DTC 模块框图分析五、DTC 传输模式1. 正常传输模式2. 重复传输模式3. 块传输模式 六、DMAC和DTC关键特性对…

WMS 概述 -- “窗口管理员“

WMS 概述 -- "窗口管理员" 1、WMS 职责2、涉及元素3、WMS、AMS与Activity间的关系 1、WMS 职责 WMS职责理解窗口管理WMS 是窗口的管理者&#xff0c;它负责窗口的启动、添加和删除&#xff0c;另外窗口的大小和层级也是由WMS 进行管理的。窗口管理的核心成员有 Disp…

结构体总结

目录 1.普通结构体 2.定义结构体并同时建立变量 3.匿名结构体 4.typedef重命名 5.typedef省略结构体名字 6.结构体数组 7.结构体指针 8.结构体嵌套 9.结构体链表&#xff08;头插法&#xff09; 10.结构体中的函数指针 11.结构体的构造函数和初始化列表 1.普通结构体 stru…

chatgpt赋能Python-python_paas

Python PaaS&#xff1a;简介和未来趋势 随着云计算的不断普及&#xff0c;PaaS&#xff08;平台即服务&#xff09;正在成为越来越受欢迎的选择。PaaS可以帮助企业轻松构建、部署和管理应用程序&#xff0c;无需担心底层基础架构的问题。在PaaS领域&#xff0c;Python正在成为…

2023年护网蓝队初级面试总结

00.护网面试步骤是什么样的 投递简历-安全服务公司HR先筛选一下简历&#xff0c;交给技术负责人面试一下&#xff0c;推荐给安全厂商&#xff08;360、奇安信、安恒、绿盟&#xff09; 安全设备厂商HR筛选一下简历&#xff0c;安全设备厂商安排技术笔试和面试&#xff08;技术…

Kubernetes高可用集群二进制部署(Runtime Docker)v1.21版本

Kubernetes高可用集群二进制部署&#xff08;Runtime Docker&#xff09; Kubernetes&#xff08;简称为&#xff1a;k8s&#xff09;是Google在2014年6月开源的一个容器集群管理系统&#xff0c;使用Go语言开发&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xf…

chatgpt赋能Python-python_num怎么用

Python Num怎么用&#xff1f;一个有10年Python编程经验的工程师来告诉你 Python是一种被广泛应用的编程语言&#xff0c;它的发展历程已经超过了20年。而其中的NumPy库则成为了Python编程中最重要的一部分之一。NumPy是一个Python库&#xff0c;它提供了大量针对数字的操作函…

AI宝典:AI超强工具大整合

&#x1f604;&#x1f604;个人介绍 光子郎.进行开发工作七年以上&#xff0c;目前涉及全栈领域并进行开发。会经常跟小伙伴分享前沿技术知识&#xff0c;java后台、web前端、移动端&#xff08;Android&#xff0c;uniapp&#xff0c;小程序&#xff09;相关的知识以及经验体…

微服务实战项目-学成在线-项目介绍以及环境搭建

学成在线-项目介绍&环境搭建 1.项目背景 1.1 在线教育市场环境 以下内容摘自https://report.iresearch.cn/content/2021/01/358854.shtml 在线教育行业是一个有着极强的广度和深度的行业&#xff0c;从校内到校外&#xff1b;从早幼教到职业培训&#xff1b;从教育工具…

Prometheus(普罗米修斯)

Prometheus : 入门 Prometheus简介Prometheus 的主要特点Prometheus架构&#xff1a;什么时候用它合适什么时候用它不合适Prometheus VS InfluxDB基本概念数据模型metric types&#xff08;指标类型&#xff09; Prometheus 安装部署二进制安装部署1、将安装包prometheus-2.6.1…

stable-diffusion-webui(1.2.1版本) win10系统本地电脑部署

在安装stable-diffusion-webui(1.2.1版本)之前需要确认win10本地电脑具有的环境 1.显卡类型&#xff1a;NVIDIA&#xff08;英伟达&#xff09; 建议显存高于4G以上&#xff0c;这样512*512的还是可以运行的 2.python(版本必须最好是3.10.6&#xff09;和 git最新版 正式…

【MySQL高级篇笔记 (上) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、MySQL的数据目录 小结 二 、用户与权限管理 MySQL8密码管理(了解) 权限管理 授予权限的原则 收回权限 权限表 访问控制(了解) 角色管理 三、逻辑架构 服务器处理客户端请求 MySQL 中的 SQL执行流程 SQL语法顺序…

chatgpt赋能Python-python_numpy画图

Python Numpy画图&#xff1a;快速绘制高质量的数据可视化 Python语言不仅在数据科学和人工智能领域得到广泛应用&#xff0c;还被广泛用于数据可视化方面。NumPy是一个Python的科学计算库&#xff0c;提供了高性能的多维数组对象和广播功能&#xff0c;被广泛应用于数据科学、…

Packet Tracer – VLAN 间路由练习

Packet Tracer – VLAN 间路由练习 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 R1 G0/0 172.17.25.2 255.255.255.252 不适用 G0/1.10 172.17.10.1 255.255.255.0 不适用 G0/1.20 172.17.20.1 255.255.255.0 不适用 G0/1.30 172.17.30.1 255.255.255…