React结合antd5实现整个表格编辑

news/2024/7/15 17:01:32 标签: react.js, 前端, antd

通过react hooks 结合antd的table实现整个表格新增编辑。
在这里插入图片描述

引入组件依赖

import React, { useState } from 'react';
import { Table, InputNumber, Button, Space, Input } from 'antd';

定义数据

const originData = [
  { key: 1, name: '白银会员', value: 0, equity: 0, reward: 0 },
  { key: 2, name: '黄金会员', value: 500, equity: 2, reward: 1 },
  { key: 3, name: '钻石会员', value: 1000, equity: 4, reward: 1 },
  { key: 4, name: '至尊会员', value: 1500, equity: 1, reward: 0 },
];

编辑表格时触发(函数体外)

const EditableCell = ({
  dataIndex,
  rowIndex,
  title,
  record,
  index,
  children,
  isEdit,
  data,
  handChange,
  ...restProps
}) => {
  return (
    <td {...restProps}>
      {
        isEdit ? (
          // 这里可以自定义需要的类型进行处理
          <Input defaultValue={data[rowIndex][dataIndex]} onChange={(e) => handChange(e.target.value, rowIndex, dataIndex)} />
        ) : (
          children
        )
      }
    </td>
  );
};

定义函数体

export default function GradeSet() {
  //旧数据
  const [data, setdata] = useState(originData);
  //是否编辑
  const [isEdit, setisEdit] = useState(false);
  //新数据
  const [temData, settemData] = useState(originData);

  const columns = [
    {
      title: '等级名称',
      dataIndex: 'name',
      editable: true,
    },
    {
      title: '升级条件',
      dataIndex: 'value',
      editable: true,
    },
    {
      title: '等级权益',
      dataIndex: 'equity',
      editable: true,
    },
    {
      title: '升级奖励',
      dataIndex: 'reward',
      editable: true,
    },
  ]
  const mergedColumns = columns.map(col => {
    if (!col.editable) {
      return col;
    }
    return {
      ...col,
      onCell: (record, rowIndex) => ({
        record,
        rowIndex,
        dataIndex: col.dataIndex,
        title: col.title,
        isEdit: isEdit,
        data: temData,
        handChange
      }),
    };
  });

  //取消
  const handleCancel = () => {
    settemData(data)
    setisEdit(false)
  }
  //保存
  const handleSave = () => {
    setdata(temData);
    setisEdit(false);
  }
  //改变时
  const handChange = (value, rowIndex, dataIndex) => {
    const otherData = JSON.parse(JSON.stringify(temData));
    otherData[rowIndex][dataIndex] = value;
    settemData(otherData)
  }
  // 添加
  const handleAdd = () => {
    const newData = [...temData];
    newData.push({ key: temData.length + 1, name: `${temData.length + 1} 会员`, value: 0, equity: 0, reward: 0 },)
    console.log(newData)
    settemData(newData);
  }
  // 删除
  const handleDelete = () => {
    const newData = [...temData];
    newData.pop();
    settemData(newData);
  }

  return (
    <div>
      <div className={`headTitle`}>
        <p>数据列表</p>
        {
          isEdit ?
            <Space>
              <Button onClick={() => handleCancel()}>取消</Button>
              <Button type="primary" onClick={() => handleSave()}>保存</Button>
            </Space>
            :
            <Button onClick={() => setisEdit(true)}>编辑</Button>
        }
      </div>
      <Table
        components={{ body: { cell: EditableCell } }}
        bordered
        dataSource={temData}
        columns={mergedColumns}
        rowClassName="editable-row"
        pagination={false}
      />

      {
        isEdit ?
          <Space className={s.bottom}>
            <Button type="primary" onClick={() => handleAdd()}>添加等级</Button>
            <Button danger onClick={() => handleDelete()}>删除最高等级</Button>
            <p>修改等级获得条件的成长值后,部分客户会因无法达到该成长值要求而发生会员等级的变化</p>
          </Space>
          :
          null
      }
    </div>
  );
}

样式

.headTitle {
    padding: 0 16px;
    display: flex;
    justify-content: space-between;
    align-items: center;
    color: #666;
    height: 50px;
    line-height: 50px;
    background: #f0f0f0;
}

http://www.niftyadmin.cn/n/5201927.html

相关文章

电子学会C/C++编程等级考试2022年09月(一级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:指定顺序输出 依次输入3个整数a、b、c,将他们以c、a、b的顺序输出。 时间限制:1000 内存限制:65536输入 一行3个整数a、b、c,以空格分隔。 0 < a,b,c < 108输出 一行3个整数c、a、b,整数之间以一个空格分隔。样例输入…

Vue2系列 -- 组件自动化全局注册(require.context)

参考官网&#xff1a;https://v2.cn.vuejs.org/v2/guide/components-registration.html 1 作用 省略 import 引入组件 省略 在main.js 中注册 实现自动化引入组件 2 自定义文件夹 在 src 下新建一个 components/base 文件夹&#xff0c;用于存放要自动注册的组件 3 在 base…

JSP编写自己的第一个WebServlet实现客户端与服务端交互

我们在项目中找到java目录 下面有一个包路径 然后 我们在下面创建一个类 我这里叫 TransmissionTest 当然 名字是顺便取的 参考代码如下 package com.example.dom;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet…

米哈游大数据云原生实践

云布道师 近年来&#xff0c;容器、微服务、Kubernetes 等各项云原生技术的日渐成熟&#xff0c;越来越多的公司开始选择拥抱云原生&#xff0c;并将企业应用部署运行在云原生之上。随着米哈游业务的高速发展&#xff0c;大数据离线数据存储量和计算任务量增长迅速&#xff0c…

ppt录屏制作微课,轻松打造精品课程

微课作为一种新型的教学方式逐渐受到广大师生的欢迎。微课具有方便快捷、内容丰富、互动性强等特点&#xff0c;可以有效地帮助教师传达知识&#xff0c;提高学生的学习效果。其中&#xff0c;ppt录屏制作微课就是一种常见的方式。本文将介绍ppt录屏的使用方法&#xff0c;帮助…

TS类型全解

使用TypeScript开发的程序更安全&#xff0c;常见的错误都能检查出来。TS能让程序员事半功倍。而原因在于TS的“类型安全”&#xff08;借助类型避免程序做无效的事情&#xff09;。 图 运行程序的过程 但是TS不会直接编译成字节码&#xff0c;而是编译成JavaScript代码。TS编…

【算法】二分查找-20231122

这里写目录标题 一、1089. 复写零二、917. 仅仅反转字母三、88. 合并两个有序数组四、283. 移动零 一、1089. 复写零 提示 简单 266 相关企业 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&a…

计算机算法分析与设计(24)---分支限界章节复习

文章目录 一、分支界限法介绍二、旅行商问题应用三、装载问题应用3.1 问题介绍与分析3.2 例题 四、0-1背包问题应用4.1 问题介绍与分析4.2 例题 一、分支界限法介绍 二、旅行商问题应用 三、装载问题应用 3.1 问题介绍与分析 3.2 例题 四、0-1背包问题应用 4.1 问题介绍与分析…