Form.Item创建自定义表单

news2025/2/24 5:51:39

一、概述

Antd是一个非常强大的UI组件库,里面的Form表单组件也基本能满足我们大多数场景。但是也有需要自定义表单的场景。

  • Vue2里我们使用v-model,结合子组件的model属性,来实现自定义组件的双向绑定。

  • Vue3里我们使用v-model,结合子组件的update:modelValue来实现同样功能。

  • 到了React+Antd中,我们采用引用父组件默认传入onChange事件,子组件调用来实现。

二、开发实现

1、代码

父组件代码:

import { Button, Space, Form, Input, Radio, Switch } from "antd";
import MyBtns from "./components/myBtns";
import { useState, useEffect } from "react";

function Index() {
    const [form] = Form.useForm();
    const [formData, setFormData] = useState<Object>({});

    const layout = {
        name: "myFrom",
        autoComplete: "off",
        labelCol: {
            span: 3,
        },
        wrapperCol: {
            span: 21,
        }
    };
    const initData = {
        title: "IT飞牛的自定义表单",
        item1: "选项-2",
    };

    const onFinish = async (values: Object) => {
        //提交数据
        //...
    }
    const onReset = () => {
        form.resetFields();
    };
    useEffect(() => {
        setFormData(initData);
    }, [])

    return <div>
        {JSON.stringify(formData)}
        <Form
            onFinish={onFinish}
            onValuesChange={(changedValues, allValues) => { setFormData(allValues) }}
            form={form}
            labelAlign="right"
            initialValues={initData}
            style={{
                "marginTop": "50px"
            }}
            {...layout}
        >
            <Form.Item name="title" label="标题">
                <Input />
            </Form.Item>
            <Form.Item name="item1" label="自定义项">
                <MyBtns />
            </Form.Item>
            <Form.Item wrapperCol={{ offset: 3, span: 21 }}>
                <Space size="middle">
                    <Button htmlType="button" onClick={onReset}>
                        取消
                    </Button>
                    <Button type="primary" htmlType="submit">
                        提交
                    </Button>
                </Space>
            </Form.Item>
        </Form>
    </div >
}

export default Index;

子组件(myBtns.tsx)代码:

import { Button, Space } from "antd";

const myBtns = (props: any) => {
    const { value, onChange } = props //value 是form表单中"name"对应的字段值

    const onSelected = (val: string) => {
        onChange(val)
    }

    const getTypeClass = (val: string) => {
        return value == val ? "default" : "dashed";
    }

    return <Space>
        <Button type={getTypeClass("选项1")} onClick={() => onSelected("选项1")}>选项1</Button>
        <Button type={getTypeClass("选项2")} onClick={() => onSelected("选项2")}>选项2</Button>
        <Button type={getTypeClass("选项3")} onClick={() => onSelected("选项3")}>选项3</Button>
    </Space>
}

export default myBtns;

2、最终效果

请添加图片描述

可以看到,表单中有两个选项,第一个是Input组件,第二个是自定义组件MyBtns,已经实现数据的事实更新。

3、原理

Form.Item 在渲染时会注入 valueonChange 事件给子元素。

  • value:form.item对应的name属性的值,可用作默认值以及返显
  • onChange:用于监听value元素值的变化,并将其传给form.item使其可以通过相关api获得其值

注意:当你的字段组件被包裹时属性将无法传递。所以以下代码是不会生效的:

<Form.Item name="input">
  <div>
    <h3>I am a wrapped Input</h3>
    <Input />
  </div>
</Form.Item>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/961109.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

没有苹果开发者账号能否创建ios证书-最新

​ 目录 摘要&#xff1a; 引言&#xff1a; 步骤一&#xff1a; 步骤二&#xff1a; 步骤三&#xff1a; 步骤四&#xff1a; 步骤五&#xff1a; 总结&#xff1a; 摘要&#xff1a; 本文介绍了在没有Mac电脑的情况下&#xff0c;使用appuploader工具生成iOS证书和描…

高通QualComm、MTK耦合测频段工具和综测校准工具的自由定制 与工厂Mes对接、使用PowerMeter测量等

一.MTK耦合工具V1.3 20220409 MTK芯片 1.逻辑&#xff1a; 打开软件&#xff0c;扫码SN&#xff0c;自动连接&#xff0c;连接成功后 1).开启强发&#xff08;强发参数 LTE频段 1、3、5、7、28&#xff09; 2).读测量值 3).结果判定&#xff…

【计算机组成 课程笔记】3.2 算数运算和逻辑运算的硬件实现

课程链接&#xff1a; 计算机组成_北京大学_中国大学MOOC(慕课) 3 - 2 - 302-门电路的基本原理&#xff08;11-39--&#xff09;_哔哩哔哩_bilibili 现代计算机的CPU和其他很多功能部件都是基于晶体管的集成电路&#xff0c;想要了解计算机组成的基本原理&#xff0c;还是需要有…

电脑报错提示xinput1_3.dll缺失怎么办?xinput1_3.dll丢失的简单恢复方案

今天&#xff0c;我将为大家分享一个与我们日常工作息息相关的话题——xinput1_3.dll丢失的4种解决方法。在我们的日常工作和生活中&#xff0c;电脑出现问题是常有的事&#xff0c;而xinput1_3.dll丢失则是其中较为常见的一种问题。那么&#xff0c;什么是xinput1_3.dll?它为…

C盘扩容遇到的问题(BitLocker解密、)

120G的C盘不知不觉的就满了&#xff0c;忍了好久终于要动手了。 尽管电脑-管理--磁盘管理里可以进行磁盘大小调整&#xff0c;但由于各盘都在用&#xff0c;不能够连续调整&#xff0c;所以选用DiskGenius。 # DiskGenius调整分区大小遇到“您选择的分区不支持无损调整容量” …

undolog

一、原子性 ACID&#xff1a;通过undolog保证原子性 二、undolog 如何做 把回滚时所需的东西都给记下来&#xff1a; 1、插入一条记录时&#xff0c;至少要把这条记录的主键值记下来&#xff0c;回滚的时候只需要把这个主键值对应的记录删掉就好了。 2、删除了一条记录&…

10 行代码能做什么?

10 行代码能做什么&#xff1f; 写一串 SQL Join&#xff0c;统计全渠道市场营销的 ROI 用 JS 画个饼图&#xff0c;展示最有效的广告投放策略 用 Python 写段算法&#xff0c;分析销量骤降的原因是什么 …… 数据出错了&#xff0c;写个对数脚本 -_-|| AI 时代&#xff0c;…

AI图像行为分析算法 opencv

AI图像行为分析算法通过pythonopencv深度学习框架对现场操作行为进行全程实时分析&#xff0c;AI图像行为分析算法通过人工智能视觉能够准确判断出现场人员的作业行为是否符合SOP流程规定&#xff0c;并对违规操作行为进行自动抓拍告警。OpenCV是一个基于Apache2.0许可&#xf…

管理类联考——逻辑——汇总篇——知识点突破——形式逻辑——联言选言——定义

角度——本质定义 联言 联言命题是断定两种或两种以上事物情况同时存在的命题&#xff0c;用“A并且B”表示&#xff0c;逻辑符号为A ∧ B。 若“A ∧ B”为真&#xff0c;表明A是真的&#xff0c;同时B也是真的。 【定义】联言命题是表示若干判断同时成立的命题。 【刻画】…

Java与其他编程语言比较分析,编程语言选择与优点、缺点和适用场景详解

原文地址&#xff1a;Java与其他编程语言比较分析&#xff0c;编程语言选择与优点、缺点和适用场景详解 Java 擅长可移植性和可靠性&#xff0c;Python 擅长通用性和简单性&#xff0c;JavaScript 擅长 Web 开发&#xff0c;C 擅长性能&#xff0c;Go 擅长效率。网址:yii666.c…

网御星云-上网行为管理系统bottomframe.cgi接口存在SQL注入

一、免责声明&#xff1a; 本次文章仅限个人学习使用&#xff0c;如有非法用途均与作者无关&#xff0c;且行且珍惜&#xff1b;由于传播、利用本公众号所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;公众号望雪阁及作者不为此…

OS 内存使用和分段

磁盘很大但是内存很小&#xff0c;当进程一堵塞的时候&#xff0c;就把进程一放入磁盘&#xff0c;然后进程二进去。进程三睡眠的时候在把二和三交换&#xff0c;所以载入之后重定位不太行 GDT是整个操作系统的段表&#xff0c;多个进程的 LDT时某个进程的段表

SpringBoot 博客网站

SpringBoot 博客网站 系统功能 登录注册 博客列表展示 搜索 分类 个人中心 文章分类管理 我的文章管理 发布文章 开发环境和技术 开发语言&#xff1a;Java 使用框架: SpringBoot jpa H2 Spring Boot是一个用于构建Java应用程序的开源框架&#xff0c;它是Spring框架的一…

Spring版本与JDK版本演变

Java各版本变更核心API Java8 lambada表达式函数式接口方法引用默认方法Stream API 对元素流进行函数式操作Optional 解决NullPointerExceptionDate Time API重复注解 RepeatableBase64使用元空间Metaspace代替持久代&#xff08;PermGen space&#xff09; Java7 switch 支…

哈希表与有序表

哈希表与有序表 Set结构 key Map结构 key-value 哈希表 哈希表的时间复杂度都是常数项级别的&#xff0c;但常数较大 增删改查的时间都是常数级别的&#xff0c;与数据量无关 当哈希表存储的值是基础数据类型&#xff08;Integer - int&#xff09;&#xff0c;哈希表中内…

第6讲:利用VBA获得指定行、列中最后一个非空单元格

【分享成果&#xff0c;随喜正能量】修行佛法从哪儿下手呢&#xff1f;要从信心下手。佛法大海&#xff0c;唯信能入。三皈依就是世间获得吉祥如意&#xff0c;出世间获得究竟解脱的正因&#xff0c;慎勿退失&#xff0c;谨守修行。。 《VBA代码解决方案》(10028096)这套教程是…

一种改进多旋翼无人机动态仿真的模块化仿真环境研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

详细的SAP的付款条件测试

详细的SAP的付款条件测试 正好需要看一个清账日期的问题&#xff0c;然后重新理了一下付款条件&#xff0c;特此记录&#xff0c;省的后面每次都要捋一遍。其实真正能做到按照条件付款的良心企业很少。 付款条件修改事务码&#xff1a;OBB8 1、凭证日期作为基准&#xff0c;…

迅镭激光大幅面光纤激光切割机中标全球最大航运企业中国远洋海运!

征程万里阔&#xff0c;奋斗正当时! 今年以来&#xff0c;迅镭激光锚定战略目标&#xff0c; 坚持以市场为导向&#xff0c;稳中求进、守正创新&#xff0c; 各业务板块持续发力&#xff0c;频频中标多个行业龙头企业! 近日&#xff0c;公司再次传来好消息&#xff0c;中标全球…

存储型XSS获取网站后台

首先&#xff0c;在XSS平台获取一个地址 将XSS代码存在可能存在XSS漏洞的留言框 管理员登录和查看留言信息即会触发XSS 然后就可以利用cookie直接进入后台