Ant Design Form.Provider 提交验证多个Form表单

发布于 2022-09-13 00:21:01 字数 300 浏览 15 评论 0

场景:在一个大组件中、我利用Form.Provider管理了很多的form组件、跟Form.Provider组件的兄弟组件需要验证整个表单、流程大致如下:

image.png

问题:class 组件编写;请问一下 有什么验证的方法吗?查阅文档我发现可以利用 Form.useForm(); 方法得到当前的from 但是如何利用ref 找到全部的组件进行管理呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

赠我空喜 2022-09-20 00:21:01

目前已经解决:
1、首先在按钮点击的时候传递一个时间戳到Form.Provider组件、
2、Form.Provider组件中通过ref把不同的from1、from2、from3等等子组件进行传递
3、子组件通过forwardRef转发方式指定不同的from
4、在Form.Provider组件进行统一的验证,过滤结果在传递到公共组件

以下是伪代码:

import React,{ useRef, forwardRef, useEffect, useState} from 'react'
import { Form, Input, Button } from 'antd';

const From1 = forwardRef((props, ref) => {
  return (
    <>
      <h3>第一个表单组件</h3>
      <Form
        ref={ref}
      >
        <Form.Item
        label="用户名"
        name='user'
         rules={[
            {
              required: true,
              whitespace:true,
              message: '请输入用户名'
            }
          ]}
          >
            <Input placeholder="请输入用户名" style={ { width:"200px"}}/>
        </Form.Item>
      </Form>
    </>
  )
})

const From2 = forwardRef((props, ref) => {
  return (
    <>
      <h3>第一个表单组件</h3>
      <Form
        ref={ref}
      >
        <Form.Item
        label="链接"
        name='link'
         rules={[
            {
              required: true,
              whitespace:true,
              message: '配置链接接为必填项'
            }
          ]}
          >
            <Input placeholder="请输入链接" style={ { width:"200px"}}/>
        </Form.Item>
      </Form>
    </>
  )
})

const FormProvider = ({mun }) => {
  const from1 = useRef(null)
  const from2 = useRef(null)

  // 校验全部
  const verificationList = async () => {
    try{

    
      const result = await Promise.all([ from1.current.validateFields(),from2.current.validateFields()])
      console.log(result)
      result && console.log('验证成功')
    }catch(error){

      console.log(error)
    }
  }
  
  useEffect(() => {
    if(mun) {
      console.log(mun)
      verificationList()
    }
  }, [mun])



  return (
    <Form.Provider>
      <From1 ref={from1}/>
      <From2 ref={from2}/>
    </Form.Provider>
  )
}

const ParentComponent = () => {
  
  const [mun, setMun] = useState(null)

  return (
    <>
      <h2>我是外层的父组件</h2>
      <Button onClick={ () => setMun(+Date.now())}>点击我验证</Button>
      <FormProvider mun={mun} />
    </>
  )
}

export default ParentComponent;

参考:精读《useRef 与 createRef 的区别》

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文