React+antd实现可编辑单元格,非官网写法,不使用可编辑行和form验证

react+antd的Table组件编辑单元格 3. 有直接调接口默认回显数据、有Input输入框形式(当增加一新的,默认显示图片2的效果。当选择了“纸质普票”,这一就变成图3 的效果。当选择“纸质普票”以外的选项,又会变成图2 的形式。2. 当下拉选择的数据同,展示出的第4567列也同。4. 编辑好当前保存无法再新增一。代码仅供参考,里面涉及的业务逻辑可以忽略,可以看主要内容。第一列是下拉选择框,第2 3列是TextArea,图1。真实的业务需求(antd 3 版本+react)新增加一,且单元格可以编辑。1. 默认增加一时, 阅读详情

antd3以上的写法乍一看还挺复杂,自己写了个精简版

没用EditableRow+Cell的结构,也不使用Context、高阶组件等,不使用form验证

最终效果:

class EditableCell extends React.Component {
    state = {
        editing: false
    };
    toggleEdit = () => {
        const editing = !this.state.editing
        this.setState({ editing }, () => {
            if (editing) {
                this.input.focus()
            }
        })
    };
    save = e => {
        const { record, handleSave } = this.props;
        this.toggleEdit();
        handleSave(record, e.target.value)

    };  // save主要处理两件事,一是切换editing状态,二是提交更新的数据
    render() {
        const { children } = this.props
        const { editing } = this.state;
        return editing ? (
            <Input defaultValue={children} ref={node=>(this.input=node)} onPressEnter={this.save} onBlur={this.save} />
        ) : (
            <span>{children}<Icon type="edit" theme='twoTone' style={{marginLeft: 10}} onClick={this.toggleEdit} /></span>
            )
    }
};

最后使用的时候直接在column元素的render里面<EditableCell> </EditableCell>就好啦, props一定要传处理保存修改的方法

render: (text, record) => {
    return (<EditableCell handleSave={handleModifyNote} record={record}>{text}</EditableCell>) //记得传props
    }

现在这个可编辑单元格组件在鼠标失焦或者回车后,列数据会变回修改前的数据,在state里面加个text,把最后显示的 {children} 换成 {text} 就可以。

该组件也许很多页面都会使用,单独放在一个文件里再引入会优雅很多:

import React from 'react';
import {Input, Icon} from 'antd';

class EditableCell extends React.Component {
    state = {
        editing: false,
        text: this.props.children
    };
    toggleEdit = () => {
        const editing = !this.state.editing
        this.setState({ editing }, () => {
            if (editing) {
                this.input.focus()
            }
        })
    };
    save = e => {
        const { record, handleSave } = this.props;
        this.setState({text: e.target.value});
        this.toggleEdit();
        handleSave(record, e.target.value)

    };
    render() {
        const { editing, text } = this.state;
        return editing ? (
            <Input defaultValue={text} ref={node=>(this.input=node)} onPressEnter={this.save} onBlur={this.save} />
        ) : (
            <span>{text}<Icon type="edit" theme='twoTone' style={{marginLeft: 10}} onClick={this.toggleEdit} /></span>
            )
    }
};

export default EditableCell;

引入的时候:

import { EditableCell } from '../EditableCell'

全部页面index.jsx大概是这样的

import React, { useEffect } from 'react';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { Card, Input, Select, Row, message, Col, Table, Button, Icon, Upload, Form, DatePicker } from 'antd';
import { connect } from 'dva';
import download from '@/utils/download';
import styles from './style.less';

const { Option } = Select;

class EditableCell extends React.Component {
    state = {
        editing: false
    };
    toggleEdit = () => {
        const editing = !this.state.editing
        this.setState({ editing }, () => {
            if (editing) {
                this.input.focus()
            }
        })
    };
    save = e => {
        const { record, handleSave } = this.props;
        this.toggleEdit();
        handleSave(record, e.target.value)

    };
    render() {
        const { children } = this.props
        const { editing } = this.state;
        return editing ? (
            <Input defaultValue={children} ref={node=>(this.input=node)} onPressEnter={this.save} onBlur={this.save} />
        ) : (
            <span>{children}<Icon type="edit" theme='twoTone' style={{marginLeft: 10}} onClick={this.toggleEdit} /></span>
            )
    }
};

const Aabbb = props => {
    const { form, dispatch, dataLoading } = props;
    const { getFieldDecorator } = form;
    const { pageInfo, res }  = props;
    const formItemLayout = {
        labelCol: { span: 8 },
        wrapperCol: { span: 16 },
    };
    const columns = [
        { title: '序号', dataIndex: 'id', align: 'center', width: 80, fixed: 'left', render: (text, record, index) =>
            (<span>{(pageInfo.current - 1) * pageInfo.pageSize + index + 1}</span>)
        },
        ...
        { title: '结果', dataIndex: 'results', align: 'center', render: (text, record) => (
            <Select defaultValue={text} className={styles.tableSelection} onChange={value => handleModifyResult(value, record)}>
                <Option value="正常">正常</Option>
                <Option value="异常">异常</Option>
            </Select>
        )},
        { title: '备注', dataIndex: 'notes', align: 'center', width: 120, render: (text, record) => {
            return (<EditableCell handleSave={handleModifyNote} record={record}>{text}</EditableCell>)
        }}
    ];
    const handleModifyNote = (record, value) => {
        console.log('save', {...record, notes: value})
        dispatch({})
    };
    const handleModifyResult = (value, record) => {
        dispatch({})
        console.log({...record, inspectionResults: value});
    };
    
    
    useEffect(() => {
        
    }, []);
    const queryData = () => {}
        
    return (
        <PageHeaderWrapper>
            <Card>
                <Form horizontal="true">
                    <Row>
                        <Col span={8}>
                            ...
                        </Col>   
                    </Row>
                    <Row>
                        ...
                    </Row>
                </Form>
                <Table
                    columns={columns}
                    loading={dataLoading}
                    dataSource={res}
                    rowKey={(record,index)=>index}
                    pagination={}
                    onChange={}
                    />
            </Card>
        </PageHeaderWrapper>
    );
}

export default connect(({ aabbb, loading }) => ({
    res: aabbb.res,
    dataLoading: loading.effects['aabbb/QueryAabbb'],
}))(Form.create()(Aabbb));

react+antd 实现表单动态增加Table可编辑,且表单可验证 【代码】react+antd 实现表单动态增加Table可编辑,且表单可验证 阅读详情

相关推荐

新手必看:5分钟搞懂FFT波束形成的底层原理(从阵列信号到频域处理)

本文深入浅出地解析了FFT波束形成的底层原理,从阵列信号采集到频域处理的全过程。通过音乐节场景类比Python代码示例,帮助新手快速理解多目标波束形成的核心技术,包括频域转换、相位补偿性能优化策略,适用于雷达、声呐5G通信等领域。

pytorchlight8的博客 918

Antd4可编辑单元格.txt

Ant Design 可编辑单元格,根据antd 3 + antd 4 修改,完全使用状态组件

FAST-LIO2实战:从零搭建香港大学火星实验室SLAM框架(附官方数据集测试指南)

本文提供了一份详细的FAST-LIO2实战指南,帮助读者从零开始搭建香港大学火星实验室开源的这一高效激光惯性里程计框架。内容涵盖系统环境配置、依赖安装、源码编译、官方数据集测试以及参数调优,旨在让开发者快速上手并应用于机器人SLAM项目。

ppp33的博客 651

Antd Table 可编辑表格

antd Table 官方文档提及了 可编辑单元格可编辑,这里解决可编辑表格;主要思路是将antd Table可编辑antd Form.List 相结合;表格内编辑;可编辑单元格可编辑;简单易理解 ​

知之为知之,不知为不知 1万+

antd的Table组件实现单元格可编辑

antd的Table组件实现单元格可编辑

qq_52845451的博客 9597

react使用antdForm内联组件与Form表单默认赋值

先写思路:这里假设我写了两个Input组件,他们是一组,都在Form表单里面。然后我在通过initialValues给他们赋初始值。 一组Input组件的解决方案: 一组Input组件,这里直接转到官网教程: https://ant.design/components/form-cn/#header 看官网的代码直接套用即可 给一组Input组件赋初始值解决方案: 我这里使用官网此处的方法赋值完后,发现表单验证是无法通过了,就过一夜的苦寻答案后,解决如下(在initialValues里.

weixin_43207103的博客 3403

antd 如何清除表单验证(联动表单验证

前言提示,antd官网的文档说明怎么样看参数?其实是参考的typeScript的规则写法: 备注(投标的3种状态): 当我们使用antdForm表单时,可能会遇到2个表单联动的情况,试想一下以下场景: 投标利率我们设置在(3%-7%)以内,也就是说,输入框能取值的范围是3-7(符合3-7就触发了表单验证了!),当投标状态是“投标”(共三种)时,该投标利率表单验证生效,如果...

hzxOnlineOk的博客 1万+

react-antd form表单的使用验证

1.引入import{Layout,ConfigProvider,Button,Input,Modal,Form,Table,Pagination}from'antd';对应的组件 <Form layout="vertical" onSubmit={this.handleSubmit}> <Form.Item label="E-m...

从事前端,不断积累经验,学习新的技术。头像不是本人是莉莉崽(美貌、可爱集于一身的小姐姐,小仙女),一个宝藏博主,值得喜欢! 3489

React+Antd项目,Form的Input中已经有内容,但是还是提示此项为必填项,能为空

我们在进数据采集功能开发的时候,往往会用到Form表单,这其中必可少的就会用到Input(多种type类型)输入框。经常还会对其中的某一些Input输入做一些必填或者某些输入格式的限制,设置默认值placehoder等等需求场景。我在使用React + Antd构建含有多个Input组件的Form表格时,遇到了下述问题…...

BigFamer的博客 5552

怎样使用antd Form 的API

两种用法 1、Form.create() 经 Form.create() 包装过的组件会自带 this.props.form 属性 1.2、class函数使用Form.create(): class CustomizedForm extends React.Component { ...代码 } CustomizedForm = Form.create({})(Customized...

zb0002011的博客 2887

AntD 可编辑表格

本地数据代码模板自用,官网例子改改 // 编辑的自定义表格 import React, { useState } from "react"; import { Table, Input, InputNumber, Popconfirm, Form, Typography, Divider, } from "antd"; interface Item { key: string; name: string; age: number; address: str

YUSIR 完美CODING世界 2867

箭头函数与class函数使用Antd Form组件中 Form.create()的方法

Form.create() 包装过的组件会自带 this.props.form 属性 一、class函数使用Form.create(): class CustomizedForm extends React.Component { ...代码 } CustomizedForm = Form.create({})(CustomizedForm); 官网有详细介绍 比较完整的代码段 cons...

weixin_41544124的博客 3万+

Form表单校验

进入AntD官网form表单模块选择自己想要使用的表单样式,查看源码如何使用,将其运用到自己的项目中:首先,要忘记引入 import { Form } from "antd";(在此之前也要先安装AntD库才可以)回到自己的项目中,我这里要做一个注册页的表单校验:初步构建好大致表单,rules只设置了一个条规则:required必填,message是未填写时的红字提示信息注意观察,rules是一个数组形式,里面可以设置多条,我们再来给增加两条:必须是字符串(在 5 到 20 个字符之间(

wangjingran03119的博客 1114

antd表格添加数据更新_关于antd使用Form.Item 结合CheckBox 无法更新改变状态的问题...

时隔多个月 终于 又转战react, rn我真的太难了。事件前提:最近在开发react框架的后台管理系统。必可少的用到antd-design。提交一个数据比较多的表格。因为需要判断一些必填规则。所以如果自己写就比较麻烦,在这里就用到react-design的Form组件。在项目中 其他都好说 但是有一个多选框 ===>这里CheckBox 可以用 CheckBox.Group。因为使用F...

weixin_39528219的博客 1162

antd Modal + Form搭配使用 / Ant Design 4.x的Modal中表单验证

最近写React + antd时,使用到ModalForm组件时候,因为Modal组件自带onOk按钮,因此使用Form自带的onFinished函数,所以一直清楚怎么能自己发起对表单的校验。看完官网[这位博主](https://www.cnblogs.com/samve/p/13493151.html)的代码后,大致了解可以通过使用 **ref** 的方式获得表单值甚至可以发起表单校验方法。

Crayon111的博客 2798

React --- TypeScript使用 antd 中 from 与Modal的一次总结

目录 前言 表单的使用 模态框的使用 模态框中接受表单信息 前言 最近在学React、项目中选择了ts、与antd来开发项目。第一次结束,难免会碰到许多坑,在这里记录一下,希望会对需要的朋友有所帮助。 Node:(React 版本选择的是hooks,所以代码中会有所同,有兴趣的可以先去官网 看下Hooks ) 表单的使用 关于form中代码可以去antd直接选择自己需要的cop...

前端小愤青 5877

antd vue form 手动校验_【Reactantdform表单的自定义校验规则的用法

在用到antdForm组件的时候,可能会用到自定义的规则,以我的项目为例:在输入名称的时候需要请求接口,校验的内容是后台返回的内容,所以这个时候需要用到自定义的校验规则关于自定义校验方法:antd官网提供了方法validator,如下:函数由3个参数组成,rule是规则,value是你输入的值,callback是个回调函数那么具体的写法如下:将validator放在rules的数组中<调用...

weixin_39644611的博客 1395

react-antd-动态form表单

react-antd-动态form表单 1.以官网form.List为基础进改造:动态增加表单,默认且至少为一项,上限 2.虚拟设置formList的初始值 render渲染部分 <Form name="dynamic_form_item" onFinish={this.onFinish} ref={this.listForm} initialValues= {{ sendTo:

药酱的博客 2080

React Ant form 自定义校验规则问题总结

官网给出的例子很简单label="用户名"rules={[{requiredtrue,message'请输入用户名',},]}>登录重值名称说明类型仅在type为array类型时有效,用于指定数组元素的校验规则rule)

weixin_52767262的博客 2612

QJ 3103A-印制电路板设计要求.pdf

QJ 3103A-印制电路板设计要求.pdf

上一篇: anaconda spyder命令行运行闪退,打不开的解决方法
下一篇: antd表格宽度超出屏幕,列宽自适应失效
six66667
博客等级 码龄8年 40粉丝 · 31原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值