antd官网描述页面多表单校验
问题
在做antd项目时发现,使用Form.create()(xxx)
创建的模块里面的Form
表单提交前可以使用this.props.form.validateFieldsAndScroll()
判断是否校验成功,this.props.form
也就是整个页面模块的Form
,那么,如果页面上有多个Form
,此时再使用this.props.form.validateFieldsAndScroll()
判断校验结果就是对整个页面的Form
进行判断,并不能够对单个Form
校验结果做判断,问题就在此,如何对单个Form
做判断?
解决方法
- 手动校验,通过对表单元素添加
change
事件监听,获取表单元素值,手动做校验,这不失为一个方法,但有违react设计的思想。 - 把表单作为一个组件独立出去,页面通过props传入表单组件需要的值,在表单组件内部单独维护相关逻辑,这也是本文推荐的方式。
案例实现
Form子组件:
1 | import React, { Component } from 'react'; |
Form子组件,接收父组件传过来的初始数据,组件中getItemsValue
自定义方法返回表单的值,需要在父组件中调用。
父组件:
1 | import React, { Component } from 'react'; |
这里关键的是使用wrappedComponentRef
属性拿到这个Form
的ref,简单的理解为拿到子组件的form实例,因此,可以在handleCreate
函数中通过this.formRef.getItemsValue()
调用自子组件的方法获取返回的form值。至此,上面的问题就解决了。
关于wrappedComponentRef
的描述详见antd官网描述。