React 基于Ant Degisn 实现table表格列表拖拽排序

news2024/11/26 13:46:56

效果图:

 代码:

myRow.js

import { MenuOutlined } from '@ant-design/icons';
import { DndContext } from '@dnd-kit/core';
import { restrictToVerticalAxis } from '@dnd-kit/modifiers';
import {
    arrayMove,
    SortableContext,
    useSortable,
    verticalListSortingStrategy,
} from '@dnd-kit/sortable';
import { CSS } from '@dnd-kit/utilities';
import React, { useState } from 'react';
const myRow = ({ children, ...props }) => {
    const {
        attributes,
        listeners,
        setNodeRef,
        setActivatorNodeRef,
        transform,
        transition,
        isDragging,
    } = useSortable({
        id: props['data-row-key'],
    });
    const style = {
        ...props.style,
        transform: CSS.Transform.toString(
            transform && {
                ...transform,
                scaleY: 1,
            },
        ),
        transition,
        ...(isDragging
            ? {
                position: 'relative',
                zIndex: 1,
            }
            : {}),
    };
    return (
        <tr {...props} ref={setNodeRef} style={style} {...attributes}>
            {React.Children.map(children, (child) => {
                if (child.key === 'sort') {
                    return React.cloneElement(child, {
                        children: (
                            <MenuOutlined
                                ref={setActivatorNodeRef}
                                style={{
                                    touchAction: 'none',
                                    cursor: 'move',
                                }}
                                {...listeners}
                            />
                        ),
                    });
                }
                return child;
            })}
        </tr>
    );
};

export default myRow;

index.js

import myRow from './myRow';

export default () => {
    
    const [tableDatasource, setTableDatasource] = useState([]);

    

    const tableColumns = [
        {
            key: 'sort',
            width: 20
        },
        {
            title: '印章类型名称',
            dataIndex: 'yzTypeName',
            key: 'yzTypeName',
            width: 150,
        },
        {
            title: '操作人',
            dataIndex: 'operator',
            key: 'operator',
            width: 150,
        },
        {
            title: '操作时间',
            dataIndex: 'operateDate',
            key: 'operateDate',
            width: 150,
        },
        {
            title: "操作",
            key: "action",
            width: 100,
            render: (text, record, index) => {
                return (
                    <Space size="middle">
                        <a onClick={event => {
                            tableUpdateAction(record);
                        }}>修改</a>
                        <Popconfirm
                            title="删除印章类别"
                            description="确定要删除吗?"
                            onConfirm={tableDeleteAction.bind(this, record)}
                            onCancel={tableCancelDeleteAction}
                            okText="删除"
                            cancelText="取消"
                        >
                            <a>删除</a>
                        </Popconfirm>
                    </Space>
                )
            }
        }
    ];

//注在后端返回的每个对象中,新增一个key 属性 
    useEffect(() => {
        getYzTypeList(screeningDate).then((res) => {
            if (res.code === 200) {
                const updatedList = res.data.list.map((item, index) => ({
                    ...item,
                    key: index + 1,
                }));
                setTableDatasource(updatedList);
                setMyTotal(res.data.total);
                // message.success("印章类型管理 - 数据已更新");
            }
        });
    }, [screeningDate]);
   

  
    const onDragEnd = ({active, over}) => {
        if (active.id !== over?.id) {
            setTableDatasource((previous) => {
                const activeIndex = previous.findIndex((i) => i.key === active.id);
                const overIndex = previous.findIndex((i) => i.key === over?.id);
                return arrayMove(previous, activeIndex, overIndex);
            });
            const activeId = active.id;
            const overId = over?.id;
            // 在 datasource 中找到匹配 activeId 和 overId 的项
            const activeItem = tableDatasource.find(item => item.key === activeId);
            const overItem = tableDatasource.find(item => item.key === overId);
        }
    };


    return (
        <div>
        
            <div style={{marginTop: 10}}>
                <DndContext modifiers={[restrictToVerticalAxis]} onDragEnd={onDragEnd}>
                    <SortableContext
                        items={tableDatasource.map((i) => i.key)}
                        strategy={verticalListSortingStrategy}
                    >
                <Table
                    components={{
                        body: {
                            row: myRow,
                        },
                    }}
                    rowKey="key"
                    columns={tableColumns} dataSource={tableDatasource} size={"middle"}
                       pagination={false}/>
                    </SortableContext>
                </DndContext>
            
            </div>
     
        </div>
    );
};

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

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

相关文章

C——语言内存函数

目录 一、memcpy的使用和模拟实现 1.memcpy函数原型 2.memcpy函数的使用 3.memcpy函数的模拟实现 二、memmove的使用和模拟实现 1.memmove函数原型 2.memmove函数的使用 3.memmove函数的模拟实现 三、memset的使用 1.memset函数原型 2.memset函数的使用 四、memcmp…

【话题】ChatGPT 和文心一言哪个更好用

星火说 ChatGPT 智能回复&#xff1a;ChatGPT能够根据上下文理解用户的问题&#xff0c;并给出相应的回答。它使用深度学习算法来理解和生成文本&#xff0c;因此可以处理各种复杂的问题和话题。语言准确性&#xff1a;ChatGPT的语言模型经过了大量的训练数据&#xff0c;因此…

vue项目本地开发完成后部署到服务器后报404是什么原因

文章目录 一、如何部署二、404问题为什么history模式下有问题为什么hash模式下没有问题解决方案 参考文献 一、如何部署 前后端分离开发模式下&#xff0c;前后端是独立布署的&#xff0c;前端只需要将最后的构建物上传至目标服务器的web容器指定的静态目录下即可 我们知道vu…

macOS系统下载安装IDEA 操作流程

目录 第一步 进入官网&#xff0c;选择箭头指向的版本 第二步 下载完成后打开&#xff0c;拖动安装包安装​编辑 第三步 点击" project"&#xff0c;在JDK下拉框选择"Download JDK" 第四步 下载完成以后&#xff0c;点击右下角的Create按钮。 第一步 进…

【Docker】在Windows操作系统安装Docker前配置环境

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

PMP考试中常见的组织/人员/职位/角色的含义,以及典型真题分析3

华研荟继续为您分享在PMP考试中经常出现的一些组织、人员、职位和角色的含义&#xff0c;并且通过近年真题分析来给大家体会考试中如何理解&#xff0c;如何解答。 这篇文章来看客户和供应商/分包商&#xff0c;也是PMP考试中经常出现的两类人&#xff08;角色&#xff09;。 …

常见的设计模式(模板与方法,观察者模式,策略模式)

前言 随着时间的推移&#xff0c;软件代码越来越庞大&#xff0c;随着而来的就是如何维护日趋庞大的软件系统。在面向对象开发出现之前&#xff0c;使用的是面向过程开发来设计大型的软件程序&#xff0c;面向过程开发将软件分成一个个单独的模块&#xff0c;模块之间使用函数…

C语言通过MSXML6.0读写XML文件(同时支持char[]和wchar_t[]字符数组)

开发环境&#xff1a;Visual Studio 2010 运行环境&#xff1a;Windows XP SP3 第一节 读取XML文件&#xff08;使用wchar_t[]字符数组&#xff09; /* 这个程序只能在C编译器下编译成功, 请确保源文件的扩展名为c */ #define COBJMACROS #include <stdio.h> #include …

web蓝桥杯真题--8、和手机相处的时光

介绍 现在都提倡健康使用手机&#xff0c;那么统计一下在一周中每天使用手机的情况吧&#xff01;本题使用 ECharts 实现统计手机使用时长的折线图&#xff0c;但是代码中存在 Bug 需要你去修复。 准备 开始答题前&#xff0c;需要先打开本题的项目代码文件夹&#xff0c;目…

深度学习记录--梯度检验

数值逼近 为了对梯度进行检验&#xff0c;需要计算近似误差值来接近梯度 对于单边误差和双边误差公式&#xff0c;其中双边误差与真实梯度相差更小&#xff0c;故一般采用双边误差公式 双边误差 公式&#xff1a; 梯度检验(gradient checking) 对于成本函数&#xff0c;求出…

Python 邮件发送

首先需要有一个邮箱&#xff0c;没有就注册一个&#xff0c;最好是163邮箱。 本文将使用163邮箱讲解python发送邮件。 目录 开启邮箱smtp服务 打开SMTP设置 开启SMTP服务 记录授权密码和服务端配置 脚本发送邮件 引入所需的库 发送配置 邮箱登录发送邮件 查看收到邮件…

如何做标准化?| 京东云技术团队

在现代信息化的市场环境和社会中&#xff0c;标准化已经成为了各种行业的一个重要的标志。标准化不仅可以提升生产效率&#xff0c;减轻质量问题&#xff0c;还可以增加产品的可靠性和互通性。在这篇文章中&#xff0c;我们将探讨如何做标准化&#xff0c;为您提供详细的指导和…

一个小程序跳转到另一个小程序中如何实现

小程序 保证两个小程序是一样的主体才可以跳转。怎么知道是不是同样的主体呢&#xff1f; 小程序的后台管理-设置-基本设置-基本信息。查看主体信息。 跳转 <button clicktoOtherMini()>跳转到另一个小程序</button> function toOtherMini(){wx.navigateToMini…

chromedriver+Selenium+springboot+Java实现后端截图

chromedriver这种方法实现截图&#xff0c;依赖服务器端的谷歌浏览器软件&#xff0c;需要在服务器端下载谷歌浏览器。 Windows服务器说明 1.下载谷歌浏览器 2.根据第一步下载的谷歌浏览器版本&#xff0c;下载chromedriver&#xff0c;可以在这个页面找到和版本相近的版本去下…

开源进程/任务管理服务Meproc使用之HTTP API

本文讲述如何使用开源进程/任务管理服务Meproc的HTTP API管理整个服务。 Meproc所提供的全部 API 的 URL 都是相同的。 http://ip:port/proc例如 http://127.0.0.1:8606/proc在下面的小节中&#xff0c;我们使用curl命令向您展示 API 的方法、参数和请求正文。 启动任务 …

嵌入式-Stm32-江科大基于标准库的GPIO4个小实验

文章目录 一 、硬件介绍二 、实验&#xff1a;LED闪烁、LED流水灯、蜂鸣器提示2.1 需求1&#xff1a;面包板上的LED以1s为周期进行闪烁。亮0.5s,灭0.5s.....2.2 需求2: 8个LED实现流水灯 三、硬件介绍-按键开关、光敏电阻四、 实验 按键控制LED、光敏传感器控制蜂鸣器4.1 需求1…

CNAS中兴新支点——软件测试7条原则

软件测试报告 最需要注意的就是测试思考&#xff0c;而非测试执行。而对软件测试菜鸟来说&#xff0c;初入行&#xff0c;首先要知道软件测试的7条原则&#xff0c;了解这些可以让你事倍功半。 软件测试的7条原则 1&#xff09;测试的不可穷尽原则 是的&#xff01;任何产品…

【K8S 云原生】K8S的对外服务—ingress

目录 一、K8S的Service 1、Service的作用 2、Service类型&#xff1a; 二、ingress 1、ingress的组成&#xff1a; 2、ingress资源的定义项&#xff1a; 3、ingress暴露服务端的方式 3.1、DeploymentLoadBalancer模式&#xff1a; 1、工作流程图&#xff1a; 3.2、Dae…

Eclipse闪退 打开eclipse闪退 打开eclipse图标一闪而过 eclipse闪退 eclipse打不开

Eclipse闪退 打开eclipse闪退 打开eclipse图标一闪而过 eclipse闪退 eclipse打不开 问题描述切换为命令行启动 查看异常日志 问题描述 双击图标&#xff0c;窗口一闪而过&#xff0c;马上关闭了 切换为命令行启动 查看异常日志 进入Eclipse安装目录&#xff0c;运行终端启动…

Tektronix/泰克MSO5204B混合信号示波器

181/2461/8938产品概述&#xff1a; 带宽:2 GHz通道:4个模拟通道和16个数字通道采样速率:10 GS/s记录长度:50分钟FastAcq采集的最大波形捕获速率超过250&#xff0c;000 wfms/sFastFrame分段内存采集模式&#xff0c;每秒可采集多达290&#xff0c;000个分段和超过310&#xff…