ant-design自定义表单组件回传值的问题

17 篇文章 0 订阅

getFieldDecorator这个方法会向组件注入value参数,onChange方法。子组件通过value参数来初始化值,通过onChange方法通知父组件更新。 如果想传入其他参数,也可以像placeholder那样显示的传入。

官方定义:

自定义或第三方的表单控件,也可以与 Form 组件一起使用。只要该组件遵循以下的约定:

  • 提供受控属性 value 或其它与 valuePropName 的值同名的属性。

  • 提供 onChange 事件或 trigger 的值同名的事件。

  • 支持 ref:

    • React@16.3.0 之前只有 Class 组件支持。

    • React@16.3.0 及之后可以通过 forwardRef 添加 ref 支持。(示例

官方的案例:

import { Form, Input, Select, Button } from 'antd';

const { Option } = Select;

class PriceInput extends React.Component {
  static getDerivedStateFromProps(nextProps) {
    // Should be a controlled component.
    if ('value' in nextProps) {
      return {
        ...(nextProps.value || {}),
      };
    }
    return null;
  }

  constructor(props) {
    super(props);

    const value = props.value || {};
    this.state = {
      number: value.number || 0,
      currency: value.currency || 'rmb',
    };
  }

  handleNumberChange = e => {
    const number = parseInt(e.target.value || 0, 10);
    if (isNaN(number)) {
      return;
    }
    if (!('value' in this.props)) {
      this.setState({ number });
    }
    this.triggerChange({ number });
  };

  handleCurrencyChange = currency => {
    if (!('value' in this.props)) {
      this.setState({ currency });
    }
    this.triggerChange({ currency });
  };

  triggerChange = changedValue => {
    // Should provide an event to pass value to Form.
    const { onChange } = this.props;
    if (onChange) {
      onChange({
        ...this.state,
        ...changedValue,
      });
    }
  };

  render() {
    const { size } = this.props;
    const { currency, number } = this.state;
    return (
      <span>
        <Input
          type="text"
          size={size}
          value={number}
          onChange={this.handleNumberChange}
          style={{ width: '65%', marginRight: '3%' }}
        />
        <Select
          value={currency}
          size={size}
          style={{ width: '32%' }}
          onChange={this.handleCurrencyChange}
        >
          <Option value="rmb">RMB</Option>
          <Option value="dollar">Dollar</Option>
        </Select>
      </span>
    );
  }
}

class Demo extends React.Component {
  handleSubmit = e => {
    e.preventDefault();
    this.props.form.validateFields((err, values) => {
      if (!err) {
        console.log('Received values of form: ', values);
      }
    });
  };

  checkPrice = (rule, value, callback) => {
    if (value.number > 0) {
      callback();
      return;
    }
    callback('Price must greater than zero!');
  };

  render() {
    const { getFieldDecorator } = this.props.form;
    return (
      <Form layout="inline" onSubmit={this.handleSubmit}>
        <Form.Item label="Price">
          {getFieldDecorator('price', {
            initialValue: { number: 0, currency: 'rmb' },
            rules: [{ validator: this.checkPrice }],
          })(<PriceInput />)}
        </Form.Item>
        <Form.Item>
          <Button type="primary" htmlType="submit">
            Submit
          </Button>
        </Form.Item>
      </Form>
    );
  }
}

const WrappedDemo = Form.create({ name: 'customized_form_controls' })(Demo);

ReactDOM.render(<WrappedDemo />, mountNode);

自定义校验:

<FormItem label="负责人">
                        {getFieldDecorator('dataBusiness', {
                            initialValue: undefined,
                            rules: [
                                {
                                    required: true,
                                    type: 'array',
                                    validator: (rule: any, value1: TSType, callback: any) => {
                                        if (value1) {
                                            if (value1.length == 0) {
                                                callback('请添加至少一个负责人!');
                                            } else {
                                                callback()
                                                return
                                            }
                                        } else {
                                            callback('请添加至少一个负责人!');
                                        }
                                    },

                                }],
                        })(<AddOwner placeholder="请添加至少一个负责人!" key='businessOwner'></AddOwner>)}
                    </FormItem>

参考文章:

https://www.jianshu.com/p/ccafabfd8589

https://www.cnblogs.com/tian874540961/p/10975409.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ant-design 是一个流行的React UI组件库,提供了丰富的组件来帮助开发者快速构建用户界面。在ant-design中,验证是一个重要的功能,可以通过自定义组件来实现。 对于自定义组件,我们可以使用Form.create方法来创建一个高阶组件。在自定义组件中,我们可以通过getFieldDecorator方法来包装我们的自定义组件,实现验证的功能。 在包装自定义组件时,我们可以使用rules参数来定义验证规则。比如,我们可以通过required:true来指定该字段为必填项,通过message参数来指定验证不通过时的错误提示信息。除此之外,我们还可以自定义其他验证规则,比如验证正则达式、长度范围等。 在自定义组件中,可以通过this.props.form.getFieldError来获取某个字段的验证错误信息,通过this.props.form.isFieldValidating来判断某个字段是否正在进行验证,通过this.props.form.validateFields来触发验证。 同时,我们还可以使用validateTrigger参数来指定触发验证的时机,默认是onChange事件。比如,我们可以将validateTrigger设置为onBlur,示在失去焦点时进行验证。 总结来说,ant-design提供了一系列的API来实现验证功能,通过自定义组件的方式可以很方便地实现对自定义组件的验证。开发者可以根据自己的需求灵活使用这些API来完成验证的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值