antd vue 动态添加表单项

antd vue 动态添加表单项

    • 业务背景
    • 实现思路(关键点)
    • 具体步骤

业务背景

要对form表单的某一项进行动态添加、删除反填操作,见图,要操作的项为BPID,其余项都是固定的。
antd vue 动态添加表单项_第1张图片

实现思路(关键点)

  1. 首先要对BPID的每一项进行注册,使用v-decorator/getFieldDecorator
  2. getFieldDecorator(id, options) 和 v-decorator="[id, options]" 参数,两个重要参数:
    2.1 options.preserve,表示:即便字段不再使用,也保留该字段的值
    2.2 required,是否必填

具体步骤

  1. html部分

     
          
               
                    
             
    	
    	
          
     	
    
    
  2. js 部分
    首先在data中定义 testArr: [’'wj0], //默认有一项

     add() {
         const item = this.testArr[this.testArr.length - 1]             //取数组的最后一项,默认是‘wj0’
         const maxNum = parseInt(item.replace('wj', '')) + 1     //去掉wj然后+1,这样保证新增的项始终不会和其他项重复,且有规律
         this.form.getFieldDecorator('wj' + maxNum, {
                    initialValue: '',
                    preserve: true                          //即便字段不再使用,也保留该字段的值,不设置这个属性,会导致删除错位的现象
          });
         this.testArr = this.testArr.concat('wj' + maxNum)		//将新增项拼接到数组中
     }
    
    remove(k) {
         const deleteObj = this.testArr.splice(k, 1);
         const deleteItem = deleteObj[0]
         this.form.setFieldsValue({                      //给删除的那一项赋值为空
             [deleteItem]: ''
         });
         this.form.getFieldDecorator([deleteItem],{     //给删除的那一项设置为不必填,否则保存的时候过不去
             required: false
         });
    },
    
    //保存
    handleSubmit() {
         this.form.validateFields((err, values) => {
               if (err) return
               this.confirmLoading = true;
               let str = '';
               if (this.testArr.length > 1) {
                     this.testArr.forEach((item, i) => {       //循环testArr,将里面的值字符串拼起来
                            if (i < this.testArr.length - 1) {
                                str = str + this.form.getFieldValue(item) + ','
                            } else {
                                str = str + this.form.getFieldValue(item)
                            }
                     })
               } else {
                   str = this.form.getFieldValue(this.testArr[0])
               }
                    let params = {}
                    for (let key in values) {
                        if (key.indexOf('wj') == -1) {
                            params[key] = values[key] //取其他项,如:name,source,desc
                        }
                    }
                    params.bpid = str
                    //处理完毕走接口
          })
    },
    
    //打开模态框,给BPID赋值部分
    //add时
    this.form.getFieldDecorator('wj0', {
                    initialValue: '',
                    preserve: true
     });
    //edit
     const bpidArr = data.bpid.split(','); //值;
     this.testArr = [];
     bpidArr.forEach((item, index) => {
           this.testArr.push('wj' + index)
           this.form.getFieldDecorator('wj' + index, {
                  initialValue: item,
                  preserve: true
           });
    	})
    
  3. css 部分看Ant Design of Vue form组建中的动态表单,我做了一点调整,这里就不贴出来了

你可能感兴趣的:(antd,vue)