antd pro form 数组套数组 form数组动态赋值 shouldUpdate 使用

antd form中数组套数组

form数组动态变化 动态赋值
在这里插入图片描述

需求如上,同时添加多个产品,同时每个产品可以增加多台设备,根据设备增加相应编号,所以存在数组套数组,根据数组值动态变化
使用的知识点

  1. form.list form中的数组展示
  2. shouldUpdate 根据form值来动态变化
  3. 数组是引用类型
// An highlighted block
<div >
            <Form
               form={form}
               name="basic"
               labelCol={{
                   flex: '90px',
                   }}
               initialValues={{
                   productList:[{
                       bianHao:'',
                       wuMiao:'',
                       number:1,
                       tType:'you',
                       files:{},
                       list:[{
                           sheBei:'',
                           guZi:'',
                           ziYou:'',
                       }],
                       }]
               }}
               labelWrap={true}
               labelAlign="left"
               onFinish={onFinish}
               onFinishFailed={onFinishFailed}
               autoComplete="off"
               >
               {/* <Card 
                   title="基本信息" 
                   bordered={false}>
                    <Row   gutter={16}>
                       <Col sm={24} md={12} lg={8} xxl={6}>
                           <Form.Item
                               label="最终用户"
                               name="username"
                               rules={[
                               {
                                   required: true,
                                   message: '请输入',
                               },]}
                           >
                               <Input />
                           </Form.Item>
                       </Col>
                       <Col sm={24} md={12} lg={8} xxl={6}>
                           <Form.Item
                               label="商务助理"
                               name="userLian"
                               rules={[
                               {
                                   required: true,
                                   message: '请输入',
                               },]}
                           >
                               <Input />
                           </Form.Item>
                       </Col>
                       <Col sm={24} md={12} lg={8} xxl={6}>
                           <Form.Item
                               label="测试用途"
                               name="userPhone"
                               rules={[
                               {
                                   required: true,
                                   message: '请输入',
                               },]}
                           >
                               <Input />
                           </Form.Item>
                       </Col>
                       <Col sm={24} md={12} lg={8} xxl={6}>
                           <Form.Item
                               label="项目预计招标/采购时间"
                               name="userShou"
                               rules={[
                               {
                                   required: true,
                                   message: '请输入',
                               },]}
                           >
                               <Input />
                           </Form.Item>
                       </Col>
                       <Col sm={24} >
                           <Form.Item
                               label="备注"
                               name="beiZhu"
                               rules={[{
                                   required: true,
                                   message: '请输入',
                               },]}
                           >
                               <TextArea  />
                           </Form.Item>
                       </Col>
                       <Col xl={24} sm={24}>
                           <Form.Item label='证明文件' >
                               <Upload {...fileProps}>
                                   <Button type="primary" icon={<UploadOutlined />}>点击上传</Button>
                               </Upload>
                           </Form.Item>
                       </Col>
                   </Row>   
               </Card> */}
              
               <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,"bianHao"]}
                                                           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,"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,"number"]}
                                                           rules={[{
                                                                   required: true,
                                                                   message: '请输入',
                                                               },]}
                                                               >
                                                           <InputNumber min={1} style={{width:'100%'}}/>
                                                           
                                                       </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>
                                               <Col sm={24}>
                                               <Form.Item noStyle  shouldUpdate={(pre,cur) => {
                                               //    如果删除一条信息,cur.productList[index]是空值,所以需要判断
                                                   if(cur.productList[index]&&pre.productList[index]){
                                                       return pre.productList[index].number !== cur.productList[index].number
                                                   }else{
                                                       return false
                                                   }
                                               }}>
                                                   {
                                                       ({getFieldsValue}) =>{
                                                           {/* 繁琐的计算:1.输入的数值比原来的数值大,计算差值,给原数组循环push
                                                                      2.手动在删除,输入框为空的时候,根据splice置空 (因为是空,所以计算出0)
                                                                      3.输入的数值比之前小,优先从后面删除,防止前面输入的被删除掉,依旧是操作原数组 splice  */}
                                                           let number = getFieldsValue().productList[index].number;
                                                           let list = getFieldsValue().productList[index].list;
                                                           if(number>list.length){
                                                               let cha = number - list.length;
                                                               for(let i=0; i<cha ; i++){
                                                                   list.push({ sheBei:'',
                                                                               guZi:'',
                                                                               ziYou:'',})
                                                               }
                                                              
                                                           }else if(number===''){
                                                               list.splice(0,list.length)
                                                           }else if(number<list.length){
                                                               let cha = list.length - number;
                                                               list.splice(number,cha)
                                                           } 
                                                           return <Form.List name={[field.name,"list"]} >
                                                                       {(tLists) => (
                                                                           <>
                                                                               {tLists.map(tlist=>(
                                                                                   <Row  gutter={16}>
                                                                                       <Col sm={24} md={12} lg={8} xxl={6}>
                                                                                               <Form.Item 
                                                                                                   {...tlist}
                                                                                                   label="设备序列号"
                                                                                                   name={[tlist.name,"sheBei"]}
                                                                                                   rules={[{
                                                                                                           required: true,
                                                                                                           message: '请选择',
                                                                                                       },]}
                                                                                                       >
                                                                                                   <Input/>
                                                                                               </Form.Item>
                                                                                       </Col>
                                                                                       <Col sm={24} md={12} lg={8} xxl={6}>
                                                                                               <Form.Item 
                                                                                                   {...tlist}
                                                                                                   label="固资编码"
                                                                                                   name={[tlist.name,"guZi"]}
                                                                                                   rules={[{
                                                                                                           required: true,
                                                                                                           message: '请选择',
                                                                                                       },]}
                                                                                                       >
                                                                                                   <Input/>
                                                                                               </Form.Item>
                                                                                       </Col>
                                                                                       <Col sm={24} md={12} lg={8} xxl={6}>
                                                                                               <Form.Item 
                                                                                                   {...tlist}
                                                                                                   label="自有编码"
                                                                                                   name={[tlist.name,"ziYou"]}
                                                                                                   rules={[{
                                                                                                           required: true,
                                                                                                           message: '请选择',
                                                                                                       },]}
                                                                                                       >
                                                                                                    <Input/>

                                                                                               </Form.Item>
                                                                                       </Col>
                                                                                   </Row>
                                                                               ))}
                                                                           </>
                                                                       )}

                                                                   </Form.List>
                                                       }
                                                   }

                                               </Form.Item>
                                               </Col>
                                               <Col sm={24} >
                                                   <Form.Item
                                                       label="备注"
                                                       {...field}
                                                       name={[field.name,"beiZhu"]}
                                                       rules={[{
                                                           required: true,
                                                           message: '请输入',
                                                       },]}
                                                   >
                                                       <TextArea  />
                                                   </Form.Item>
                                               </Col>
                                               <Col xl={24} sm={24}>
                                                   <Form.Item 
                                                       label='证明文件' 
                                                       {...field}
                                                       name={[field.name,"files"]} 
                                                       >
                                                       <Upload 
                                                           customRequest={(option=> option.onSuccess())}
                                                           beforeUpload={(file, fileList)=> fileVerification(file, fileList)}>
                                                           <Button type="primary" icon={<UploadOutlined />}>点击上传</Button>
                                                       </Upload>
                                                   </Form.Item>
                                               </Col>
                                               { /* 用得时候只需要修改下面,将需要重复展示的部分替换下面部分即可 -----end*/ }
                                                       
                                               <div styleName="item_btn_wrap">
                                                   <PlusCircleFilled styleName="add_item_btn" onClick={() => add({
                                                                                                                   bianHao:'',
                                                                                                                   wuMiao:'',
                                                                                                                   number:1,
                                                                                                                   tType:'you',
                                                                                                                   beiZhu:'',
                                                                                                                   files:{},
                                                                                                                   list:[{
                                                                                                                       sheBei:'',
                                                                                                                       guZi:'',
                                                                                                                       ziYou:'',
                                                                                                                   }],
                                                                                                                   })} />
                                                   {fields.length>1&&<CloseCircleFilled  styleName="remove_item_btn" onClick={() => remove(field.name)} />}
                                               </div>
                                   </Row>
                               ))}
                               </>

                           )}

                   </Form.List>
               </Card>
               
               
               <Card>
                   {/* <Row  gutter={16}>
                       <Col> */}
                           {/* <Form.Item wrapperCol={{ offset: 8, span: 16 }}> */}
                           <Form.Item styleName="right_layout">
                               <Link to="/HW/HwBorrowList">
                                   <Button type="dashed">取消</Button>
                               </Link>
                               <Button style={{marginLeft:'20px'}} loading={saving} onClick={()=>onFinish('stage')}>暂存</Button>
                               <Button type="primary" style={{marginLeft:'20px'}} onClick={()=>onFinish('submit')}>提交</Button>
                               {/* <Button type="primary" htmlType="submit">确认</Button> */}
                           </Form.Item>
                       {/* </Col>
                   </Row> */}
               </Card>
              
           </Form>
           
       </div>

使用注意

  1. Form.List 使用 {…field}或者{…tlist} 需要在name的前面,否则出错
  2. 中间有关于业务的逻辑,输入数量的计算
  3. shouldUpdate 方法使用,表单中值变化,可以根据index来获取是第几个,进而判断
  4. form数组的嵌套 运用两个form.list 嵌套,重点关注内层的 name 怎么写,进而进行内部的循环
  5. 在对form 的数组进行赋值的操作时 紧记 数组是引用类型 ,用getFieldsValue 来获取需要操作的数组,运用数组中的修改原数组的方法来操作,即可及时修改form值
    数组是引用类型
    数组是引用类型
    数组是引用类型

以上为代码和理解,欢迎指正

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
antd是一个非常流行的React组件库,其中包含了丰富的UI组件和工具。它提供了一个Table组件用于快速创建数据表格,也提供了Form组件用于创建表单。 在实际应用中,我们通常需要将表格与表单结合使用。一种常见的场景是,当用户点击表格中的一行数据时,需要将该数据的详细信息展示在表单中,以便用户进行编辑或其他操作。 使用antd的Table组件和Form组件结合时,我们可以根据需求进行如下操作: 1. 设置表格的选择功能:antd的Table组件支持设置行级的选择功能,可以通过设置rowSelection属性来实现,该属性可以指定选择操作的配置项,比如选择模式、默认选中的行、选择时触发的回调函数等。 2. 设置表格的行点击事件:我们可以通过设置Table组件的onRow属性来指定行点击时触发的回调函数,该函数可以接收点击的行索引作为参数,我们可以在回调函数中将该索引赋值给一个状态变量,然后在表单中根据这个状态变量获取点击行的具体数据。 3. 在表单中展示点击行的数据:使用Form组件创建表单时,可以使用getFieldDecorator方法来绑定表单项与数据源,从而实现数据的双向绑定。我们可以通过在表单项的初始值中设置获取点击行数据的方式,从而在表单中展示对应数据。 4. 表单的提交与重置:在表单中编辑完数据后,我们可以通过antdForm组件提供的handleSubmit和handleReset方法来分别处理表单的提交和重置操作。handleSubmit方法会在表单校验通过后触发一个回调函数,我们可以在该回调函数中进行数据的提交操作。handleReset方法会重置表单的所有字段和初始值。 综上所述,antd的Table组件和Form组件可以很方便地结合使用,通过设置选择功能、行点击事件以及使用数据绑定和提交重置方法,可以实现自定义的表格与表单交互功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值