基于ant.design4.3.1实现table的编辑

2023-11-13

以下内容其实是当时不太会的一种无可奈何之举,建议使用实现form table编辑校验新链接的方法更为恰当

  • 实现效果如图所示
  • 在这里插入图片描述
import React, { useState } from "react";
import { Table, Input, InputNumber } from 'antd'
import { MinusCircleOutlined, PlusCircleOutlined } from "@ant-design/icons";
import styles from './style.less'


interface TableFromListItem {
  key: number;
  buyPrice: string,
  b2bPrice: string,
  minNumber: string,
  maxNumber: string,
  unit: string,
}


interface PropsType {
  list?: TableFromListItem[];
  unit?: string;
  callback?: (data: any) => void;
}

export interface ActionType {
  handleAdd: (value: number) => void;
  handleRemove: (value: number) => void;
  handleChange: (value: string, _: string, index: number) => void;
  len: number;
}

const columns = (actions: ActionType) => {
  const {handleAdd, handleRemove, handleChange, len} = actions
  return [
    {
      title: '采购量最小值',
      dataIndex: 'minNumber',
      key: 'minNumber',
      render: (text: number, record: TableFromListItem, index: number) =>
        <InputNumber defaultValue={text}
                     placeholder="min"
                     onChange={value => {
                       handleChange(value, 'minNumber', index);
                     }}/>,
    },
    {
      title: '采购量最大值',
      dataIndex: 'maxNumber',
      key: 'maxNumber',
      render: (text: number, record: TableFromListItem, index: number) =>
        <InputNumber defaultValue={text}
                     placeholder="max"
                     onChange={(value) => {
                       handleChange(value, 'maxNumber', index);
                     }}/>,
    },
    {
      title: '采购单位',
      dataIndex: 'unit',
      key: 'unit',
      width: 66,
    },
    {
      title: '采购单价',
      dataIndex: 'buyPrice',
      key: 'buyPrice',
      render: (text: number, record: TableFromListItem, index: number) =>
        <InputNumber defaultValue={text}
                     precision={2}
                     formatter={value => `¥ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
                     parser={value => value.replace(/\¥\s?|(,*)/g, '')}
                     onChange={(value) => {
                       handleChange(value, 'buyPrice', index);
                     }}/>
    },
    {
      title: 'B2B拿货单价',
      dataIndex: 'b2bPrice',
      key: 'b2bPrice',
      render: (text: number, record: TableFromListItem, index: number) =>
        <InputNumber defaultValue={text}
                     precision={2}
                     formatter={value => `¥ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
                     parser={value => value.replace(/\¥\s?|(,*)/g, '')}
                     onChange={(value) => {
                       handleChange(value, 'b2bPrice', index);
                     }}/>,
    },
    {
      title: '',
      dataIndex: 'key',
      key: 'key',
      render: (_: null, record: TableFromListItem, index: number) => <>
        {len - 1 === index ?
          <PlusCircleOutlined className={styles.iconButton} 
          onClick={() => handleAdd(record.key || index)}/> : null}
        {len - 1 !== index ?
          <MinusCircleOutlined className={styles.iconButton} 
          onClick={() => handleRemove(record.key || index)}/> : null}
      </>,
    },
  ]
};

const ListTableEdit: React.FC<PropsType> = (props: PropsType) => {

  const {list, callback, unit} = props;
  const nullObj = {b2bPrice: '', minNumber: '', maxNumber: '', unit: unit || '盒', buyPrice: '',}

  const initList = list && list.length > 0 ? list : [{key: 0, ...nullObj}]

  const [tableList, setTableList] = useState<TableFromListItem[]>(initList);

  const handleAdd = (key: number) => {
    const newData = tableList.map(item => ({...item}));
    newData.push({
      key: key + 1, // 声明唯一的key值,保证数据不污染
      ...nullObj,
    });
    setTableList(newData)
  }

  const handleRemove = (key: number) => {
    setTableList(tableList.filter(item => item.key !== key));
  }

  const handleChange = (value: string, name: string, index: string | number) => {
    tableList[index][name] = value;
    callback ? callback(tableList) : '';
  };

  return <>
    <Table className={styles.listTableEdit} bordered 
    pagination={false} dataSource={tableList} 
    columns={columns({
      handleAdd,
      handleRemove,
      handleChange,
      len: tableList.length
    })}
    />
  </>;

};


export default ListTableEdit;

  • 我这儿的例子都是数字输入框,如果是input输入框value = e.target.value
  • 其他文件
    css
.listTableEdit {
  :global {
    .ant-table-tbody > tr > td .ant-input-number {
      width: 100%;
    }

    .ant-table-thead > tr > th, .ant-table-tbody > tr > td, .ant-table tfoot > tr > th, .ant-table tfoot > tr > td {
      padding: 4px;
      text-align: center;
    }

    .ant-table-thead > tr > th {
      color: rgba(0, 0, 0, 0.65);
      font-weight: normal;
    }
  }
  .iconButton {
    margin: 0 8px;
    color: @primary-color;
    font-size: 16px;
    line-height: 32px;
  }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于ant.design4.3.1实现table的编辑 的相关文章

随机推荐

  • html 引入md文件,webpack将打包目录下的md、html文件解析了

    webpack 加载不加载哪个文件 与你把文件放在哪个目录无关 与你设不设置 loader也无关 webpack 打包的时候会静态代码分析 从入口文件开始 把你require import的文件打包 比如 import xx from sr
  • SPSS-线性回归

    线性回归的因变量是连续数值型变量 回归的分类见113985634 R方 变量之间是否有相关性 模型汇总表 中R表示拟合优度 值越接近1表示模型越好 但不能说他们之间不相关 可能是非线性相关 一元线性回归里 相关系数平方就是R方 多元线性回归
  • 一个交期建议程序的坑 4gl SQL

    一个交期建议程序的坑 供应表已经包含了库存 替代料 需求表依然减掉了库存替代料 select 后的sum修改之后 忘记修改having的语句 差点搞死人 防不胜防 这里用到的算法 一张供应表 一张需求表 需求表不包含库存 在验量 替代量 在
  • 数据库连接运算(join)

    联接有三种 联接和自然联接 这里是算术比较符 外联接 1 联接 从R和S的笛卡儿乘积中选取满足条件 i j 的元组 2 自然联接 naturaljoin 两个关系R和S的自然联接操作具体计算过程如下 计算R S 设R和S的公共属性是A1 A
  • elasticsearch 安装配置

    20211208 es允许远程访问 在本地启动Elasticsearch后 发现只能用localhost和127 0 0 1访问 换成电脑的ip地址 显示拒绝访问 需要修改 config elasticsearch yml下的network
  • msvcr120.dll错误的解决方法

    msvcr120 dll错误 今天本来想操作mysql的 当我把那些文件配置好准备安装mysql时 bin gt mysqld install 居然报了个msvcr120 dll错误 就去寻找这个问题解决方法 原来是在C 资源库里少了一个资
  • Acwing 2. 01背包问题

    f i j 表示从前i个物品选 总体积 lt j的所有选法中的最大值 注意 当j
  • JS设计模式

    目录 前言 单例设计模式 Command 命令模式 Constructor构造器模式 工厂模式Factory 发布订阅设计模式 publish subscribe 观察者模式 中介者模式 前言 JS设计模式是一种思想 更规范更合理的管理代码
  • R语言对苏州天气的分析及预测 温度篇

    温度篇 前面已经讲了苏州的天气特点 还是用相同的数据 做接下来的苏州气温特点的分析预测 是的预测在这里 首先看下2011年到2015年苏州整体的温度表现是什么样的 plot suzhou highestTemp type l col red
  • cherry-pick如何使用?

    多分支开发 然后从测试分支合并到生产分支 测试分支有些内容此次不上线 所以不能全量merge 此时该如何操作呢 这时候就需要使用git cherry pick 下面是阮一峰的教程http www ruanyifeng com blog 20
  • React基础讲解

    文章目录 前言 一 React是什么 二 如何使用 1 基于浏览器的模式 babel 代码如下 2 利用react 创建视图 3 JSX 4 插值表达式 代码示例 5 条件输出 输出数据类型 列表渲染 条件渲染 6 列表循环 基于自动化的集
  • 【C语言编程练习】使用循环,计算1至100的和

    题目 使用循环结构 计算从1加到100的和 题目分析 可以使用for while do while进行设计 1 for循环 使用for循环时 需要注意循环变量的值要从1到100 不要写成了i lt 100导致没加100 2 while循环
  • centos切换到root登录

    具体操作方法 1 在centos系统桌面下通过快捷键 Ctrl Alt T 打开终端命令行模式 2 在centos终端命令行模式下输入以下命令切换到root用户登录 su root 切换到root用户 3 登录过程中如果怎么输入密码都出错
  • glTF模型转3D Tiles

    将 glTF 模型转换为 3D Tiles 格式需要使用一些工具来完成 其中一种方法是使用 Cesium 的 3D Tiles 工具 Cesium 是一个开源的 3D 地球浏览器 它提供了一个命令行工具 可以将 glTF 模型转换为 3D
  • nginx压缩ttf文件 mine.types的作用

    最近在运维过程中 前端提到发现在linux上下载某ttl文件 字体文件 太大 传输过程比较慢 于是就想着使用nginx的gzip进行压缩 经过不断尝试 终于发现在nginx的配置目录 etc nginx mine types 文件中少了 f
  • 如何把C盘Program Files(x86)中的google文件删除

    1 打开任务管理器 杀掉google相关的所有进程 2 参考以下文章更改权限 29条消息 需要来自administrators的权限才能对此文件夹进行更改 欧晨eli的博客 CSDN博客 你需要来自计算机管理员的权限才能对此文件夹进行更改
  • Pytorch Pytorch+深度学习神经网络相关学习收获

    文章目录 一 基础知识 二 Pytorch 三 如何实现一个神经网络 四 pytorch的数据类型 五 常用结构 六 构造神经网络的相关知识 七 数据集处理 一 基础知识 机器学习 本质就是通过 数据 答案的数据集 经过机器学习的训练 得到
  • 第四章 分支结构程序设计(二)

    5 已有预处理命令和定义如下 define N 8 intx 2 z 1 double y 1 2 下述程序段正确的是 C A switch x case z x break case N gt 0 x break B switch x c
  • Anaconda常用命令汇总

    Conda是Anaconda中一个强大的包和环境管理工具 可以在Windows系统中的的Anaconda Prompt命令行使用 也可以在macOS或者Linux系统的终端窗口的命令行使用 本文简单介绍conda的一些常用命令命令 仅供参考
  • 基于ant.design4.3.1实现table的编辑

    以下内容其实是当时不太会的一种无可奈何之举 建议使用实现form table编辑校验新链接的方法更为恰当 实现效果如图所示 import React useState from react import Table Input InputN