自定义表格_可拖拽排序

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

一、实现效果

 进行拖拽演示:

可拖拽排序表格

无滚动条样式:

有滚动条样式:

二、代码

使用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,一经查实,立即删除!

相关文章

用最简单的方法对大数据进行处理 vs spark(不需要安装大数据处理工具)

一、大文件处理策略 &#xff08;一&#xff09;、难点 内存管理&#xff1a; 大文件无法一次性加载到内存中&#xff0c;因为这可能会导致内存溢出&#xff08;OutOfMemoryError&#xff09;。 因此&#xff0c;需要使用流&#xff08;Stream&#xff09;或缓冲区&#xff08…

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路由处理器。 响应从路由处理器返回。 响应经过…

LeetCode242 有效的字母异位词

前言 题目&#xff1a; 242. 有效的字母异位词 文档&#xff1a; 代码随想录——有效的字母异位词 编程语言&#xff1a; C 解题状态&#xff1a; 成功解答&#xff01; 思路 问题的本质就是两个字符串是否包含相同的元素。字符串的元素都是小写的字母&#xff0c;那么元素的种…

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

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

Android Studio Module 引入aar

1. 把 aar 文件放到 module 的 libs 目录下 2. 作为 lib 的 module 的 build.gradle 文件&#xff1a; repositories {flatDir {dirs libs}}dependencies {.....implementation (name: TestLibrary-release, ext: aar)}3. app 的 build.gradle 文件&#xff1a;(必须配置) rep…

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

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

web小游戏开发:拼图(一)

web小游戏开发:拼图(一) 拼图游戏规则拼图方式原始拼图对调拼图移动拼图拼图难度拼图交互puzzle8.com联众拼图其他部分拼图游戏准备工作htmljscss小结拼图游戏规则 对于拼图游戏来说,整理有两种拼图块,一种就是方形的,一种是不规则的,带有咬合齿的。一般来说,线下手工…

基于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;甚至还可以用来变现…

Linux:进程通信之管道

管道 A.What 本质是内核缓存区 B. 管道的特点 内核缓冲区大小固定位4k管道独立于进程存在管道的数据结构&#xff1a;环形队列&#xff08;读端和写端&#xff09;单工&#xff1a;写端流向读端读数据相当于出队列默认阻塞&#xff1a;管道无数据&#xff0c;默认读端阻塞&am…

C语言中的指针基础

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

099、Python 从网站上下载图片,并压缩发送到指定邮箱中

要实现从网站上下载图片&#xff0c;并压缩发送到指定邮箱中&#xff0c;可以按下面步骤进行编程。 一、从网络上下载图片&#xff1a; 这里我们使用requests 模块&#xff0c;requests 模块是一个非常流行的 HTTP 库&#xff0c;用于发送各种 HTTP 请求。 1、安装 pip ins…

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

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

七天学Flutter(day0)

前言 上周把这周的需求提前干完了&#xff0c;准备突击学习一下flutter。其实早就年初就想学习flutter&#xff0c;但是种种原因没有学习。这里不过多概述。 基础情况&#xff1a;没有学过dart以及flutter&#xff1b;有一定compose、kotlin安卓原生基础 O&#xff1a;坚持打卡…

常用传感器讲解十五--触摸传感器(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…

vue使用crypto-js对数据进行加解密

vue使用crypto-js对数据进行加解密 1, 创建DES加密和解密方法 // 导入 import CryptoJS from crypto-js/** * DES加密函数 * data: 需要加密的数据 * key: 加密的key * */ export function encrypt(data, key 123456) {// 将密钥转换为UTF-8编码的字节数组key CryptoJS.enc…