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

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;

 

效果如图: 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

竖拍的视频怎么做二维码?竖版视频二维码制作技巧

为了方便视频的展示和传播&#xff0c;现在将视频生成二维码后来使用的方式越来越常见&#xff0c;很多做二维码工具都可以制作视频二维码&#xff0c;但是无法设置下载权限或者播放竖版视频。那么如果做有下载功能的视频码该如何制作&#xff0c;可能很多小伙伴都不知道怎么做…

Idea 对容器中的 Java 程序断点远程调试

第一种&#xff1a;简单粗暴型 直接在java程序中添加log.info()&#xff0c;根据需要打印信息然后打包覆盖&#xff0c;根据日志查看相关信息 第二种&#xff1a;远程调试 在IDEA右上角点击编辑配置设置相关参数在Dockerfile中加入 "-jar", "-agentlib:jdwp…

可视化协作软件有哪些?这10款神器助力团队合作!

可视化协作已经成为一个时下热门词汇&#xff0c;问题是对其并没有一个清晰的定义。有人认为它代表了一个云端环境&#xff0c;具有能够使办公室、混合办公和远程员工一起工作的功能。其他人则认为可视化协作不过是数字化白板而已。 随着这个术语变得更加流行&#xff0c;许多…

时间序列聚类的直观方法

一、介绍 我们将使用轮廓分数和一些距离度量来执行时间序列聚类实验&#xff0c;同时利用直观的可视化&#xff0c;让我们看看下面的时间序列&#xff1a; 这些可以被视为具有正弦、余弦、方波和锯齿波的四种不同的周期性时间序列 如果我们添加随机噪声和距原点的距离来沿 y 轴…

Flutter 组件集录 | InheritedNotifier 内置状态管理组件

theme: cyanosis 1. 前言 在上一篇 《Flutter 知识集锦 | 监听与通知 ChangeNotifier》 中&#xff0c;我们介绍了 ChangeNotifier 对象通知监听者的能力。并通过一个简单的模拟下载进度案例&#xff0c;介绍了它的使用方式&#xff1a; | 案例演示 | 监听-通知关系 | | --- | …

多用户商城系统对比 多用户商城系统哪个好

大环境越来越好&#xff0c;企业纷纷将消费者引入自己建设的独立商城&#xff0c;如零食行业的良品铺子、三只松鼠&#xff0c;从而打造属于自己的IP形象。此时&#xff0c;挑选一款优秀的商城源码是企业的不二之选。这里将国内三大优秀的多用户商城系统进行对比&#xff0c;以…

Elasticsearch 8.X 如何生成 TB 级的测试数据 ?

1、实战问题 我只想插入大量的测试数据&#xff0c;不是想测试性能&#xff0c;有没有自动办法生成TB级别的测试数据&#xff1f;有工具&#xff1f;还是说有测试数据集之类的东西&#xff1f;——问题来源于 Elasticsearch 中文社区https://elasticsearch.cn/question/13129 2…

解决VSCode使用SSH远程连接时无法指定用户名的问题

Windows 11自带OpenSSH客户端&#xff0c;和VSCode配合得很好&#xff0c;没有这个问题。 今天要说的是旧版本Windows 7/8/10系统遇到的问题。 PS: Windows 7可以运行的最后版本是VSCode 1.80.2 由于Windows 7/8/10没有自带的OpenSSH客户端&#xff0c;但可以调用MSYS环境下的…

python图像处理 ——几种图像增强技术

图像处理 ——几种图像增强技术 前言一、几种图像增强技术1.直方图均衡化2.直方图适应均衡化3.灰度变换4.同态滤波5.对比拉伸6.对数变换7.幂律变换&#xff08;伽马变换&#xff09; 前言 图像增强是指通过各种算法和技术&#xff0c;改善或提高数字图像的质量、清晰度、对比度…

3.22每日一题(二重积分求平面区域面积)

先复习求平面积分的公式 注&#xff1a;面对平面积分直接使用二重积分对1求积分即可&#xff1b;所以只需要背二重积分的两个公式&#xff1a; 1、直角坐标下对1积分 2、极坐标下对1积分 xy-1是等轴双曲线&#xff01;&#xff01; 1、先画图定区域 2、选择先对x积分还是先对…

深度学习之基于Yolov5闯红灯及红绿灯检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、闯红灯及红绿灯检测系统![请添加图片描述](https://img-blog.csdnimg.cn/8f260c2ed5ed4d8596e27d38abe42745.jpeg)四. 总结 一项目简介 基于Y…

力扣 upper_bound 和 lower_bound

&#x1f468;‍&#x1f3eb; 34. 在排序数组中查找元素的第一个和最后一个位置 &#x1f338; AC code 2023版 class Solution {public int[] searchRange(int[] nums, int target) {int[] res { -1, -1 };if(nums.length 0)return res;int l 0;int r nums.length - 1;…

QCC TX 音频输入切换+提示声音

QCC TX 音频输入切换提示声音 QCC蓝牙芯片&#xff08;QCC3040 QCC3056 等等&#xff09;&#xff0c;AUX、I2S、USB输入 蓝牙音频输入&#xff0c;模拟输出是最常见的方式。 也可以再此基础上动态切换输入方式。 针对TX切换EQ,调节音量不能出提示声音问题&#xff0c;可以增…

Go 多版本管理

在日常开发工作过程中&#xff0c;很多时候我们都需要在自己的机器上安装多个go版本&#xff0c;像是go1.16引入的embed&#xff0c;go1.18引入了泛型&#xff1b;又或是自己本地使用的是最新版&#xff0c;但公司的项目中使用的go1.14、go1.13甚至是更早的版本。 那么有没有既…

QTreeView 常见节点操作

目录 1、节点遍历 2、设置当前选中项 3、树节点数据绑定 4、树节点自定义样式 5、数据检索 6、获取当前选中项 QTreeView作为项目最经常使用的空间&#xff0c;常用接口和操作必须熟悉熟悉在熟悉&#xff01;&#xff01;&#xff01; 1、节点遍历 void ParamSettingDl…

存储器(详解)

概念 存储器&#xff08;Memory&#xff09;是计算机系统中用于存储和检索数据的硬件设备或组件。它在计算机中扮演着重要的角色&#xff0c;允许计算机暂时或永久地存储程序、数据和中间结果。 存储器是许多存储单元的集合&#xff0c;按单元号顺序排列。每个单元由若干二进制…

Flutter屏幕适配

文章目录 一、Flutter单位二、设备信息三、常见适配方案四、flutter_screenutil 一、Flutter单位 Flutter使用的是类似IOS中的点pt&#xff08;point&#xff09;。 iPhone6的尺寸是375x667&#xff0c;分辨率为750x1334。 iPhone6的dpr( devicePixelRatio ) 是2.0。 DPR 物…

Dev-C调试的基本方法2-1

在Dev-C中调试程序&#xff0c;首先需要在程序中设置断点&#xff0c;之后以调试的方式运行程序。 1 设置断点 当以调试的方式运行程序时&#xff0c;程序会在断点处停下来。点击要设置断点代码行号左侧部分&#xff0c;此时会有如图1所示的红点和绿色对勾&#xff0c;表示断…

服务号升级订阅号的流程

服务号和订阅号有什么区别&#xff1f;服务号转为订阅号有哪些作用&#xff1f;首先我们要知道服务号和订阅号有什么区别。服务号侧重于对用户进行服务&#xff0c;每月可推送4次&#xff0c;每次最多8篇文章&#xff0c;发送的消息直接显示在好友列表中。订阅号更侧重于信息传…

框架安全-CVE 复现Apache ShiroApache Solr漏洞复现

文章目录 服务攻防-框架安全&CVE 复现&Apache Shiro&Apache Solr漏洞复现中间件列表常见开发框架Apache Shiro-组件框架安全暴露的安全问题漏洞复现Apache Shiro认证绕过漏洞&#xff08;CVE-2020-1957&#xff09;CVE-2020-11989验证绕过漏洞CVE_2016_4437 Shiro-…