ElementUI动态循环表单

公司有这样一个需求,需要对用户表字段进行动态扩展,我的做法是新建了一张扩展字段表,一张扩展字段值表,现在需要将扩展字段表中新增的字段循环放入用户添加的form表单中,并需要控制动态表单的必填项,以下是过程复盘:

为了方便,此处未实现扩展字段相关代码,前端获取的数据直接在后端初始化

环境

jdk:jdk1.8.0_51

框架:若依分离版(RuoYi-Vue_v3.8.3)

框架地址:https://gitee.com/y_project/RuoYi-Vue.git

复盘主要代码:https://gitee.com/lmr-replay/replay-elementUIdtxhbd.git

实现过程

1. 获取列表

在data()中添加字段列表属性:

fileds: []

在用户新增按钮的方法handleAdd()中添加获取扩展字段的方法

/** 新增按钮操作 */
handleAdd() {
  this.reset();
  getUser().then(response => {
    this.postOptions = response.posts;
    this.roleOptions = response.roles;
    this.open = true;
    this.title = "添加用户";
    this.form.password = this.initPassword;
    getFileds().then(res => {
      this.fileds = res.data
    });
  });
},

获取到所有扩展字段的列表

{
“msg”: “操作成功”,
“code”: 200,
“data”: [
{“filedId”: 0,“filedLabel”: “家庭住址”,“filedName”: “address”,“filedType”: “text”,“doubleLayout”:“N”,“requiredFiled”: “Y”,“filedValue”: null},
{“filedId”: 1,“filedLabel”: “出生年月”,“filedName”: “birth”,“filedType”: “date”,“doubleLayout”:“Y”,“requiredFiled”: “Y”,“filedValue”: null},
{“filedId”: 2,“filedLabel”: “学历”,“filedName”: “record”,“filedType”: “select”,“doubleLayout”:“Y”,“requiredFiled”: “N”,“filedValue”: null}
]
}

2. 循环生成表单

在用户新增弹出框的备注字段下方,加入扩展字段表单

<el-divider content-position="center">扩展属性</el-divider>
<el-row>
  <el-col :span="24" v-for="(filed, index) in fileds" :key="filed.filedId">
    <el-form-item :label="filed.filedLabel" :rules="filed.requiredFiled==='Y'?[{required: true, message: '域名不能为空', trigger: 'blur'}]:[]">
      <el-input v-if="filed.filedType==='text'" v-model="filed.value" type="text" placeholder="请输入"></el-input>
      <el-date-picker v-else-if="filed.filedType=='date'" v-model="filed.value" type="date" placeholder="请选择"></el-date-picker>
      <el-select v-else-if="filed.filedType==='select'" v-model="filed.value" placeholder="请选择">
        <el-option v-for="item in roleOptions" :key="item.roleId" :label="item.roleName" :value="item.roleId" :disabled="item.status == 1"></el-option>
      </el-select>
    </el-form-item>
  </el-col>
</el-row>

image-20220828162006-6d2577i.png

  • 此时发现一个问题,虽然出现了必填字段的*标识,但是无法控制其必填
3. 解决必填项控制失败问题

从网上找了一下相关只是,发现需要添加prop(形式为:‘fileds.’+index+‘.value’),于是修改如下:

<el-divider content-position="center">扩展属性</el-divider>
<el-row>
  <el-col v-for="(filed, index) in fileds" :key="filed.filedId" :span="filed.doubleLayout==='Y'?12:24">
    <el-form-item :label="filed.filedLabel"
                  :prop="'fileds.'+index+'.value'"
                  :rules="filed.requiredFiled==='Y'?[{required: true, message: '域名不能为空', trigger: 'blur'}]:[]"
    >
      <el-input v-if="filed.filedType==='text'" v-model="filed.value" type="text" placeholder="请输入"></el-input>
      <el-date-picker v-else-if="filed.filedType=='date'" v-model="filed.value" type="date" placeholder="请选择"></el-date-picker>
      <el-select v-else-if="filed.filedType==='select'" v-model="filed.value" placeholder="请选择">
        <el-option v-for="item in roleOptions" :key="item.roleId" :label="item.roleName" :value="item.roleId" :disabled="item.status == 1"></el-option>
      </el-select>
    </el-form-item>
  </el-col>
</el-row>
  • 此时打开添加弹框,会出现异常:Error: please transfer a valid prop path to form item!
4. 解决异常:Error: please transfer a valid prop path to form item!

从网上找了一下相关异常信息,发现是prop绑定值有问题,fileds需要是form中的一个属性,于是修改代码,将获取到的字段列表放入form中:

getFileds().then(res => {
  this.form.fileds = res.data
});

并修改页面代码,循环form.fileds

<el-divider content-position="center">扩展属性</el-divider>
<el-row>
  <el-col v-for="(filed, index) in form.fileds" :key="filed.filedId" :span="filed.doubleLayout==='Y'?12:24">
    <el-form-item :label="filed.filedLabel"
                  :prop="'fileds.'+index+'.value'"
                  :rules="filed.requiredFiled==='Y'?[{required: true, message: '域名不能为空', trigger: 'blur'}]:[]"
    >
      <el-input v-if="filed.filedType==='text'" v-model="filed.value" type="text" placeholder="请输入"></el-input>
      <el-date-picker v-else-if="filed.filedType=='date'" v-model="filed.value" type="date" placeholder="请选择"></el-date-picker>
      <el-select v-else-if="filed.filedType==='select'" v-model="filed.value" placeholder="请选择">
        <el-option v-for="item in roleOptions" :key="item.roleId" :label="item.roleName" :value="item.roleId" :disabled="item.status == 1"></el-option>
      </el-select>
    </el-form-item>
  </el-col>
</el-row>

很好,异常消失了,并且状态判断也没有问题:

image-20220828164031-nbdumio.png

  • 但是又发现了新的问题:表单无法输入
5. 解决动态表单无法输入问题

通过百度发现这个问题是因为我们获取到的字段列表是直接赋值给form的,但是在form初始化的时候并未在form中定义fileds变量,只需要在初始化form时定义fileds变量即可

修改reset()方法,在form中定义fileds变量

// 表单重置
reset() {
  this.form = {
    userId: undefined,
    deptId: undefined,
    userName: undefined,
    nickName: undefined,
    password: undefined,
    phonenumber: undefined,
    email: undefined,
    sex: undefined,
    status: "0",
    remark: undefined,
    postIds: [],
    roleIds: [],
    fileds: [] // 此处非常关键
  };
  this.resetForm("form");
},

至此,动态表单就可以进行必填控制并可以输入值了,复盘到此结束!

联系方式

作者:永夜

邮箱:Evernight@aliyun.com

以上内容有不正确的地方烦请指正!🙏🙏🙏

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于elementui自定义循环表单验证,您可以参考以下步骤: 1. 在需要验证的表单项中设置ref属性,例如: ``` <el-form ref="myForm"> <el-form-item v-for="(item,index) in formList" :key="index" :label="item.label"> <el-input v-model="item.value" /> </el-form-item> </el-form> ``` 2. 在需要添加验证规则的组件中设置prop属性,例如: ``` <el-form-item v-for="(item,index) in formList" :key="index" :label="item.label"> <el-input v-model="item.value" :placeholder="item.placeholder" :prop="'formList.'+index+'.value'" /> </el-form-item> ``` 其中prop的值被设置成"formList.index.value",这样可以对对应的表单项进行验证。 3. 在data中定义表单数据和验证规则,例如: ``` data() { return { formList: [ { label: '姓名', value: '', placeholder: '请输入姓名' }, { label: '年龄', value: '', placeholder: '请输入年龄' }, { label: '邮箱', value: '', placeholder: '请输入邮箱' } ], rules: { 'formList.0.value': [ { required: true, message: '请输入姓名', trigger: 'blur' } ], 'formList.1.value': [ { required: true, message: '请输入年龄', trigger: 'blur' }, { type: 'number', message: '年龄必须是数字值', trigger: 'blur' } ], 'formList.2.value': [ { required: true, message: '请输入邮箱', trigger: 'blur' }, { type: 'email', message: '邮箱格式不正确', trigger: ['blur', 'change'] } ] } } } ``` 在上述代码中,rules中定义了每个表单项对应的验证规则,并通过prop指定了对应的表单值。 4. 在提交表单时触发验证,例如: ``` submitForm() { this.$refs['myForm'].validate(valid => { if (valid) { // 表单验证通过 console.log('表单验证通过!'); } else { // 表单验证失败 console.log('表单验证失败!'); return false; } }); } ``` 在submitForm函数中,通过this.$refs['myForm'].validate()方法触发表单验证,将验证结果返回给回调函数valid。如果valid为true,则表单验证通过,否则表单验证失败。 以上就是elementui自定义循环表单验证的基本流程,您可以根据需求进行调整和优化。希望对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值