首页 > 其他分享 >react18+antdPro可编辑表格的使用和数据联动

react18+antdPro可编辑表格的使用和数据联动

时间:2024-07-25 17:53:57浏览次数:17  
标签:cylx 编辑表格 editable jl item react18 key address antdPro

在这里插入图片描述

在项目中经常会遇到这样的需求 表格数据是需要编辑的 而且有联动的需求,比如 结论是单选形式 选了存疑的 才能选存疑类型 然后会在上面tag显示对应的人数 存疑 > 0 人就显红, 符合要求小于总数就显红 而且选择为符合要求后 还要清空存疑类型

在vue中这很好实现 得益于v-model的双向绑定, 才开始做react项目不久, 确实让我犯了难 只知道用render写自定义组件,但是里面内容不知道咋么写 form中的name咋办能获取到数组中每行的内容,而且数据是单向的。 而且antdPro官方的文档有些晦涩难懂,所以做出来后总结一下,希望也能给大家有所帮助。

首先配置可编辑列表的key

  const defaultData: any[] = [
    // 初始化数据源
    // ...
    { type: '建造师', address: '156', id: '123456', jl: 0, cylx: [] },
    { type: '建师', address: '44', id: 33, jl: 0, cylx: [] },
    { type: '阮经天', address: '44', id: 313, jl: 0, cylx: [] },
    { type: '刘德华', address: '444', id: 343, jl: 0, cylx: [] },
  ];
	// 这表示把数据源中所有的id作为可编辑表格key  也就是全部都可编辑,同时要在可编辑表格中type修改为多选
  const [editableKeys, setEditableRowKeys] = useState<React.Key[]>(() =>
    defaultData.map((item) => item.id),
  );
  //表格的响应式数据
  const [dataSource, setDataSource] = useState(() => defaultData);
  // tag的响应式数据
  const [person, setPerson] = useState<Person>({
    total: defaultData.length,
    meetsRequirement: 0,
    doubt: 0,
    socialSecurityDoubt: 0,
    certificateDoubt: 0,
    majorNotMatch: 0,
  });

然后就是对表格列的配置, 如果不希望这一列编辑 就editable:false

 const columns: ProColumns[] = [
    {
      title: '序号',
      width: 70,
        // 本列不可编辑
      editable: false,
      render: (_: any, __: any, index: number) => {
        return index + 1;
      },
    },
    {
      title: '姓名',
      dataIndex: 'type',
      editable: false,
      width: 80,
      key: 'age',
    },
    {
      title: '身份证',
      editable: false,
      dataIndex: 'address',
      key: 'address',
    },
    {
      title: '年龄',
      editable: false,
      dataIndex: 'address',
      width: 60,
      key: 'address',
    },
    {
      title: '证书专业',
      editable: false,
      dataIndex: 'address',
      key: 'address',
    },
    {
      title: '社保信息',
      editable: false,
      dataIndex: 'sbxx',
      width: 80,
        // 自定义该列的渲染
      render: (_: any, record: any) => <SocialSecurityModal id={record.id} />,
      key: 'address',
    },
    {
      title: '系统提示	',
      editable: false,
      dataIndex: 'address',
      key: 'address',
    },
    {
      title: '结论',
      width: 220,
      key: 'jl',
      dataIndex: 'jl',
        //  如果是可编辑的状态  就会渲染如下的组件 ,这里不需要绑定任何,  会自动被赋值到表格的dataSource中该列对应的dataIndex
      renderFormItem: () => {
        return (
          <Radio.Group>
            <Radio value={1}>符合要求</Radio>
            <Radio value={2}>存疑</Radio>
          </Radio.Group>
        );
      },
    },
    {
      title: '存疑类型',
      width: 330,
      key: 'cylx',
        // 是否可编辑的条件,如果选了存疑 返回true才可编辑
      editable: (_: any, record: any) => record.jl === 2,
      dataIndex: 'cylx',
        // 这是第二种编辑渲染方式 有内置的valueType可以在antdPro官方文档查看
      valueType: 'select',
        // 这里设置对应valueType的子组件的属性 这里设置的就是select框的子属性
      fieldProps: {
        mode: 'multiple', // 添加 mode 属性以启用多选
      },
      valueEnum: {
        majorNotMatch: '专业存疑',
        certificateDoubt: '证书存疑',
        socialSecurityDoubt: '社保存疑',
      },
    },
  ];

最后 再渲染这个editTable和Tips组件即可

<Tips
        title="工程序列中级以上职称和注册建造师合计不少于3人,且结构、材料或化工等专业齐全。"
        desc="技术工人"
        person={person}
      />
      <EditableProTable
        className="mb-3"
        columns={columns}
        request={async () => ({
          data: dataSource,
          total: dataSource.length,
          success: true,
        })}
          // 可伸展框的自定义渲染
        expandable={{
          expandedRowRender: (record) => (
            <Descriptions bordered layout="vertical" column={5}>
              <Descriptions.Item label="证书类型">{record.address}</Descriptions.Item>
              <Descriptions.Item label="证书编号">{record.address}</Descriptions.Item>
              <Descriptions.Item label="专业">{record.address}</Descriptions.Item>
              <Descriptions.Item label="级别">{record.address}</Descriptions.Item>
              <Descriptions.Item label="附件">{record.address}</Descriptions.Item>
            </Descriptions>
          ),
        }}
        rowKey="id"
        recordCreatorProps={false}
          // 这两行一定要加  这样表格才是可控的,也就是双向绑定的!
        value={dataSource}
        controlled
          // 表格数据变化时候触发,editable中也有个属性onValuesChange也是如此,试了下好像作用是一样的
        onChange={(val) => {
          console.log('onChange', val);
          let meetsRequirement = 0;
          let doubt = 0;
          let socialSecurityDoubt = 0;
          let certificateDoubt = 0;
          let majorNotMatch = 0;
          const res = val.map((item) => {
            // 如果jl为符合要求,清空cylx数组
            if (item.jl === 1) {
              meetsRequirement++;
              item.cylx = [];
            } else if (item.jl === 2) {
              doubt++;
            }
            if (item.cylx.length > 0) {
              if (item.cylx.includes('socialSecurityDoubt')) {
                socialSecurityDoubt++;
              }
              if (item.cylx.includes('certificateDoubt')) {
                certificateDoubt++;
              }
              if (item.cylx.includes('majorNotMatch')) {
                majorNotMatch++;
              }
            }

            return item;
          });
        //一定要注意set一下 这就是和vue的区别 数据要自己设置回传,我感觉就是vue就是双向奔赴只管数据就行了,但在react中要你主动设置数据响应式,你不主动,就不会有故事,
          setPerson({
            ...person,
            doubt,
            socialSecurityDoubt,
            certificateDoubt,
            majorNotMatch,
            meetsRequirement,
          });
          setDataSource(() => res);
        }}
        toolBarRender={false}
        editable={{
          editableKeys,
          type: 'multiple',
          onChange: setEditableRowKeys,
        }}
      />

刚开始写react确实很不适应 各位大佬还请批评指正

标签:cylx,编辑表格,editable,jl,item,react18,key,address,antdPro
From: https://blog.csdn.net/ruan479118658/article/details/140696348

相关文章

  • [react] react18核心语法
    react项目的目录结构public文件夹用于存放静态页面资源,src文件夹用于存放react关键代码。如何创建项目npxcreate-react-app项目名记得安装nodejs环境Windows下使用命令提示符或者powershell创建,Linux或macos使用对应的shell创建。出现上图内容即为创建成功。一些杂乱......
  • 【React】React18 Hooks 之 useContext
    目录useContext1、Provider和useContext2、Provider和Consumer3、Provider嵌套4、React.createContext提供的Provider和class的contextType属性5、读、写Context(1)父组件修改Context(2)子组件修改Context好书推荐useContext官方地址使用Context深度传递数据通......
  • 可编辑表格
    <!--子组件--><template> <el-formref="formChild":model="form":disabled="isDisabled">  <el-tableref="table":data="form.contents"size="mini"border>   <el-......
  • Radium 行内样式在 React18 中不生效
    问题React17升级到18之后,行内样式借助Radium包实现hover和媒体查询,无法生效。npmiradium-S下载Radium依赖包App.jsimportRadiumfrom'radium'conststyleObj={width:100,height:100,backgroundColor:'#FAE',':hover':{backgro......
  • 可编辑表格中的两个列分别是用react-hook-form 和antd的inputNumber实现的,需要在开始
    可编辑表格中的两个列分别是用react-hook-form和antd的inputNumber实现的,需要在开始时间的列输入后失焦时,或者按enter键,鼠标聚焦到下一列,即结束时间,该如何设置在React项目中,要实现在一个可编辑表格中,当开始时间列输入后失焦或按下Enter键时,自动将焦点切换至结束时间列,你可以结合......
  • LAYUI - 可编辑表格
    代码/*防止下拉框的下拉列表被隐藏---必须设置---*/.layui-table-cell{overflow:visible;}.layui-table-box{overflow:visible;}.layui-table-body{overflow:visible;}/*使得下拉框与单元格刚好合适*/td.layui-form-select{margin-top:-10px;margin-le......
  • React18 之 Suspense
    我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:佳岚SuspenseSuspense组件我们并不陌生,中文名可以理解为暂停or悬停 ,在React16中我们通常在路由懒加载中配合Lazy组件一起使用......
  • 一篇随笔学习React18组件通信与插槽
    了解什么是jsx->https://www.cnblogs.com/senior-shef/p/17872695.html一、了解props1、什么是propsReact支持两种组件,DOM组件和React组件。DOM组件指的是所有的HTML和SVG标签。比如说,如果我们想要使用标签,在React中,可以设置src和alt等属性。这些属性与纯HTML写法相同。在Rea......
  • react18 typeScript useSelector 提示state 类型未知
     解决方案store/index.tsximport{configureStore}from'@reduxjs/toolkit';import{useSelector,useDispatch}from'react-redux'importtype{TypedUseSelectorHook}from'react-redux'importuserfrom'./modules/user&#......
  • React-Admin后台管理模板|react18+arco+zustand后台解决方案
    基于react18.x+vite4+arco-design自研中后台管理系统解决方案ReactAdmin。react-vite-admin基于vite4搭建react18.x后台管理项目。使用了react18hooks+arco.design+zustand+bizcharts等技术实现权限管理模板框架。支持暗黑/亮色主题、i18n国际化、动态权限鉴定、3种布局模板、t......