简体   繁体   中英

Antd form value not received onFinish

I am developing an admin portal using Antd and this is something the I need in the design.

在此处输入图像描述

I managed to develop the design using the following code

<Form
labelWrap
wrapperCol={{ span: 24 }}
initialValues={detail && detail.object}
onFinish={handleEdit}>
<Row gutter={100}>
    <Col span={12}>
        <Item
            labelCol={{ span: 7 }}
            label='Status'
            name='status'
            valuePropName='checked'
            required>
            <Space> //-----------#1
                <p className='text-green'>Active</p> //--------#2
                <Switch defaultChecked={detail && detail.object.status} />
                <p className='text-red'>Inactive</p> //------------#3
            </Space> //---------#4
        </Item>
    </Col>
</Row>
</Form>

But when I try to handle the submit function, I am not getting the value of the switch element. I comes as undefined .

const handleEdit = async (values) => {
    console.log(values);
};

But I get the status value correctly when the Switch component is the immediate child of the Item by removing commented lines #1, #2, #3, #4.

I tried using the form.getFieldsValue() method. But that also didn't help.

Is there any way I can get the value in the desired way?

When you pass name prop to Form.Item , the first child of Form.Item is controlled by Form.Item . Since Switch is not the first child of Form.Item , it is not controlled by Form.Item and you didn't get the value status . There are two possible solutions:

Solution 1: Use Form.Item with noStyle prop to design the layout (You can follow this example Complex form control )

Solution 2: Create a custom component that will receives value & onChange prop. Example

import { Col, Form, Row, Space, Switch } from 'antd';

const { Item } = Form;

const CustomSwitch = ({ value, onChange }) => {
    return (
        <Space>
            <p className='text-green'>Active</p>
            <Switch value={value} onChange={onChange} />
            <p className='text-red'>Inactive</p>
        </Space>
    );
};

const App = () => {
    return (
        <Form labelWrap wrapperCol={{ span: 24 }}>
            <Row gutter={100}>
                <Col span={12}>
                    {/* Solution 1 */}
                    <Item labelCol={{ span: 7 }} label='Status'>
                        <Space>
                            <p className='text-green'>Active</p>
                            <Item name='status' noStyle valuePropName='checked' required>
                                <Switch />
                            </Item>
                            <p className='text-red'>Inactive</p>
                        </Space>
                    </Item>

                    {/* Solution 2 */}
                    <Item labelCol={{ span: 7 }} label='Status' name='status' valuePropName='checked' required>
                        <CustomSwitch />
                    </Item>
                </Col>
            </Row>
        </Form>
    );
};

export default App;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM