自定义表格_可拖拽排序

在做后台管理系统的时候,经常需要表格里面的每行排序,自定义可拖拽表格,更改样式方便。

一、实现效果

 进行拖拽演示:

可拖拽排序表格

无滚动条样式:

有滚动条样式:

二、代码

使用react+scss+ts,实现页面。

在pages文件夹下新建一个文件夹 tablePage 。然后在tablePage 下面新建两个文件,index.tsx   ,    index.scss  。

index.tsx 

import './index.scss';
import { useState, useEffect } from "react";function FileTest() {// 表格body的滚动条const [scrollWidth, setScrollWidth] = useState(0)//挂载后,计算表格body是否有滚动条,从而改变宽度(页面高度变化,以及表格展示内容条数变化,都需要调用此方法)function changeWidth() {var myElement: any = document.getElementById('myElement');var widthWithBorder = myElement.offsetWidth;var widthWithoutBorder = myElement.clientWidth;setScrollWidth(widthWithBorder - widthWithoutBorder);}useEffect(() => {changeWidth();}, []);//表格标题,和宽度占父元素百分比,(采用百分比的方式,是因为需要进行电脑大小屏适配,这样可以确保表格充满屏幕),字符串为空的地方是间隔。let tableTitle = [['', 2],['序号', 5],['姓名', 12],['', 1],['部门', 12],['', 1],['组织', 30],['', 1],['时间', 10],['', 1],['状态', 10],['', 1],['操作', 14]]//-------------------------------------------------  拖拽   ----------------------------------------------------------------/const [dragging, setDragging] = useState(null)function dragStart(e: any) {e.stopPropagation();setDragging(e.target); // 保存被拖动的行}// 判断是兄还是弟function getSort(draggingElement: any, targetElement: any, tbody: any) {var siblings = [];let number = tbody.children.lengthfor (var i = 0; i < number; i++) {siblings.push(tbody.children[i]);}// 正在拖拽的var index = siblings.indexOf(draggingElement);// 当前悬浮的var targetIndex = siblings.indexOf(targetElement);if (targetIndex > -1) {if (index === targetIndex) {return false;} else {if (targetIndex === number.length - 1) {// 此时在最后插入元素return null;} else if (index < targetIndex) {return siblings[targetIndex + 1] || null;} else if (index > targetIndex) {return siblings[targetIndex] || null;}}}return null;}function onDropEvent(e: any) {e.preventDefault();e.stopPropagation();var table: any = document.getElementById('sortable-table');var tbody = table.getElementsByTagName('tbody')[0];if (dragging) {var afterElement = getSort(dragging, e.target, tbody);if (e.target && e.target.tagName === "TR") {e.target.style.border = '';e.target.style.borderBottom = '1px solid #F2F5F4';if (afterElement !== false) {if (afterElement === null) {tbody.appendChild(dragging);} else {tbody.insertBefore(dragging, afterElement);}}}}}function onDragOverEvent(e: any) {e.preventDefault(); // 阻止默认行为if (e.target.tagName === "TR") {e.target.style.border = '1px solid #1BCEB2';}}function ondragLeave(e: any) {// 清除拖拽区域样式if (e.target.tagName === "TR") {e.target.style.border = '';e.target.style.borderBottom = '1px solid #F2F5F4';}}return (<div className='omm-edu-Manage-box-set'>{/* 左侧和上侧,留有导航栏位置 ,如不需要,直接将top和left设置为0即可*/}<div className="omm-edu-Manage-content-set">{/* 表格 */}<div className="omm-table-father-set"><table border={0} className='omm-table-box-set' id="sortable-table"><thead><tr className='omm-table-title-box-set'>{tableTitle.map((item, index) => (<th key={index} className='omm-table-title-set' style={{ width: `${item[1]}%` }}>{item[0]}</th>))}</tr></thead><tbody className='omm-table-content-box-all-set' id="myElement" style={{ width: `calc(100% + ${scrollWidth}px)` }} onDrop={(e) => { onDropEvent(e) }} onDragOver={(e) => { onDragOverEvent(e) }} onDragLeave={(e) => { ondragLeave(e) }}>{[1, 2, 3, 4, 5, 6, 7].map((item, indexA) => (<tr key={indexA} className='omm-table-content-box-set' draggable="true" onDragStart={(e) => { dragStart(e) }}>{tableTitle.map((item, index) => (<td key={index} className='omm-table-content-set' style={{ width: `${item[1]}%` }}>{index === 1 ? indexA: item[0]}</td>))}</tr>))}</tbody></table></div></div></div>);
}export default FileTest;

index.scss

table {border-collapse: collapse;
}.omm-edu-Manage-box-set {width: 100%;height: 100%;background-color: #F7FAF8;.omm-edu-Manage-content-set {position: absolute;top: 72px;left: 216px;right: 20px;bottom: 12px;background-color: #fff;border-radius: 12px;min-width: 1000px;min-height: 500px;padding: 16px;.omm-table-father-set {position: absolute;top: 16px;left: 16px;right: 16px;bottom: 79px;.omm-table-box-set {width: 100%;.omm-table-title-box-set {height: 42px !important;max-height: 42px !important;background: #F2F5F4;width: 100%;position: relative;z-index: 1;.omm-table-title-set {height: 42px !important;max-height: 42px !important;color: #505553;font-size: 14px;font-weight: normal;text-align: left;}}.omm-table-content-box-all-set {overflow-y: auto;position: absolute;top: 42px;left: 0;right: 0;bottom: 0;.omm-table-content-box-set {min-height: 44px !important;border-bottom: 1px solid #F2F5F4;position: relative;width: 100%;word-wrap: break-word;font-size: 14px;padding: 5px 0;box-sizing: border-box;display: flex;align-items: center;&:hover {background: #F7FAF8;cursor: pointer;}.omm-table-content-set {display: inline-block;vertical-align: middle;height: 100%;color: #1E201F;font-size: 14px;font-weight: normal;pointer-events: none;}}}}}}
}

现在在当前页面使用,后期会提取为公共组件,使用更方便,也让拖拽样式有更多选择。

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

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

相关文章

Linux(CentOS)ftp服务搭建

ftp服务器搭建 1. 下载ftp服务2. 查找ftp配置文件3. 查看配置文件信息4. Windows连接ftp服务1&#xff09;使用文件资源管理器连接2&#xff09;使用FlashFXP工具&#xff0c;比文件资源管理器好用&#xff0c;强烈推荐 5. Linux连接 1. 下载ftp服务 yum install -y vsftpd2. …

Docsify:快速用Markdown文档搭建网站的利器

Github官方地址&#xff1a;Docsify 什么是Docsify&#xff1f; 对于经常写博客的人来说&#xff0c;markdown大家都不陌生。今天介绍一个在最近需求中碰到的软件Docsify&#xff0c;通过它能够将Markdown直接转换为网页。话不多说&#xff0c;下面直接介绍它的快速用法。 D…

Apache、nginx

一、Web 1、概述 Web&#xff1a;为⽤户提供的⼀种在互联⽹上浏览信息的服务&#xff0c;Web 服务是动态的、可交互的、跨平台的和图形化的。 Web 服务为⽤户提供各种互联⽹服务&#xff0c;这些服务包括信息浏览服务&#xff0c;以及各种交互式服务&#xff0c;包括聊天、购物…

fastapi教程(五):中间件

一&#xff0c;什么是中间件 中间件是一种软件组件&#xff0c;它在请求到达应用程序处理程序之前和/或响应发送回客户端之前执行操作。 请求从客户端发出。 请求首先经过Middleware 1。 然后经过Middleware 2。 请求到达FastAPI路由处理器。 响应从路由处理器返回。 响应经过…

如何通过 CloudCanal 实现从 Kafka 到 AutoMQ 的数据迁移

01 引言 随着大数据技术的飞速发展&#xff0c;Apache Kafka 作为一种高吞吐量、低延迟的分布式消息系统&#xff0c;已经成为企业实时数据处理的核心组件。然而&#xff0c;随着业务的扩展和技术的发展&#xff0c;企业面临着不断增加的存储成本和运维复杂性问题。为了更好地…

《LeetCode热题100》---<双指针篇四道>

本篇博客讲解LeetCode热题100道双指针篇中的 第一道&#xff1a;移动零&#xff08;简单&#xff09; 第二道&#xff1a;盛最多水的容器&#xff08;中等&#xff09; 第一道&#xff1a;移动零&#xff08;简单&#xff09; class Solution {public void moveZeroes(int[] nu…

基于CentOS Stream 9平台安装JDK17.0.12

官方&#xff1a; https://www.oracle.com/java/technologies/downloads/#java17 1. 下载&#xff1a; https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 2. 存放目录 mkdir /usr/local/javacd /usr/local/java3. 解压 tar -zxvf jdk-17_linux-x64_…

除了GPT,还有哪些好用的AI工具?

最强AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 多得很&#xff0c;这20个免费的国产AI工具&#xff0c;打工人必备&#xff0c;除了比chatGPT好用&#xff0c;甚至还可以用来变现…

C语言中的指针基础

文章目录 &#x1f34a;自我介绍&#x1f34a;地址&#x1f34a;C语言中的指针 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 Hello,大家好&#xff0c;我是小珑也要变强&am…

论文阅读-《Distant Supervision for Relation Extraction beyond the Sentence Boundary》

文章提出了首个将远程监督应用于跨句子关系提取的方法&#xff0c;通过整合句内和句间关系&#xff0c;利用图表示和多路径特征提取提高了准确性和鲁棒性。 摘要 文章提出了一种新的方法&#xff0c;用于在远程监督下进行跨句子的关系抽取。这种方法利用图表示来整合依赖和话…

常用传感器讲解十五--触摸传感器(KY-036)

常用传感器讲解十五–触摸传感器&#xff08;KY-036&#xff09; 具体讲解 这个比较简单&#xff0c;就是触摸后给个信号 电路连接 在Arduino上将VCC引脚连接到5V。 将GND连接到Arduino的GND。 将OUT连接到Arduino上的D2 代码实现 void setup() {pinMode(2, INPUT);Seri…

spark 3.0.0源码环境搭建

环境 Spark版本&#xff1a;3.0.0 java版本&#xff1a;1.8 scala版本&#xff1a;2.12.19 Maven版本&#xff1a;3.8.1 编译spark 将spark-3.0.0的源码导入到idea中 执行mvn clean package -Phive -Phive-thriftserver -Pyarn -DskipTests 执行sparksql示例类SparkSQLExam…

Kotlin 的优势:现代编程语言的卓越选择

文章目录 简洁与优雅的语法空安全特性函数式编程&#xff0c;支持高阶函数、lambdaKotlin 内联函数与 Java 的互操作性强大的类型推断协程支持lazy 委托object 单例模式区间表达式现代的开发工具支持 本文首发地址 https://h89.cn/archives/301.html 最新更新地址 https://gite…

科学设计程序员面试内容,破解“八股文”之弊

“八股文”在实际工作中是助力、阻力还是空谈&#xff1f; 作为现在各类大中小企业面试程序员时的必问内容&#xff0c;“八股文”似乎是很重要的存在。但“八股文”是否能在实际工作中发挥它“敲门砖”应有的作用呢&#xff1f;有IT人士不禁发出疑问&#xff1a;程序员面试考…

Lombok注解之@SneakyThrows作用

Lombok注解之SneakyThrows作用 读法 [ˈsniːki] [θroʊz] 悄悄的 抛出顾名思义&#xff0c;它能够自动偷摸的为咱们的代码生成一个try…catch块&#xff0c;并把异常向上抛出来。 使用 SneakyThrows的使用范围&#xff1a; 只能作用在方法和构造函数之上。从源码就可以…

C# dataGridView 去掉左边多出来空列

1.问题 在使用winform做界面程序时&#xff0c;dataGridView控件创建好后&#xff0c;左侧会多出一列为空&#xff0c;如何删除呢 2.解决方法 你可以在属性窗口中进行设置 如图&#xff1a; 将RowHeadersVisible 属性设置为False 或者代码设置 this.dataGridView1.RowHea…

我们的前端开发逆天了!1 小时搞定了新网站,还跟我说 “不要钱”

大家好&#xff0c;我是程序员鱼皮。前段时间我们上线了一个新软件 剪切助手 &#xff0c;并且针对该项目做了一个官网&#xff1a; 很多同学表示官网很好看&#xff0c;还好奇是怎么做的&#xff0c;其实这个网站的背后还有个有趣的小故事。。。 鱼皮&#xff1a;我们要做个官…

playbooks 分布式部署 LNMP

1、环境配置 ansible 服务器 192.168.10.10nginx 服务器 192.168.10.20mysql 服务器 192.168.10.21php 服务器 192.168.10.22 2、安装 ansble #192.168.10.10节点 yum install -y epel-release #先安装 epel 源 yum install -y ansible配置主机清单 …

计算机毕业设计-程序论文-基于web线上项目竞标平台的开发与实现

本系统开发采用技术为JSP、Bootstrap、Ajax、SSM、Java、Tomcat、Maven 此文章为本人亲自指导加编写&#xff0c;禁止任何人抄袭以及各类盈利性传播&#xff0c; 相关的代码部署论文ppt代码讲解答辩指导文件都有可私要 项目源码&#xff0c;请关注❥点赞收藏并私信博主&#x…

001.精读《Big Data: A Survey》

文章目录 1. 引言2. 精读2.1 摘要2.2 背景2.4 相关技术2.5 相关流程2.6 应用场景 3. 总结 1. 引言 大数据精读周刊首次与大家正式见面。我们每周将精读并分析几篇精选文章&#xff0c;试图讨论并得出结论性观点。我们的目标是通过深入探讨&#xff0c;帮助大家更好地理解大数据…