antd自定义form表单控件

本文介绍如何使用Ant Design的CheckboxGroup创建自定义表单组件,实现全选、反选功能,并通过onCheckChange和onCheckAllChange事件处理选项变化,确保组件状态与表单值同步。

用 getFieldDecorator 方法包裹的表单控件会自动添加 value (或由 valuePropName 指定的属性名) 和 onChange (或由 trigger 指定的属性名)属性, value 接收 form 传入的值, onChange 将控件的值回调到 form 中。 这两个属性是自动添加的,所以自定义控件不能有这两个属性。
借鉴:https://www.jianshu.com/p/2091e7a2c36a

import React, { PureComponent } from "react";
import { Checkbox  } from "antd";
import styles from './index.module.less'

const CheckboxGroup = Checkbox.Group;
class CheckBox extends PureComponent {
    constructor(props) {
        super(props)
        this.state = {
            checkedList: props.value || [],
            indeterminate: true,
            checkAll: false,
        }
    }
    // 改变选中
    onCheckChange = checkedList => {
        const { onChange, options } = this.props
        this.setState({
          checkedList,
          indeterminate: !!checkedList.length && checkedList.length < options.length,
          checkAll: checkedList.length === options.length,
        })
        onChange && onChange(checkedList)
      };
    // 选中全部
    onCheckAllChange = e => {
        const {options, onChange} = this.props
        this.setState({
          checkedList: e.target.checked ? options : [],
          indeterminate: false,
          checkAll: e.target.checked,
        })
        onChange && onChange(e.target.checked ? options : [])
    }
    render() {
        const {
            showAll,
            options
        } = this.props
        return (
            <div className={styles.checkBoxWrap}>
                {
                    showAll && 
                        <Checkbox
                            indeterminate={this.state.indeterminate}
                            onChange={this.onCheckAllChange}
                            checked={this.state.checkAll}
                        >
                            全部
                        </Checkbox>
                }
                
                <CheckboxGroup
                    options={options || []}
                    onChange={this.onCheckChange}
                    value={this.state.checkedList}
                />
            </div>
            
        )
    }
}
export default CheckBox;

在 Ant Design 的 `Form` 组件中集成自定义表单控件,关键在于确保自定义组件能够与 `Form.Item` 的 `value` 和 `onChange` 机制正确交互。Ant Design 的 `Form.Item` 通过 `name` 属性自动管理表单控件的值,并提供验证逻辑。为了实现自定义控件的集成,需遵循以下步骤: ### 1. 定义自定义表单控件 自定义组件需要接受 `value` 和 `onChange` 作为 props,并在内部使用它们来更新状态。这样,`Form.Item` 可以将值传递给自定义组件,并监听其变化。 例如,定义一个按钮组控件,用于选择特定的值: ```tsx import { Button, Space } from 'antd'; const MyCustomControl = (props) => { const { value, onChange } = props; const handleSelect = (selectedValue) => { onChange(selectedValue); }; const getButtonType = (val) => { return value === val ? 'default' : 'dashed'; }; return ( <Space> <Button type={getButtonType('选项1')} onClick={() => handleSelect('选项1')}> 选项1 </Button> <Button type={getButtonType('选项2')} onClick={() => handleSelect('选项2')}> 选项2 </Button> <Button type={getButtonType('选项3')} onClick={() => handleSelect('选项3')}> 选项3 </Button> </Space> ); }; export default MyCustomControl; ``` ### 2. 在 Form 中使用自定义控件自定义组件包裹在 `Form.Item` 中,并指定 `name` 属性,这样 `Form` 可以正确管理其值和验证状态。 ```tsx import { Form } from 'antd'; import MyCustomControl from './MyCustomControl'; const CustomForm = () => { const onFinish = (values) => { console.log('Form values:', values); }; return ( <Form name="custom_form" layout="vertical" onFinish={onFinish} initialValues={{ selection: '选项1' }}> <Form.Item label="选择选项" name="selection" rules={[{ required: true, message: '请选择一个选项' }]}> <MyCustomControl /> </Form.Item> <Form.Item> <Button type="primary" htmlType="submit"> 提交 </Button> </Form.Item> </Form> ); }; export default CustomForm; ``` ### 3. 自定义控件表单数据同步 Ant Design 的 `Form.Item` 会自动将当前表单字段的 `value` 传递给自定义组件,并通过 `onChange` 监听值的变化。这样可以实现类似 Vue 的 `v-model` 的双向绑定机制。 ### 4. 表单验证与自定义控件 如果需要在自定义控件中进行验证,可以在 `Form.Item` 上添加 `rules` 属性。例如,确保用户必须选择一个选项: ```tsx <Form.Item label="选择选项" name="selection" rules={[{ required: true, message: '请选择一个选项' }]} > <MyCustomControl /> </Form.Item> ``` ### 5. 复杂数据结构的处理 如果表单字段的值是一个复杂对象(如包含多个属性的嵌套结构),可以通过 `initialValues` 设置初始值,并在自定义控件中处理对象的更新逻辑。例如,处理一个包含数字和货币单位的对象: ```tsx initialValues={{ price: { number: 0, currency: 'rmb' } }} ``` 在自定义控件中,可以通过 `value.number` 和 `value.currency` 来访问其值,并通过 `onChange` 传递更新后的对象。 ### 6. 示例:集成价格输入控件 以下是一个更复杂的示例,展示如何将包含数字输入和货币下拉选择的控件集成到 `Form.Item` 中: ```tsx import { InputNumber, Select } from 'antd'; const PriceInput = ({ value, onChange }) => { const onNumberChange = (number) => { onChange({ ...value, number }); }; const onCurrencyChange = (currency) => { onChange({ ...value, currency }); }; return ( <div style={{ display: 'flex', gap: 8 }}> <InputNumber value={value.number} onChange={onNumberChange} /> <Select value={value.currency} onChange={onCurrencyChange} options={[ { label: 'RMB', value: 'rmb' }, { label: 'USD', value: 'usd' } ]} /> </div> ); }; export default PriceInput; ``` 在 `Form` 中使用: ```tsx <Form.Item name="price" label="Price" rules={[{ validator: checkPrice }]}> <PriceInput /> </Form.Item> ``` 通过以上方式,可以将任意自定义表单控件与 Ant Design 的 `Form` 组件集成,实现灵活且功能丰富的表单交互体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值