react使用react-sortable-hoc实现拖拽

news2024/12/27 4:58:30

react-sortable-hoc拖拽

安装

 npm install react-sortable-hoc --save

代码如下(示例):

import React, { useImperativeHandle, forwardRef, memo, useState } from 'react';

import { DrawerForm } from '@ant-design/pro-form';

import { message, Select ,Table} from 'antd';

import { MenuOutlined } from '@ant-design/icons';

import { useUpdateEffect } from 'react-use';

// 核心代码

import { SortableContainer, SortableElement, SortableHandle } from 'react-sortable-hoc';



type ModalProps = {

        ref?: React.MutableRefObject<SortTrackDrawerRefObject | undefined>;

        onUpdated: () => void;

};



export type SortTrackDrawerRefObject = {

        openModal: () => void;

};



// 定义拖拽的图标

const DragHandle = SortableHandle(() => <MenuOutlined style={{ cursor: 'move', color: '#999' }} />);



const columns = [

        {

                title: '排序',

                align: 'center',

                dataIndex: 'sort',

                width: 30,

                className: 'drag-visible',

                render: () => <DragHandle />,

        },

        {

                title: '音频名称',

                dataIndex: 'name',

                className: 'drag-visible',

        },

];



const SortTrackDrawer: React.ForwardRefRenderFunction<SortTrackDrawerRefObject, ModalProps> = memo(

forwardRef((sProps, ref) => {

        const [visible, setVisible] = useState<boolean>(false);

        // 拖拽体

        const SortableItem = SortableElement((props: any) => <tr {...props} />);

       // 拖拽容器

        const SortContainer = SortableContainer((props: any) => <tbody {...props} />);

       

      // 拖拽时原列表替换

        const arrayMoveMutable=(array: any[], fromIndex: number, toIndex: number) =>{

                const startIndex = fromIndex < 0 ? array.length + fromIndex : fromIndex;

                if (startIndex >= 0 && startIndex < array.length) {

                        const endIndex = toIndex < 0 ? array.length + toIndex : toIndex;

                        const [item] = array.splice(fromIndex, 1);

                        array.splice(endIndex, 0, item);

                }

        }



        // 拖拽时返回新数组

        const arrayMoveImmutable=(array: any[], fromIndex: number, toIndex: number) =>{

                array = [...array];

                arrayMoveMutable(array, fromIndex, toIndex);

                return array;

        }

      

        // 拖拽后回调

        const onSortEnd = ({ oldIndex, newIndex }:

                { oldIndex: number; newIndex: number }) => {

                        if (oldIndex !== newIndex) {

                                const newData = arrayMoveImmutable([...tableData], oldIndex,                                 newIndex).filter((el) => !!el);

                                setTableData([...newData]);

                        }

        };

      

       //  获取表格数据

        const getTableData = async () => {

                try {

                        let res = [{

                                name:"测试13",

                                orderNum:1

                                uid:1,

                          }]

                        setTableData(res);

                } finally {



                }

        };

        

       // 确定按钮返回的数据

        const handleFinish = async () => {

                const uids = tableData.map((item) => item.uid);

                console.log(uids)

                message.success('排序已更新');

                return true;

        };

       

       // 拖拽容器方法

        const DraggableContainer = (props: any) => (

                <SortContainer

                        useDragHandle

                         disableAutoscroll

                        helperClass="row-dragging"

                        onSortEnd={onSortEnd}

                        {...props}

                />

        );



        // 拖拽体方法

        const DraggableBodyRow = (props: any) => {

                const { className, style, ...restProps } = props;

                const index = tableData.findIndex((x) => x.uid === restProps['data-row-key']);

                return <SortableItem index={index} {...restProps} />;

        };



        // 进入组件加载数据

        useUpdateEffect(() => {

                getTableData();

        }, [orderType]);



return (

        <DrawerForm

                width={isMobile ? '100%' : 520}

                onVisibleChange={setVisible}

                title={

                        <div className="sort-track-drawer-header">

                                <div>拖拽排序({tableData.length})</div>

                        </div>

                }

                visible={visible}

                onFinish={handleFinish}

                drawerProps={{ closable: false }}

                submitter={{

                        searchConfig: {

                                submitText: '保存排序',

                                resetText: '取消',

                        },

                }}

        >

                <Table

                pagination={false}

                dataSource={tableData}

                columns={columns as any}

                rowKey="uid"

                size="small"

                showHeader={false}

                loading={loading}

                components={{

                        body: {

                                wrapper: DraggableContainer,

                                row: DraggableBodyRow,

                        },

                       }}

                />

        </DrawerForm>

        );

        }),

);



export default SortTrackDrawer;

 

效果如图: 

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

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

相关文章

从零开始的JSON库教程(一)

本文是学习github大佬miloyip而做的读书笔记&#xff0c;项目点此进入 目录 1、JSON是什么 2、搭建编译环境 3、头文件与API设计 4、JSON的语法子集 5、单元测试 6、宏的编写技巧 7、实现解析器 8、关于断言 1、JSON是什么 JSON&#xff08;JavaScript Object Notati…

构建mono-repo风格的脚手架库

前段时间阅读了 https://juejin.cn/post/7260144602471776311#heading-25 这篇文章&#xff1b;本文做一个梳理和笔记&#xff1b; 主要聚焦的知识点如下&#xff1a; 如何搭建脚手架工程如何开发调试如何处理命令行参数如何实现用户交互如何拷贝文件夹或文件如何动态生成文件…

TSINGSEE渔业水产养殖智能视频监管系统方案

一、背景需求 我国作为海洋资源丰富的国家之一&#xff0c;渔场养殖基地众多&#xff0c;但是养殖场也存在着开放度高、覆盖面积广&#xff0c;不易实时管理等监管难题&#xff0c;加上偷捕盗捕现象严重&#xff0c;这不仅给我们养殖户带来巨大的损失&#xff0c;一定程度上还…

阿里巴巴矢量图标转化为字体图标教程

第一步&#xff1a;打开阿里巴巴矢量图标网站&#xff0c;搜索想要的icon https://www.iconfont.cn/?spma313x.search_index.i3.2.19f33a81gfo5r0 第二步&#xff1a;添加购物车&#xff0c;并且下载代码。如下图&#xff1a; 下载代码解压后得到一下文件&#xff1a; 第三步…

LeetCode题:21合并两个有序链表

21合并两个有序链表 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], …

【Java 进阶篇】Java ServletContext功能:获取文件服务器路径

Java ServletContext是Java EE中的一个核心接口&#xff0c;用于与Servlet容器进行通信&#xff0c;提供了许多有用的功能&#xff0c;包括获取文件服务器路径。在本文中&#xff0c;我们将详细介绍如何使用ServletContext来获取文件服务器路径&#xff0c;并提供示例代码以帮助…

如何提高项目团队资源利用率?5大注意事项

项目团队的资源是有限的&#xff0c;这包括人力、时间、资金、设备等。如果这些资源利用率低下或者浪费&#xff0c;这直接会导致项目成本的增加&#xff0c;不利于产品在竞争激烈的商业环境中保持优势。 因此我们需要提高团队资源利用率&#xff0c;降低项目成本&#xff0c;避…

ArmSom------摄像头开发指南(二)

一. 简介 RK3588从入门到精通 开发板&#xff1a;ArmSoM-W3 Kernel&#xff1a;5.10.160 OS&#xff1a;Debian11 上篇文档介绍了rockchip平台怎么配置MIPI-CSI的通路&#xff0c;本⽂主要介绍在Rockchip平台下Camera相关测试命令 二. 摄像头连接 ArmSoM-W3开发板与imx41…

STM32-高级定时器

以STM32F407为例。 高级定时器 高级定时器比通用定时器增加了可编程死区互补输出、重复计数器、带刹车&#xff08;断路&#xff09;功能&#xff0c;这些功能都是针对工业电机控制方面。 功能框图 16位向上、向下、向上/向下自动重装载计数器。 16位可编程预分频器&#xff0c…

精品基于Python的气象预报系统-爬虫

《[含文档PPT源码等]精品基于Python的气象预报系统-爬虫》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技术&#xff…

第六讲:VBA与ACCESS的ADO连接中,所涉及的对象

《VBA数据库解决方案》教程&#xff08;10090845&#xff09;是我推出的第二套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;是学完字典后的另一个专题讲解。数据库是数据处理的利器&#xff0c;教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法和实…

安装anaconda时控制台conda-version报错

今天根据站内的一篇博客教程博客在此安装anaconda时&#xff0c;检查conda版本时报错如下&#xff1a; >>>>>>>>>>>> ERROR REPORT <<<<<<<<<<<< Traceback (most recent call last): File “D:\An…

众佰诚:新手如何在抖音电商中脱颖而出

在这个信息爆炸的时代&#xff0c;短视频平台抖音已经成为了人们获取信息、娱乐和购物的重要渠道。越来越多的商家开始在抖音上开设店铺&#xff0c;希望通过这个平台实现销售增长。然而&#xff0c;对于新手来说&#xff0c;如何在众多的竞争对手中脱颖而出&#xff0c;成为了…

ardupilot开发 --- 避障方案、SLAM方案探索 篇

0. 无意间发现一张好看的图 1. 无人机避障技术 目前&#xff0c;无人机的避障技术中最为常见的是红外线传感器、超声波传感器、激光传感器以及视觉传感器。那为什么大疆的前视避障首先选择了双目视觉呢&#xff1f; 红外线传感器超声波传感器激光传感器视觉传感器。 参考&am…

unity工程

1首先我们来熟悉一下Unity每个文件夹的作用 1.assets&#xff1a;工程资源文件夹 2.library&#xff1a;库文件夹 3.logs&#xff1a;日志文件夹 4.obj&#xff1a;编译产生中间文件 5.packages&#xff1a;包配置信息 6&#xff1a;projectsettings&#xff1a;工程设置…

【小白福音】手把手教学搭建Vue+SpringBoot开发环境完整教程

前言:在很多新手小白在准备开发一个属于自己的前后端分离项目的时候需要准备一些例如Java环境配置、Node.Js配置、Maven配置以及软件安装等等,于本次博主亲自录制了一套完整的安装配置教程,提供到最后给大家进行下载。 注:本教程仅适用于小白,每一节课都是博主原创录制的,…

selenium元素定位 —— 提高篇 xpath定位元素

XPath 最初是用来在 XML 文档中定位 DOM 节点的语言&#xff0c;由于 HTML 也可以算作 XML 的一种实现&#xff0c;所以 Selenium 也可以利用 XPath 这一强大的语言来定位 Web 元素。xpath的强大在于它可以通过父节点或者兄弟节点&#xff0c;根据html元素的前后关联性定位到元…

tmux工具

B站学习地址&#xff1a;tmux教程

烂大街的测试左移和右移!

01、测试左移与右移的定义 通俗的讲&#xff1a;左移是往开发阶段移&#xff0c;右移是往发布之后移。 正常测试&#xff1a;提测后的测试工作——到——发布验证完成阶段。 测试左移&#xff1a;提测之前的测试。 如&#xff1a;代码单元测试&#xff0c;代码质量检测&…

家庭用洗地机哪个最好?家用洗地机选购

家里日常打扫&#xff0c;维持地面的清洁&#xff0c;清洁干湿垃圾这时候必不可缺的就是洗地机了&#xff0c;由于近年来洗地机行业的热度高涨&#xff0c;涌现了很多洗地机品牌&#xff0c;这也让消费者在挑选的时候无从下手&#xff0c;今天笔者就给大家讲讲洗地机挑选需要主…