react ant 表格实现 拖拽排序和多选

项目背景 : react + ant
要实现 : 有多选功能(实现批量删除 , 也可以全选) + 可以拖拽(可以复制 , 方便顶部的搜索功能)
要实现效果如下

1 这是最初的拖拽功能实现 , 不能复制表格里的内容 , 不符合要求

2 更改了ROW的内容 , 实现了可以复制表格内容
代码

//控制是否可以选中表格里的文字
const Row1 = props => {const {attributes,listeners,setNodeRef,setActivatorNodeRef,transform,transition,isDragging} = useSortable({id: props['data-row-key']})const style = {...props.style,transform: CSS.Translate.toString(transform),transition,...(isDragging? {position: 'relative',zIndex: 9999}: {})}const contextValue = useMemo(() => ({setActivatorNodeRef,listeners}),[setActivatorNodeRef, listeners])return (<RowContext.Provider value={contextValue}><tr {...props} ref={setNodeRef} style={style} {...attributes} /></RowContext.Provider>)
}




3 多选功能ant官网也只提供了rowSelection方法 , 而rowSelection的位置总是在表格最左边 , 我需要让拖拽icon在最左边 , 多选功能在icon右边 , 目前问题如下


 









 

解决思路 : 舍弃了官网的rowSelection方法 , 添加自定义选择列

代码分为俩部分 , 一部分是父页面 , ( 父页面代码太多只显示了功能代码 )

 

import React, { useContext, useMemo, useState, useEffect } from 'react'
import { HolderOutlined } 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'
const RowContext = React.createContext({})//控制是否可以选中表格里的文字
const Row1 = props => {const {attributes,listeners,setNodeRef,setActivatorNodeRef,transform,transition,isDragging} = useSortable({id: props['data-row-key']})const style = {...props.style,transform: CSS.Translate.toString(transform),transition,...(isDragging? {position: 'relative',zIndex: 9999}: {})}const contextValue = useMemo(() => ({setActivatorNodeRef,listeners}),[setActivatorNodeRef, listeners])return (<RowContext.Provider value={contextValue}><tr {...props} ref={setNodeRef} style={style} {...attributes} /></RowContext.Provider>)
}//拖拽图标
const DragHandle = () => {const { setActivatorNodeRef, listeners } = useContext(RowContext)return (<Buttontype='text'size='small'icon={<HolderOutlined />}style={{cursor: 'move'}}ref={setActivatorNodeRef}{...listeners}/>)
}function role () {//被拖拽后请求接口和数据改变const onDragEnd = ({ active, over }) => {if (active.id !== over?.id) {setData(data => {const activeIndex = data.findIndex(item => item?.key === active.id)const overIndex = data.findIndex(item => item?.key === over?.id)const newData = arrayMove(data, activeIndex, overIndex).map((item, index) => ({...item,sort: data.length - index}))// 收集newData中所有对象的id和sort值const updatedItems = newData.map(item => ({id: item.roleId,sort: item.sort}))getSortMethod({ sorts: updatedItems }) //后端接口return arrayMove(data, activeIndex, overIndex)})}}// 让拖拽icon在左侧const columns = [{width: 60,render: () => <DragHandle />},...]return (<><DndContext modifiers={[restrictToVerticalAxis]} onDragEnd={onDragEnd}><SortableContextitems={data.map(i => i?.key)}strategy={verticalListSortingStrategy}>{TableComSelect1({loading,data,columns,onSelectionChange: handleSelectionChange, // 选中的表格数量信息传递给表格isSelectAll: isSelectAll, //是否全选rowKey: 'key', //拖拽components: {  //拖拽body: {row: Row1}}})}</SortableContext></DndContext></>)
}export default role




另一部分是封装的表格组件 ( 全部代码如下 )

import React, { useState, useEffect, useContext } from 'react'
import { Table, Button, Checkbox } from 'antd'import SimpleBar from 'simplebar-react'import 'simplebar/dist/simplebar.min.css' // 引入 simplebar 的样式
import './index.less'
import { useTranslation } from 'react-i18next' // 引入 useTranslation 钩子
import i18n from '@/utils/i18n' //国际化组件const TableComSelect1 = props => {const { t } = useTranslation() // 获取翻译函数和语言切换函数const [obj, setObj] = useState({})const {components,rowKey,columns = [],data = [],loading = false,onSelectionChange,isSelectAll} = propsconst [selectedRowKeys, setSelectedRowKeys] = useState([]) //让批量删除后不被选中const [selectionType, setSelectionType] = useState('checkbox')//接收父传递的key 用来控制表格选中const onSelectChange = newSelectedRowKeys => {console.log('selectedRowKeys changed: ', newSelectedRowKeys)setSelectedRowKeys(newSelectedRowKeys) //让子表格可以选中onSelectionChange(newSelectedRowKeys) //将选中的子表格选中的key值赋给父组件}//旧的选择功能,一直在最左侧const rowSelection = {selectedRowKeys,onChange: onSelectChange}// 点击全选useEffect(() => {if (isSelectAll) {setSelectedRowKeys(data.map(item => item.key))} else {setSelectedRowKeys([])}}, [isSelectAll])// 创建一个自定义的选择列const selectionColumn = {width: '100px',title: t('select'), // 或者根据需要设置标题fixed: 'left', // 如果需要固定列,请保留此行render: (_, record) => (<Checkboxchecked={selectedRowKeys.includes(record[rowKey])} // 假设rowKey是用于唯一标识记录的字段onChange={() => {const newSelectedRowKeys = [...selectedRowKeys]if (newSelectedRowKeys.includes(record[rowKey])) {newSelectedRowKeys.splice(newSelectedRowKeys.indexOf(record[rowKey]),1)} else {newSelectedRowKeys.push(record[rowKey])}setSelectedRowKeys(newSelectedRowKeys)onSelectionChange(newSelectedRowKeys) // 更新父组件的选中项}}/>)}// 在columns数组的第二位插入自定义的选择列const updatedColumns = [...columns.slice(0, 1), // 取前一列selectionColumn, // 插入选择列...columns.slice(1) // 取剩余列]return (<div className='TableComSelect1'><SimpleBarstyle={{ maxHeight: '600px', overflowY: 'auto', display: 'block' }}className='SimpleBar'><Tablecomponents={components} // 应用自定义行组件等rowKey={rowKey} // 设置行键columns={updatedColumns}dataSource={data}loading={loading}pagination={false}// rowSelection={{ //旧的选择功能会一直在表格最左边//   ...rowSelection,//   type: selectionType,//   columnTitle: t('select'),//   columnWidth: '100px'// }}scroll={{x: 1700}}></Table></SimpleBar></div>)
}
export default TableComSelect1

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

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

相关文章

Unity中自动生成地图(代完善)

地图中有水果、房子、树木和道路。道路能通到水果旁。 代码&#xff1a; using UnityEngine; using System.Collections.Generic; using System.Text;public class TilemapGenerator : MonoBehaviour {public int mapWidth 30;public int mapHeight 20;private int[,] map;…

基于粒子群算法的网络最优节点部署优化matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于粒子群算法的网络最优节点部署优化,实现WSN网络的节点覆盖最大化。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 3.核心程序 .................…

Golang | Leetcode Golang题解之第118题杨辉三角

题目&#xff1a; 题解&#xff1a; func generate(numRows int) [][]int {ans : make([][]int, numRows)for i : range ans {ans[i] make([]int, i1)ans[i][0] 1ans[i][i] 1for j : 1; j < i; j {ans[i][j] ans[i-1][j] ans[i-1][j-1]}}return ans }

安装WordPress

第 1 步&#xff1a;下载并解压 wget https://wordpress.org/latest.tar.gz 然后使用以下命令提取包&#xff1a; tar -xzvf latest.tar.gz 第 2 步&#xff1a;创建数据库 比如数据库名称为wordpress&#xff0c;编码格式为 utf8mb4_general_ci 第 3 步&#xff1a;设置wp-con…

Notes for video: EDC-Con 2022/01 - EDC Conceptual Overview and Architecture

Eclipse Dataspace Connector 中文概念 Eclipse Dataspace Connector (EDC) 是一个开源项目&#xff0c;旨在提供一种标准化的方法来连接和共享数据空间中的数据。它是 Eclipse Foundation 下的一个项目&#xff0c;目标是促进数据共享和数据交换的互操作性。以下是 EDC 的一些…

【STL库源码剖析】list 简单实现

从此音尘各悄然 春山如黛草如烟 目录 list 的结点设计 list 的迭代器 list 的部分框架 迭代器的实现 容量相关相关函数 实现 insert 在指定位置插入 val 实现 push_back 在尾部进行插入 实现 erase 在指定位置删除 实现 pop_back 在尾部进行删除 实现 list 的头插、头删 实现…

代码质量与可维护性提升

代码质量和可维护性的提升是一个持续的过程&#xff0c;需要在开发过程中采取一系列的措施。下面是一些可以提高代码质量和可维护性的方法&#xff1a; 使用清晰的命名&#xff1a;使用有意义且易于理解的变量名、函数名和类名。这样可以增加代码的可读性和可理解性。 遵循编码…

CSS:cursor作用

cursor作用 介绍常用值及用途1. default:2. pointer:3. text:4. move:5. not-allowed:6. wait:7. crosshair:8. col-resize:9. row-resize:10. grab:11. grabbing: 举例 介绍 Web开发中&#xff0c;cursor 是一个CSS属性&#xff0c;用于控制当鼠标指针悬停在一个元素上时显示…

Leetcode3161. 物块放置查询(Go语言的红黑树 + 线段树)

题目截图 题目分析 每次1操作将会分裂成两块区间长度&#xff0c;以最近右端点记录左侧区间的长度即可 因此涉及到单点更新和区间查询 然后左右侧最近端点则使用redBlackTree&#xff0c;也就是python中的sortedlist ac code type seg []int// 把 i 处的值改成 val func (t …

【小呆的力学笔记】连续介质力学的知识点回顾二:应变度量

文章目录 3. 格林应变与阿尔曼西应变 3. 格林应变与阿尔曼西应变 变形体在变形前的线元 O A → \overrightarrow{OA} OA &#xff0c;在变形后变成 o a → \overrightarrow{oa} oa &#xff0c;那么应变应该度量这种线元变形前后的差别。 ∣ o a → ∣ 2 − ∣ O A → ∣ 2 …

OrangePi AIpro开箱评测

开箱评测 有幸受邀参与了CSDN与OrangePi组织的评测活动&#xff0c;今天刚收到快递。拆开快递能看到保护盒、电源、双头typec线这三样&#xff08;充电器和线有保护膜的我先拆掉了&#xff09; 打开保护盒&#xff0c;能看到上下两块黑色海棉包裹的开发板&#xff08;保护得不…

cs61B-sp21 | lab6

cs61B-sp21 | lab6 TODO 1 在 CapersRepository.java 中 static final File CAPERS_FOLDER null; // TODO Hint: look at the join // function in Utils在 Utils.java 我们找到 join 函数&#xff0c;第一个 join 的作用是将 first 和 others 连接起来形成一个路径…

IDEA2024创建maven项目

1、new->project 2、创建后展示 3、生成resources文件夹 4、测试--编写一个hello文件

react-server-side-render最新学习与实践

写在前面 server side render(ssr)服务端渲染 &#xff0c;亦即同构应用。主要有利于 seo 和首屏渲染&#xff0c;这是一篇比较新的可运行的结构设计&#xff0c;基于比较新的 react v16、react-router v5 的同构设计。结合了 redux(Flux 数据流实现)。 项目地址:react-ssr-s…

[书生·浦语大模型实战营]——在茴香豆 Web 版中创建自己领域的知识问答助手

茴香豆是一个基于LLM的领域知识助手&#xff0c;可以用于解答群聊中的问题。接下来是创建过程。 1.打开茴香豆Web版&#xff0c;创建自己的领域库。 地址&#xff1a;茴香豆Web版 这里类似于注册账号&#xff0c;你输入知识库的名称以及密码&#xff0c;然后它就会创建一个知识…

Vue3实战笔记(49)—Vue 3响应式魔法:ref vs reactive深入对决

文章目录 前言一、 ref 和 reactive主要差异总结 前言 Vue 3 中的 ref 和 reactive 都是用于创建响应式数据的工具&#xff0c;但它们之间存在一些重要的区别。今天聊聊它们之间的主要差异&#xff1a; 一、 ref 和 reactive主要差异 数据类型&#xff1a; ref 主要用于处理…

【微服务】部署mysql集群,主从复制,读写分离

两台服务器做如下操作 1.安装mysqldocker pull mysql:5.72.启动以及数据挂载 mkdir /root/mysql/data /root/mysql/log /root/mysql/conf touch my.conf //mysql的配置文件docker run --name mysql \ -e MYSQL_ROOT_PASSWORD123456 \ -v /root/mysql/data:/var/lib/mysql \ -v…

飞睿智能高精度、低功耗测距,无线室内定位UWB芯片如何改变智能家居

在数字化和智能化快速发展的今天&#xff0c;定位技术已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;传统的GPS定位技术在室内环境中往往束手无策&#xff0c;给我们的生活带来了诸多不便。幸运的是&#xff0c;随着科技的不断进步&#xff0c;一种名为UWB&#xf…

智能座舱-车载声学技术训练营

语音交互赋能车载智能终端&#xff0c;成为智能座舱生态构建的核心功能 曾几何时&#xff0c;至少十年前&#xff0c;车内语音交互&#xff0c;大家都认为是“智障”阶段&#xff0c;基本上除了难用作为评价找不到其他的形容词做修饰。 但是随着技术的不断发展&#xff0c;特别…

STM32Cube系列教程11:使用STM32 RNG硬件随机数模块生成彩票号码

文章目录 配置RNG模块编写代码获取生成的随机数运行测试 今天写段代码测试一下STM32U083RC的(RNG)硬件随机数模块 顺便写个小demo生成7位真随机数的彩票号码&#xff0c;帮助那些买彩票还有选择困难症的人群 (doge)(手动狗头)。 全部代码以上传到github&#xff1a;https://gi…