返回

Ant Design 中如何在外侧点击时触发表单验证?

前端

  1. 场景介绍
    在使用 Ant Design 构建表单时,有时我们会遇到这样的场景:表单很大,按钮和表单不在同一个组件中,或者由于其他原因,我们需要在表单外侧点击时触发表单验证。

2. 问题分析

在这种情况下,我们需要在子组件(表单组件)和父组件(按钮组件)之间建立通信,以便在按钮点击时通知表单进行验证。

3. 解决方案

3.1 子传父通信

为了实现子传父通信,我们需要在子组件中定义一个回调函数,然后将这个回调函数作为 props 传递给父组件。在父组件中,我们使用 ref 获取子组件的实例,然后在按钮点击时调用子组件的回调函数,从而触发表单验证。

3.2 ref 的使用

ref 是 React 中的一个内置属性,它允许我们访问 DOM 元素或组件实例。在子组件中,我们可以使用 ref 将子组件的实例传递给父组件。在父组件中,我们可以使用 ref 来获取子组件的实例,然后调用子组件的方法或属性。

4. 示例代码

4.1 子组件(表单组件)

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

const FormComponent = (props) => {
  const formRef = useRef();

  const onFinish = (values) => {
    console.log('Received values of form: ', values);
  };

  const triggerValidation = () => {
    formRef.current.validateFields();
  };

  return (
    <Form
      ref={formRef}
      onFinish={onFinish}
    >
      <Form.Item
        label="Username"
        name="username"
        rules={[{ required: true, message: 'Please input your username!' }]}
      >
        <Input />
      </Form.Item>
      <Form.Item
        label="Password"
        name="password"
        rules={[{ required: true, message: 'Please input your password!' }]}
      >
        <Input.Password />
      </Form.Item>
      <Button type="primary" htmlType="submit">
        Submit
      </Button>
      <Button type="default" onClick={triggerValidation}>
        Trigger Validation
      </Button>
    </Form>
  );
};

export default FormComponent;

4.2 父组件(按钮组件)

import React, { useRef } from 'react';
import FormComponent from './FormComponent';

const ButtonComponent = () => {
  const formRef = useRef();

  const triggerValidation = () => {
    formRef.current.triggerValidation();
  };

  return (
    <div>
      <FormComponent ref={formRef} />
      <Button type="primary" onClick={triggerValidation}>
        Trigger Validation
      </Button>
    </div>
  );
};

export default ButtonComponent;

5. 总结

通过将子组件的回调函数作为 props 传递给父组件,并使用 ref 获取子组件的实例,我们可以轻松地在 Ant Design 中实现表单外侧点击时触发表单验证。这种方法不仅可以解决表单过大的问题,还可以满足其他场景的需求。