react.js antd-table 可编辑表格验证

摘要:
最近做需求,需要在一个表格里编辑字段,验证提交.项目用的是antd的组件,看了下table组件,官网有给编辑的例子,好咧,拿过来用了下,发现问题.官网的实现写得很复杂,而且最主要的一点是只能在输入框获取焦点时调验证规则.但是在表格外面不能调用验证方法调用.与实际需求不符合,于是自己写了一个,记录下来.需求:表格输入时验证字段,提交时点击验证字段主要思路:先写好字段验证错误的样式,设置一个字段,通过
最近做需求,需要在一个表格里编辑字段,验证提交.项目用的是antd的组件,看了下table组件,官网有给编辑的例子,好咧,拿过来用了下,发现问题.官网的实现写得很复杂,而且最主要的一点是只能在输入框获取焦点时调验证规则.但是在表格外面不能调用验证方法调用.与实际需求不符合,于是自己写了一个,记录下来.
需求:表格输入时验证字段,提交时点击验证字段
react.js antd-table 可编辑表格验证第1张
主要思路:先写好字段验证错误的样式,设置一个字段,通过字段动态增加样式来实现验证提示的效果

这个表格是放在一个弹框里的,弹框组件
updateForm.tsx
import React, { useState, useEffect } from 'react'import { Form, Button, Input, Modal, Select, Row, Col, DatePicker, Table } from 'antd'import styles from './style.less'

const UpdateForm: React.FC = (props) =>{
  const [sourceData, setSourceData] =useState([])

  const {
    onSubmit: handleUpdate,
    onCancel: handleUpdateModalVisible,
    updateModalVisible,
  } =props

  //获取表格字段填写的值
  const changeValue = (e: any, row: any) =>{
    const newData =[...sourceData]
    const index = newData.findIndex(item => row.fieldCode ===item.fieldCode)
    const item =newData[index]
    item.value =e.target.value
    if (item.value) { //通过errorFiled这个字段来判断当前的输入是否通过校验
      item.errorFiled = false} else{
      item.errorFiled = true}
    newData.splice(index, 1, {
      ...item,
    })
    setSourceData(newData)
  }

  const columns =[
    {
      title: '业务字段名称',
      dataIndex: 'fieldName',
       '45%',
    },
    {
      title: '业务字段内容',
      dataIndex: 'value',
      editable: true,
      render: (_, record: any) =>(
        <>
          <input
            style={{  '90%'}}
            className={`${record.errorFiled ? styles.errorinput : ''} ${styles.tableinput}`}
            onChange={(e) =>changeValue(e, record)}
            value={record.value}
          />
          <div style={{ display: record.errorFiled ? 'block' : 'none' }} className={styles.tabletip}>{record.fieldName}必填</div>
        </>
),
    },
  ]

  const sourceData =[
    {
      key: '0',
      fieldName: '电票质押合同编号',
      value: '',
    },
    {
      key: '1',
      fieldName: '电票票号',
      value: '',
    },
    {
      key: '2',
      fieldName: '借款人名称',
      value: '',
    },
  ]
  setSourceData(sourceData)  //如果表格数据是后台获取,也是一样的,得到数据后使用setSourceData赋值

   //提交用户信息
  const handleSubmit = () =>{
    const fieldsValue ={}
    //提交时验证一下表格里的数据
    const newData =[]
    let flag = falsesourceData.some((item: any) =>{
      const obj ={ ...item }
      if (!item.value) {
        obj.errorFiled = trueflag = true}
      newData.push(obj)
    })
    if(flag) {
      setSourceData(newData)
      return}

    fieldsValue.businessFields =sourceData
    console.log(234, sourceData)
    handleUpdate(fieldsValue) //传值给父组件
}

  const renderFooter = () =>{
    return(
      <>
        <Button onClick={() => handleUpdateModalVisible()}>取消</Button>
        <Button onClick={handleSubmit}>确定</Button>
      </>
)
  }

  return(
    <Modal
      width={840}
      bodyStyle={{ padding: '32px 40px 48px'}}
      destroyOnClose
      title='添加增信品种'visible={updateModalVisible}
      footer={renderFooter()}
      maskClosable={false}
      onCancel={() =>handleUpdateModalVisible()}
    >
      <>
        <Table
          bordered
          dataSource={sourceData}
          columns={columns}
          pagination={false}
          rowKey='fieldCode'style={{ maxHeight: '350px', overflow: 'auto'}}
        />
      </>
    </Modal>
)
}

export default UpdateForm
父组件调用
father.tsx
import CreateForm from './components/CreateForm'
const TableList: React.FC<{}> = () =>{
  const [createModalVisible, handleModalVisible] = useState<boolean>(false)

  return(
    <div>
      <Button type='primary' onClick={() =>{
        handleModalVisible(true)
      }}>新建
      </Button>
      <CreateForm
        onCancel={() => handleModalVisible(false)}
        onConfirm={(value) =>{
          //提交事件
}}
        modalVisible={createModalVisible}
      />
    </div>
)
}

样式文件
style.less

.tableinput{
padding-left:6px;
}
.errorinput{
border:1pxsolid#ff4d4f;
}
.tabletip{
color:#ff4d4f;
}

免责声明:文章转载自《react.js antd-table 可编辑表格验证》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mongo集群的监控(一)Android02——Activity下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【Ray Tracing The Next Week 超详解】 光线追踪2-7 任意长方体 &amp;amp;&amp;amp; 场景案例

上一篇比较简单,很久才发是因为做了一些好玩的场景,后来发现这一章是专门写场景例子的,所以就安排到了这一篇 Preface 这一篇要介绍的内容有: 1. 自己做的光照例子 2. Cornell box画质问题及优化方案 3. 新的场景几何体——长方体 轴平行长方体 任意长方体 我们这一篇重实践轻理论阐述 ready 1. 需要上一章的知识 但是,上一章的Co...

FFmpeg原始帧处理-滤镜API用法详解

本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10429145.html 在 FFmpeg 中,滤镜(filter)处理的是未压缩的原始音视频数据(RGB/YUV视频帧,PCM音频帧等)。一个滤镜的输出可以连接到另一个滤镜的输入,多个滤镜可以连接起来,构成滤镜链/滤镜图,各种滤镜的组合为 FFm...

vue 查询分页

后端用的flask,前端vue,查询结果展示以及分页 如图: 代码如下: 前端: 1 <template> 2 <div> 3 <el-row> 4 <el-col :span="18"> 5 <el...

react组件间的传值方法

关于react的几个网站:  http://react.css88.com/ 小书:http://huziketang.mangojuice.top/books/react/ http://www.redux.org.cn/ 组件传值的方法: 1.父子组件间的传值 2.context 3.子组件向父组件传值 4.没有任何嵌套关系的组件之间传值 5.redu...

python嵌入C++ boost.python如何在C++中调用含有不定长参数tuple变量和关键字参数dict变量的函数

    这个问题是在我尝试利用pygraphviz嵌入我的C++代码绘制二叉树的时候发现的.找了半天资料,这里我把几种常用的C++调用 PYTHON利用 boost.python 的方法作一个总结,希望能让别人少走弯路,因为有些内容还找不到中文文档,虽然都不难但是开始摸索 还是费时间的.     我个人认为boost.python真的是非常的COOL,基...

c++ __declspec关键字详细用法

c++ __declspec关键字详细用法       __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式。其它的有关存储方式的修饰符如static与extern等是C和C++语言的ANSI规范,而__declspec是一种扩展属性的定义。扩展属性语法简化并标准化了C和C++语言关于Microsoft的扩展。 用法:__de...