复杂的编辑表格

ops/2024/9/17 19:07:38/ 标签: javascript, 前端, react.js, antd

需求描述

表格可以整体编辑;也可以单行弹框编辑;且整体编辑的时候,依然可以单行编辑
编辑只能给某一列(这里是参数运行值)修改,且根据数据内容的参数范围来判断展示不同的形式:input/数字输入/单选/多选
依据判断的参数范围内容:正则:xxx / 数字范围:[1,99] / 单选:[0,1] / 多选:[‘a’,‘b’,‘cc’]

在这里插入图片描述

在这里插入图片描述

// ConfigModalEdit.tsximport {ModalForm,ProFormText,
} from '@ant-design/pro-components';
import { Button, Form, message } from 'antd';const waitTime = (time: number = 100) => {return new Promise((resolve) => {setTimeout(() => {resolve(true);}, time);});
};export default (props) => {const { modalConfig, onCancel } = propsconst { visible, data } = modalConfigconst [form] = Form.useForm<{ name: string; company: string }>();return (<ModalFormtitle="修改"open={visible}form={form}autoFocusFirstInputmodalProps={{destroyOnClose: true,onCancel: () => console.log('run'),}}submitTimeout={2000}onFinish={async (values) => {await waitTime(2000);console.log(values.name);message.success('提交成功');return true;}}><ProFormText width="sm" name="id" label="对应的select或者text类型" /></ModalForm>);
};
// index.tsximport { EditableProTable } from '@ant-design/pro-components';
import { Button, Form, Input, InputNumber, Radio, Select } from 'antd';
import React, { useEffect, useRef, useState } from 'react';
import ConfigModalEdit from './ConfigModalEdit';const mockDefaultData: any[] = new Array(8).fill(1).map((_, index) => {return {id: index,name: `主题-${index}`,value: index,name2: `fq-${index}`,created_at: 1590486176000,type: index === 0 ? 'input' : index === 2 ? 'radio' : index === 3 ? 'select' :index ===4 ? 'input' : 'multiple_select'}
});
const EditTable: React.FC = () => {const [defaultData, setDefaultData] = useState<any[]>()const [dataSource, setDataSource] = useState<any[]>();const [editableKeys, setEditableKeys] = useState<React.Key[]>([]);const editableRowData= useRef();const [isEditable, setIsEditable] = useState(false);const [modalConfig, setModalConfig] = useState<any>({visible: false,recordParams: {data: {}},});const [editForm] = Form.useForm()const validator = (value, row) => {console.log('value11==', value, 'row=11=', row);}const columns = [{title: '参数',dataIndex: 'name',editable: false,},{title: '',dataIndex: 'type',hideInTable: true,renderFormItem:()=>''},{title: '参数运行值',dataIndex: 'value',renderFormItem: (_, { record }) => {// console.log('record==', record);const type = record?.type;// 判断数据类型并返回相应的DOM元素if (type === 'input') {return <Input />;} else if (type === 'multiple_select') {return <Select mode="multiple" />;} else if (type === 'select') {return <Select />;}else if (type === 'select') {return <InputNumber />;} else {return <Radio.Group value={record?.value}><Radio value={1}>A</Radio><Radio value={2}>B</Radio><Radio value={3}>C</Radio><Radio value={4}>D</Radio></Radio.Group>}},formItemProps:{rules: [{validator: validator,}]}},{title: '参数默认值',dataIndex: 'name2',editable: false,},{title: '参数范围',dataIndex: 'name',editable: false,},{title: '重启生效',dataIndex: 'name',editable: false,},{title: '操作',valueType: 'option',render: (_: any, record: any) => {return [<Buttontype="link"key="EditPassword"onClick={() => {setModalConfig({visible: true,data: record});}}>修改</Button>,];},},]useEffect(() => {setDefaultData(mockDefaultData)setDataSource(() => mockDefaultData)}, []);const handleEdit = () => {setDataSource(defaultData);setIsEditable(true);setEditableKeys([...defaultData?.map(item => item.id)]);};const handleCancel = () => {// 清除可编辑的行键setEditableKeys([]);// 将当前正在编辑的数据设置回原始数据setDataSource(() => defaultData);setIsEditable(false);};const toolBarRender = () => {return isEditable ? [<Buttonkey="save"// onClick={handleSave}>保存数据</Button>,<Button key="cancel" onClick={handleCancel}>取消</Button>,] : [<Button key="edit" type="primary" onClick={handleEdit}>编辑</Button>,];};return (<><EditableProTableheaderTitle=""columns={columns}rowKey="id"// name='editableData'value={dataSource}onChange={setDataSource}recordCreatorProps={false}toolBarRender={toolBarRender}editable={{type: 'multiple',editableKeys,form: editForm,actionRender: (row)=>[<Buttontype="link"key="EditPassword"onClick={() => {setModalConfig({visible: true,data: row});}}>修改</Button>],onValuesChange: (record, recordList) => {setDataSource(recordList);},onChange: setEditableKeys,}}/><ConfigModalEditmodalConfig={modalConfig}onCancel={() => {setModalConfig({visible: false,data: {},});}}/></>)};
export default EditTable;

http://www.ppmy.cn/ops/99858.html

相关文章

【自动驾驶】控制算法(三)轮胎侧偏与车辆动力学模型

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

地平线—征程2(Journey 2-J2)芯片详解(18)—ISP+IPU

写在前面 本系列文章主要讲解地平线征程2(Journey 2-J2)芯片的相关知识,希望能帮助更多的同学认识和了解征程2(Journey 2-J2)芯片。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 错过其他章节的同学可以电梯直达目录↓↓↓ 地平线—征程2(Journey 2-J2)芯片详解…

【Rust光年纪】提高开发效率:深入了解Rust语言中的数据库客户端和文件处理库

深入探索&#xff1a;Rust语言中多款数据库客户端与文件处理库详解 前言 在现代软件开发中&#xff0c;使用各种数据库和文件处理操作是非常常见的。Rust语言作为一种快速、安全、并发的系统编程语言&#xff0c;也拥有丰富的生态系统和库。本文将介绍几个用于Rust语言的数据…

使用redis设计延迟队列

目录 延迟队列概念与重要性 定义&#xff1a;延迟队列的基本概念 重要性&#xff1a;延迟队列在处理异步任务中的关键作用 图表&#xff1a;延迟队列的工作流程图 ​编辑延迟队列设计案例 背景介绍 设计目标 系统架构 设计要点 现有物理拓扑 图表&#xff1a;有赞延迟…

前端路由的工作原理

前端路由的工作原理 前端路由是在前端应用中管理页面导航和URL的机制&#xff0c;它的出现主要是为了提升用户体验&#xff0c;特别是在单页应用&#xff08;SPA&#xff09;中。单页应用&#xff08;SPA&#xff09;通过异步请求数据并在前端动态渲染页面&#xff0c;以实现页…

常见——算法

一.排序算法 1.冒泡排序 public class Test {public static void main(String[] args) {int []arr{12,34,1,56,44,4,5,55};for (int i 0; i < arr.length-1; i) {for (int j 0; j < arr.length-i-1; j) {int temparr[j1];if(arr[j]>arr[j1]){arr[j1]arr[j];arr[j]t…

Vue解决父子组件传值,子组件改变值后父组件的值也改变的问题

vue开发过程中&#xff0c;父组件通过props传值给子组件&#xff0c;子组件在页面展示父组件的值&#xff0c;在操作子组件值以后&#xff0c;即使不点击确定按钮&#xff0c;父组件中的值也发生了变化&#xff0c;但是需求是操作子组件数据以后&#xff0c;必须点击"确定…

测试用例的设计

*涉及概念来源于《软件测试的艺术》 目录 一、为什么要设计测试用例&#xff1f; 二、黑盒测试与白盒测试介绍 三、测试用例常见设计方法 1.黑盒测试(功能测试) 2.白盒测试(结构测试) 四、测试策略 五、测试用例怎么写 一、为什么要设计测试用例&#xff1f; 由于时间…

引号的艺术:用CSS quotes 属性打造个性化引用

引号的艺术&#xff1a;用CSS quotes 属性打造个性化引用 摘要 CSS 的 quotes 属性是一个强大的工具&#xff0c;它允许开发者自定义网页上的引用标记&#xff0c;从而增强网页的视觉效果和用户体验。本文将深入探讨 quotes 属性的使用方法&#xff0c;包括如何设置不同的引号…

将标准输入stdin转换成命令行参数——Unix中的xargs指令

xargs是Unix中的复合指令加工机&#xff0c;联合管道符“|”将制造更加强大的“复杂”指令组合。 (笔记模板由python脚本于2024年08月22日 18:13:51创建&#xff0c;本篇笔记适合喜欢Linux的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.…

【Linux】实现三个迷你小程序(倒计时,旋转指针,进度条)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:Linux ⚙️操作环境:Xshell (操作系统:CentOS 7.9 64位) 目录 &#x1f4cc;倒计时小程序 &#x1f38f;项目效果展示 &#x1f38f;项目实现思路 &#x1f38f;项目完整代码 &#x1f4cc;旋转指针小程序 &#x…

Python Web开发Django框架视图应用指导

内容导读 关于视图请求与响应对象模板响应对象生成响应的快捷方式类视图通用视图 一、关于视图 Python的Django框架中&#xff0c;视图用于处理HTTP请求&#xff0c;并返回响应数据&#xff0c;实现前后端的交互。 下面看一下视图的基本结构&#xff1a; def view_name(req…

打卡51天------图论(深搜/广搜应用题)

最近真的太忙了&#xff0c;没时间刷题&#xff0c;白天工作&#xff0c;我在church的Choir事工还不想停止&#xff0c;需要我在工作、生活、church做一个平衡&#xff0c;周六慢慢补上吧&#xff0c;交托给上Di。 一、岛屿数量-深搜 注意深搜的两种写法&#xff0c;熟练掌握这…

小白之 FastGPT Windows 本地化部署

目录 引言环境步骤1. 安装 docker2. 启动 docker3. 浏览器访问4. One API 配置语言模型、向量模型渠道和令牌5. 创建 FastGPT 知识库6. 创建 FastGPT 应用 官方文档 引言 部署之前可以先看一下 RAG 技术原理&#xff0c;也可以后面回过头来看&#xff0c;对一些概念有些了解&a…

electron 两个渲染进程之间通信

一、使用主进程作为中介 使用主进程作为中介相对较为灵活&#xff0c;但可能会增加主进程的负担 1. 从一个渲染进程向主进程发送消息 在发送消息的渲染进程中&#xff0c;可以使用 ipcRenderer 模块向主进程发送消息。例如&#xff1a; const { ipcRenderer } require(&qu…

vue获取一个时间段的时间差和时间差格式

<template><div><div><p>开始时间&#xff1a;{{ state.stm }}</p><p>结束时间&#xff1a;{{ state.etm }}</p><p>相差&#xff08;数字格式&#xff09;&#xff1a;{{state.ztime.timeList.join(:)}}</p><p>相…

C语言典型例题49

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题4.1 求1234……100。 代码&#xff1a; //《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 //例题4.1 求1234……100。#include <stdio.h> int main() {int n0;//求n个数相加int sum0;//相加…

python学习8-数据获取与整理4

pandas迭代 在 Pandas 中&#xff0c;通常情况下你不需要迭代&#xff08;遍历&#xff09;DataFrame 或 Series&#xff0c;因为很多操作都是矢量化的&#xff0c;可以直接应用于整个数据集。然而&#xff0c;有时候你可能需要遍历数据帧&#xff08;DataFrame&#xff09;或…

揭开CSS遮罩术:mask与-webkit-mask属性深度解析

标题&#xff1a;揭开CSS遮罩术&#xff1a;mask与-webkit-mask属性深度解析 摘要 CSS的mask属性是一种强大的工具&#xff0c;它允许开发者将图像或渐变用作遮罩层&#xff0c;以隐藏或显示元素的特定部分。-webkit-mask属性是其对应的Webkit前缀版本&#xff0c;用于在基于…

精彩管道不会梦到深沉蓝调

如果上天开了眼 请多给我点蓝调 多给我点沙锤 多给我点甲壳 让我吃鸡&#xff01; 星元自动机&#xff0c;新的版本之神 给宁磕一个 完蛋 你说这不是问题吗 我这篇文章从我写开始&#xff0c;到写完 炉石都换赛季了&#xff01;&#xff01;&#xff01;&#xff01…