返回

庖丁解牛Ant Design之Form组件

前端

Antd Form相信大家并不陌生,在中后台业务中,表单页面经常用到,但是大家知道它是如何设计和实现的吗?本文并不涉及具体源码分析,而是手把手带你实现一个简易版的Antd Form。

1. Form组件

Form组件是Antd Form的核心,它负责管理表单的状态、校验规则和提交逻辑。我们首先来实现一个简单的Form组件:

import React, { useState } from 'react';

const Form = ({ children, onSubmit }) => {
  const [values, setValues] = useState({});

  const handleSubmit = (e) => {
    e.preventDefault();
    onSubmit(values);
  };

  const handleChange = (e) => {
    const { name, value } = e.target;
    setValues({ ...values, [name]: value });
  };

  return (
    <form onSubmit={handleSubmit}>
      {children}
    </form>
  );
};

export default Form;

这个Form组件接收两个props:children和onSubmit。children是表单的子元素,onSubmit是表单提交时的回调函数。

在Form组件内部,我们使用useState来管理表单的状态。values是一个对象,它包含了表单中所有输入框的值。

当用户在表单中输入值时,handleChange函数会被触发。该函数将更新values对象,并把新的值存储在状态中。

当用户点击提交按钮时,handleSubmit函数会被触发。该函数将调用onSubmit回调函数,并将values对象作为参数传递给它。

2. Field组件

Field组件是Antd Form中另一个重要的组件,它负责管理单个输入框的状态和校验规则。我们接下来来实现一个简单的Field组件:

import React, { useState } from 'react';

const Field = ({ name, label, rules, children }) => {
  const [value, setValue] = useState('');
  const [error, setError] = useState('');

  const handleChange = (e) => {
    const { value } = e.target;
    setValue(value);

    // 校验规则
    const errors = rules.map((rule) => {
      if (rule.required && value === '') {
        return rule.message;
      }
      return null;
    });

    setError(errors.find((error) => error !== null));
  };

  return (
    <div className="ant-form-item">
      <label className="ant-form-item-label">{label}</label>
      <div className="ant-form-item-control">
        {children}
        <div className="ant-form-item-explain">{error}</div>
      </div>
    </div>
  );
};

export default Field;

这个Field组件接收四个props:name、label、rules和children。name是输入框的名称,label是输入框的标签,rules是输入框的校验规则,children是输入框本身。

在Field组件内部,我们使用useState来管理输入框的状态和校验状态。value是输入框的值,error是输入框的错误信息。

当用户在输入框中输入值时,handleChange函数会被触发。该函数将更新value和error状态。

3. 使用Antd Form

现在我们已经实现了Form和Field两个组件,就可以使用它们来构建一个简单的表单了。

import React from 'react';
import { Form, Field } from './components';

const App = () => {
  const handleSubmit = (values) => {
    console.log(values);
  };

  return (
    <Form onSubmit={handleSubmit}>
      <Field name="username" label="用户名" rules={[{ required: true, message: '请输入用户名' }]}>
        <input type="text" />
      </Field>
      <Field name="password" label="密码" rules={[{ required: true, message: '请输入密码' }]}>
        <input type="password" />
      </Field>
      <button type="submit">提交</button>
    </Form>
  );
};

export default App;

这个表单包含两个输入框:用户名和密码。当用户点击提交按钮时,handleSubmit函数会被触发,并将表单中的值打印到控制台。

总结

本文带你从零开始实现了