antd Form shouldUpdate 关联展示 form 数组赋值

form 数组中嵌套数值更新

注意:数组是引用类型

在这里插入图片描述
项目需求,表单中包含多个产品信息,使用form.list 数组嵌套,提货方式如果是邮寄展示地址,如果是自提,需要在该条目中增加两项

代码如下:
// An highlighted block
<Card 
                    title="产品信息" 
                    bordered={false}>
                    <Form.List name="productList" >
                            {(fields, {add, remove}) => (
                              <>
                                {fields.map((field,index) => (
                                    <Row  gutter={16} >
                                                {/* 用得时候只需要修改下面,将需要重复展示的部分替换下面部分即可 注意 -----start*/ }
                                                <Col sm={24} md={12} lg={8} xxl={6}>
                                                        <Form.Item 
                                                            {...field}
                                                            label="库存组织"
                                                            name={[field.name,"kuCun"]}
                                                            rules={[{
                                                                    required: true,
                                                                    message: '请选择',
                                                                },]}
                                                                >
                                                            <Select>
                                                                <Select.Option value="u238475">u238475</Select.Option>
                                                                <Select.Option value="u238472">u238472</Select.Option>
                                                            </Select>
                                                        </Form.Item>
                                                </Col>
                                                <Col sm={24} md={12} lg={8} xxl={6}>
                                                        <Form.Item 
                                                            {...field}
                                                            label="产品线"
                                                            name={[field.name,"chanPin"]}
                                                            rules={[{
                                                                    required: true,
                                                                    message: '请输入',
                                                                },]}
                                                                >
                                                             <Select>
                                                                <Select.Option value="you1">CTM-产品1</Select.Option>
                                                                <Select.Option value="zi1">CTM-产品2</Select.Option>
                                                            </Select>
                                                        </Form.Item>
                                                </Col>
                                                <Col sm={24} md={12} lg={8} xxl={6}>
                                                        <Form.Item 
                                                            {...field}
                                                            label="产品名称"
                                                            name={[field.name,"wuMiao"]}
                                                            rules={[{
                                                                    required: true,
                                                                    message: '请输入',
                                                                },]}
                                                                >
                                                            <Input placeholder="请输入" />
                                                        </Form.Item>
                                                </Col>
                                                
                                                <Col sm={24} md={12} lg={8} xxl={6}>
                                                        <Form.Item 
                                                            {...field}
                                                            label="提货方式"
                                                            name={[field.name,"tType"]}
                                                            rules={[{
                                                                    required: true,
                                                                    message: '请输入',
                                                                },]}
                                                                >
                                                            <Select>
                                                                <Select.Option value="you">邮寄</Select.Option>
                                                                <Select.Option value="zi">自提</Select.Option>
                                                            </Select>
                                                        </Form.Item>
                                                </Col>
                                                <Form.Item noStyle  shouldUpdate={(pre,cur) => {
                                                //    如果删除一条信息,cur.productList[index]是空值,所以需要判断
                                                    if(cur.productList[index]&&pre.productList[index]){
                                                        // 判断当前是自提还是邮寄
                                                        return pre.productList[index].tType !== cur.productList[index].tType
                                                    }else{
                                                        return false
                                                    }
                                                }}>
                                                    {({getFieldValue}) =>{
                                                        const type = getFieldValue('productList')
                                                        
                                                        {/* 当前是自提的时候需要填写自提人信息 */}

                                                        if(type[index].tType&&type[index].tType=='zi'){
                                                        return <>
                                                        <Col sm={24} md={12} lg={8} xxl={6}>
                                                                <Form.Item 
                                                                    {...field}
                                                                    label="自提人姓名"
                                                                    name={[field.name,"tName"]}
                                                                    rules={[{
                                                                            required: true,
                                                                            message: '请输入',
                                                                        },]}
                                                                        >
                                                                        <Input placeholder="请输入" />

                                                                </Form.Item>
                                                        </Col>
                                                        <Col sm={24} md={12} lg={8} xxl={6}>
                                                                <Form.Item 
                                                                    {...field}
                                                                    label="身份证号"
                                                                    name={[field.name,"tShen"]}
                                                                    rules={[{
                                                                            required: true,
                                                                            message: '请输入',
                                                                        },]}
                                                                        >
                                                                        <Input placeholder="请输入" />

                                                                </Form.Item>
                                                        </Col>
                                                        </>
                                                        }else{
                                                            {/* 有一个问题,当切换回邮寄。之前填写的自提人和身份证号删除
                                                                (只需要将type数组中的数据清空即可,不需要再特意给form赋值,他们是引用类型) */}
                                                            Object.assign(type[index],{tName:'',tShen:''})
                                                            return <></>
                                                        }

                                                    }}

                                                </Form.Item>
                                               

                                                { /* 用得时候只需要修改下面,将需要重复展示的部分替换下面部分即可 -----end*/ }
                                                        
                                                <div styleName="item_btn_wrap">
                                                    <PlusCircleFilled styleName="add_item_btn" onClick={() => add({tType:'zi'})} />
                                                    {fields.length>1&&<CloseCircleFilled  styleName="remove_item_btn" onClick={() => remove(field.name)} />}
                                                </div>
                                    </Row>
                                ))}
                                </>

                            )}

                    </Form.List>
                </Card>
**关键点解释**

 1. shouldUpdate 是依赖当前form中的变化。所以在其中加上判断,pre是之前 cur是当前,然后根据数组嵌套找到当前值变化就返回true,就会走下面的代码
 2. Form.Item noStyle 是没有样式的,不需要添加{...field} 不是其中一项
 3. getFieldValue 获取当前的form值,根据值来展示

问题 在切换不展示时,之前填写的值不清空,所以重点来了
数组是引用类型
数组是引用类型
数组是引用类型

之前一直解决不了,还想用setFomValue来解决,根本不用,因为数组是引用类型,所以直接操作原来的数组值就可以

// An highlighted block
Object.assign(type[index],{tName:'',tShen:''})
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
React Antd Form是一个基于React框架的组件库,用于快速构建表单。在使用React Antd Form时,常常会遇到需要在表单中进行赋值的情况。 React Antd Form提供了多种赋值方式,下面分别介绍常用的两种方式: 1. setFieldsValue setFieldsValue方法用于直接设置表单数据。可以使用该方法将已有的数据赋值给表单中的相应字段。该方法接收一个对象作为参数,对象的属性名对应表单中的字段名,属性值对应表单中的数据。 使用示例: const data = { name: 'Jack', age: 28 }; form.setFieldsValue(data); 在上面的示例代码中,我们将一个包含name和age属性的对象data直接赋值给表单form。 2. initialValues initialValues属性用于在表单初始化时设置初始值。该属性接收一个对象作为参数,对象的属性名对应表单中的字段名,属性值对应表单中的数据。 如果需要动态地修改表单中的初始值,可以将initialValues属性作为Form组件的props传入,在表单初始化后再通过setFieldsValue方法进行修改。 使用示例: const data = { name: 'Jack', age: 28 }; <Form initialValues={data}> <Form.Item label="Name" name="name"><Input /></Form.Item> <Form.Item label="Age" name="age"><InputNumber /></Form.Item> </Form> 在上面的示例代码中,我们将包含name和age属性的对象data作为initialValues传入表单组件中。 总的来说,虽然React Antd Form提供了多种赋值方式,但常见的数据赋值需求基本可以通过使用setFieldsValue方法和initialValues属性来完成。用户可以根据实际需求选择合适的方式来进行赋值

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值