问题

在做antd项目时发现,使用Form.create()(xxx)创建的模块里面的Form表单提交前可以使用this.props.form.validateFieldsAndScroll()判断是否校验成功,this.props.form也就是整个页面模块的Form,那么,如果页面上有多个Form,此时再使用this.props.form.validateFieldsAndScroll()判断校验结果就是对整个页面的Form进行判断,并不能够对单个Form校验结果做判断,问题就在此,如何对单个Form做判断?

解决方法

  1. 手动校验,通过对表单元素添加change事件监听,获取表单元素值,手动做校验,这不失为一个方法,但有违react设计的思想。
  2. 把表单作为一个组件独立出去,页面通过props传入表单组件需要的值,在表单组件内部单独维护相关逻辑,这也是本文推荐的方式。

案例实现

Form子组件:

import React, { Component } from 'react';
import {Button, Form, Input, Select} from 'antd';const FormItem = Form.Item;class Forms extends Component{getItemsValue = ()=>{const val= this.props.form.getFieldsValue(); // 获取from表单的值return val;}render(){const formItemLayout = {labelCol: {xs: { span: 24 },sm: { span: 8 },},wrapperCol: {xs: { span: 24 },sm: { span: 16 },},};const { form, initValue1, initValue2, initValueList } = this.props;const { getFieldDecorator } = form; // 校验控件return(<Form style={{backgroundColor: '#fff', padding: '20px'}}><FormItem{...formItemLayout}label={`相关数量`}>{getFieldDecorator(`amount`,{rules: [{message: '必填字段!',required: true}],initialValue: initValue1 ? initValue1 : undefined})(<Input placeholder="请输入"/>)}</FormItem><FormItem{...formItemLayout}label={`选择相关名称`}>{getFieldDecorator(`name`,{rules: [{message: '必填字段!',required: false}],initialValue: initValue2 ? initValue2 : undefined})(<Selectplaceholder="请选择"onChange={this.handleSelectChange}>{initValueList && initValueList.map((x, i) => (<Option value={x.Id} key={i}>{x.name}</Option>))}</Select>)}</FormItem></Form>)}
}export default Form.create()(Forms);        //创建form实例
复制代码

Form子组件,接收父组件传过来的初始数据,组件中getItemsValue自定义方法返回表单的值,需要在父组件中调用。

父组件:

import React, { Component } from 'react';
import { Modal, Button } from 'antd';
import Forms from './Forms'export default class Modals extends Component {constructor(props) {super(props);this.state = {visible: false,initValue1: 0,initValue2: 'myName',initValueList: ["李云龙", "李荣基", "李达"]};}handleClick = () => {this.setState({visible: true})};handleCreate = () => {let values = this.formRef.getItemsValue();// 获取到子组件form的值,做进一步操作this.setState({visible: false})};render() {return (<section><Modalvisible={this.state.visible}title="编辑"onOk={this.handleCreate}onCancel={() => {this.setState({ visible: false });}}okText="保存"cancelText="取消"><FormsinitValue1={initValue1}initValue2={initValue2}initValueList={initValueList}wrappedComponentRef={(form) => this.formRef = form}/></Modal><Button onClick={()=>{ this.handleClick }}>点击弹框</Button></section>);}
}
复制代码

这里关键的是使用wrappedComponentRef属性拿到这个Form的ref,简单的理解为拿到子组件的form实例,因此,可以在handleCreate函数中通过this.formRef.getItemsValue()调用自子组件的方法获取返回的form值。至此,上面的问题就解决了。

关于wrappedComponentRef的描述详见antd官网描述。

转载于:https://juejin.im/post/5cad6567e51d456e5a0728b3

antd页面多表单校验相关推荐

  1. 【前端3】jquary:页面加载,选择器,隔行换色,Dom,全选,动画,遍历,广告/抽奖,表单校验插件

    文章目录 1.jquery框架引入:$("mydiv") 当成id选择器 2.jquery版本/对象:$(js对象) -> jquery对象 3.jquery的页面加载事件: ...

  2. 【前端2】js:原始类型,运算符,调试,页面加载,轮播图,Bom(对象,时钟),Dom(全选全不选,省市级联,隔行/触摸换色,表单校验)

    文章目录 1.js两种引入:js最终要引入到html在浏览器中运行 2.js五大原始类型:undefined 3.js的运算符和流程控制:js不支持单&和单|性能低 4.案例_99乘法表:So ...

  3. Day84.尚好房 — 功能提取、页面封装、jquery-validate表单校验、完成角色 | 用户管理模块

    目录 角色管理模块 一.角色管理代码封装  ★ 1.封装BaseDao 2.封装BaseDao 3.封装BaseServiceImpl 4.封装Controller层 二.前端页面封装 1.封装头部c ...

  4. jQuery表单校验jquery.validate.js的使用

    jQuery是一个快速.简洁的js库,为网站的快速开发简化了HTML文档遍历,事件处理,动画,以及Ajax交互.使用jQuery将极大的提高编写javascript代码的效率, 让写出来的代码更加优雅 ...

  5. JQuery 表单校验

    表单校验的作用 为什么要进行表单验证:保证数据符合要求 为什么要进行JavaScript或者jQuery表单验证: 1.降低服务器端负担 2.还可以进行服务器验证(JSP) 正则表达式 为什么使用正则 ...

  6. JEECG 3.7.8 新版表单校验提示风格使用升级方法(validform 新风格漂亮,布局简单)

    JEECG 表单校验新提示风格使用讲解&升级方法 (validform 新风格漂亮,布局简单) JEECG 表单校验采用的是validform,默认的校验提示需要占用页面布局,提示效果较传统. ...

  7. 开发指南专题十:JEECG微云快速开发平台--表单校验组件ValidForm

    开发指南专题十:JEECG微云快速开发平台--表单校验组件ValidForm 10.4Validform对象[方法支持链式调用] 如示例 var demo=$(".formsub" ...

  8. 开发指南专题九:JEECG微云快速开发平台-表单校验组件ValidForm

    开发指南专题九:JEECG微云快速开发平台表单校验组件ValidForm 10.表单校验组件ValidForm 10.1使用入门 1.引入css 请查看下载文件中的style.css,把里面Valid ...

  9. vue form validate 多个input_Vue表单校验插件Vuerify使用详细教程及示例

    点击右上方红色按钮关注"web秀",让你真正秀起来 前言 表单校验,在开发中是非常常见的,为了防止用户误操作,填写错误数据,亦或是防止用户恶意提交数据等,都需要前端同学来做一些简单 ...

最新文章

  1. 2021年大数据Spark(四十八):Structured Streaming 输出终端/位置
  2. Java数据库查询简介
  3. [数据库] Navicat for MySQL事件Event实现数据每日定期操作
  4. 7wifi模块多少钱_APP开发要多少钱?创业者估算成本的四个方法
  5. uni-app android权限
  6. 医疗信息化建设售后服务方案
  7. 基于matlab的汉明码信道编码,信道编码仿真.doc
  8. 【Python笔记】Pandas时区处理
  9. 骨骼动画详解-Spine
  10. ckfinder 配置 php,GitHub - itxq/ckfinder: CkFinder3.5.1 for PHP 优化版 (添加又拍云存储)...
  11. 最长的指定瑕疵度的元音字串
  12. 关于vscode 中Live Server插件无法弹出Chrome浏览器问题
  13. 英文Assignment写作段落重要性讲解
  14. 【民间文学论文】《苗族古歌》中的浪漫主义和物我互渗艺术思想(节选)
  15. 智能网联汽车封闭测试场建设内容简介​
  16. qt中新增html,Qt和HTML笔记:初始化
  17. 在币圈, 如何玩转反间计?
  18. 控制别人计算机鼠标点了无反应,Win10电脑qq远程协助时为什么无法控制对方电脑或则点了对方电脑没反应...
  19. NETFLOW 与 SNMP两种不同的网络监控方法
  20. 落实“新基建”部署,坚持服务为本,推动新能源汽车充电桩建设

热门文章

  1. 把自己的电脑作为网络代理服务器
  2. python实现图像识别水果_使用Python实现基于图像识别的iOS自动化测试
  3. PB控件属性之Tab
  4. esp8266 OTA 云远程更新固件 wifiupdate
  5. cobble批量装机原理与部署
  6. Win10系统CLSID大全
  7. 用 Java 实现拦截器 Interceptor 的拦截功能
  8. Ubuntu 下的磁盘管理
  9. 【Godot】加载文件数据
  10. linux系统如何改电脑地址,如何修改电脑的操作系统MAC地址