react antd Form.List动态设置默认值

文章描述了如何使用React的Form组件和useStateHook实现两个Select下拉框的级联选择,当第一个Select发生变化时,会自动更新并设置第二个Select的默认值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意:代码中的两个select是级联的,切换第一个select的内容会设置第二个select的默认值

 

js部分

const [form] = Form.useForm();

    const cityData = ['kafka1', 'testTwo'];

    const logassetData = {

        kafka1: ['logasset', '测试222'],

        testTwo: ['测试一一一', '测试二二二'],

    };

    const [cities, setCities] = useState(logassetData[cityData[0]]);

    const [secondCity, setSecondCity] = useState(logassetData[cityData[0]][0]);

    const [open, setOpen] = useState(true);

    //下拉框级联

    const handleProvinceChange = (value, key) => {

        //change时设置默认值

        const fields = form.getFieldsValue();

        const { ziduan } = fields; //ziduan是Form.List的name,需要拿出来重新组装下数据

        if (value) {

            Object.assign(ziduan[key], { logasset: logassetData[value][0] })

            form.setFieldsValue({ ziduan })

            setSecondCity(logassetData[value][0]);

            setCities(logassetData[value]);//设置第二个下拉框的默认值

        }

    };

    const onSecondCityChange = (value) => {

        setSecondCity(value);

    };

html部分

 <Form className='formContainer' form={form}>

            {/* 初始化默认展示两行 ,默认展示几行就在initialValue下写几个对象,好像可以设置数字,不过我没试过*/}

            <Form.List name="ziduan" initialValue={[{ logasset: secondCity }, { logasset: secondCity }]}>

                {(fields, { add, remove }) => (

                    <div className={'ziduan'}>

                        <Row>

                            <Col span={8} style={{ fontSize: 18, fontWeight: 600 }}>

                                表

                            </Col>

                        </Row>

                        {fields.map(({ key, name, ...restField }) => (

                            <div className='yuanBiao' style={{ display: 'flex', alignItems: 'center',                                 marginTop: 15, position: 'relative' }} key={key}>

                                <Row

                                    style={{ width: '100%' }}

                                >

                                    <Col className="gutter-row" span={11}>

                                        <Form.Item

                                            name={[name, 'kafka1']}

                                            {...restField}

                                            rules={[

                                                {

                                                    required: true,

                                                    message: 'kafka1不能为空',

                                                },

                                            ]}

                                        >

                                            <Select

                                                allowClear

                                                options={cityData.map((province) => ({

                                                    label: province,

                                                    value: province,

                                                }))}

                                                onChange={(e) => handleProvinceChange(e, key)}

                                                defaultValue={cityData[0]}

                                            >

                                            </Select>

                                        </Form.Item>

                                    </Col>

                                    <Col className="gutter-row" span={11}>

                                        <Form.Item

                                            name={[name, 'logasset']}

                                            {...restField}

                                            rules={[

                                                {

                                                    required: true,

                                                    message: 'logasset不能为空',

                                                },

                                            ]}

                                        >

                                            <Select

                                                allowClear

                                                onChange={onSecondCityChange}

                                                options={cities.map((city) => ({

                                                    label: city,

                                                    value: city,

                                                }))}

                                            >

                                            </Select>

                                        </Form.Item>

                                    </Col>

                                    <Col span={1}>

                                        <div

                                            onClick={() => remove(name)}

                                            style={{ margin: '4px 0px 0px 12px' }}

                                        >

                                            <MinusCircleOutlined />

                                        </div>

                                    </Col>

                                </Row>

                            </div>

                        ))}

                        <Row justify={'space-between'} align={'middle'} gutter={[16, 0]}>

                            <Col span={24}>

                                <Button

                                    type="dashed"

                                    onClick={() => add({ logasset: cities[0] })}

                                    block

                                    icon={<PlusOutlined />}

                                    style={{ marginBottom: '20px' }}

                                >

                                </Button>

                            </Col>

                            <Col span={1} />

                        </Row>

                    </div>

                )}

            </Form.List>

</Form>

 // rules只有在设置了name属性之后才生效,如不需要展示lable,则*也会消失,需要设置css样式即可

  .target::before {

        display: inline-block;

        margin-right: 4px;

        color: #ff4d4f;

        font-size: 14px;

        font-family: SimSun, sans-serif;

        line-height: 1;

        content: '*';

    }

### 使用 Ant Design 的 `Form.List` 实现动态表单项 为了实现动态增删表单项的功能,在 Ant Design 中可以利用 `Form.List` 组件。此组件允许开发者轻松管理不确定数量的子表单字段集合。 下面是一个具体的实例,展示了如何设置初始值使得页面加载时默认显示至少一个输入框,并提供了添加新条目和移除现有条目的功能: ```jsx import React from 'react'; import { Form, Input, Button } from 'antd'; const DynamicFormItemExample = () => { const layout = { labelCol: { span: 8 }, wrapperCol: { span: 16 }, }; return ( <Form name="dynamic_form_item" {...layout}> {/* 设置initialValue属性使首次渲染时就有一个空对象 */} <Form.List name="users" initialValue={[{}]}> {(fields, { add, remove }) => ( <> {fields.map(({ key, name, fieldKey, ...restField }) => ( <div style={{ marginBottom: 8 }} key={key}> <Form.Item required={false} {...restField} name={[name, 'firstName']} fieldKey={[fieldKey, 'firstName']} rules={[ { required: true, message: 'First Name is required', }, ]} > <Input placeholder="First Name" /> </Form.Item> <Button type="link" onClick={() => remove(name)}> Remove </Button> </div> ))} <Form.Item> <Button block onClick={() => add()} type="dashed"> Add Field </Button> </Form.Item> </> )} </Form.List> <Form.Item> <Button htmlType="submit">Submit</Button> </Form.Item> </Form> ); }; export default DynamicFormItemExample; ``` 这段代码实现了以下特性: - 页面初次加载时会自动展示一条空白记录供编辑[^1]。 - 用户可以通过点击按钮来新增更多的同类型输入区域[^1]。 - 对于不再需要的某一行,用户也可以选择将其删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值