Element-UI 实现动态增加多个输入框并校验

32 篇文章 6 订阅 ¥19.90 ¥99.00


前言

在做复杂的动态表单,实现业务动态变动,比如有一条需要动态添加的el-form-item中包含了多个输入框,并实现表单验证,但在element-ui组件库中给出的表单校验中没有这样的格式,想要实现这个功能就来跟我一起学习吧。


实现通过按钮动态增加表单并验证必填

先上实现效果图:

在这里插入图片描述

实现代码如下:

<el-form-item v-for="(item, index) in form.settings" :key="index" :label="'设置' + (index + 1)">
  <el-form-item label="名称" :prop="'settings.'+index+'.name'" :rules="[{ required: true, message: '必填项', trigger: 'change' }]" label-width="50px">
    <el-input v-model.trim="item.name" style="width: 100px" />
  </el-form-item>
  <el-form-item label="" :prop="'settings.'+index+'.val'" :rules="[{ required: true, message: '必填项', trigger: 'change' }]" label-width="50px">
    <el-input v-model.trim="item.val" style="width: 100px" />
  </el-form-item>
  <el-form-item label="key" :prop="'settings.'+index+'.key'" :rules="[{ required: true, message: '必填项', trigger: 'change' }]" label-width="50px">
    <el-input v-model.trim="item.key" style="width: 100px" />
  </el-form-item>
  <el-form-item>
    <el-button @click.prevent="removeSetting(item)">删除</el-button>
  </el-form-item>
</el-form-item>
<el-form-item label=" ">
  <el-button icon="el-icon-circle-plus-outline" @click="addSetting()">新增设置</el-button>
</el-form-item>

实现思路

el-form-item 中嵌套 el-form-item ,只需要拼接一下prop就可以直接使用校验:

  • :prop="'settings.'+index+'.name'"
    • settings 是for循环取值的数组
    • name 是输入框双向绑定的值
  • :rules="[{ required: true, message: '必填项', trigger: 'change' }]"
    • 校验规则中需要校验的数组

加入以下方法可动态增删表单:

removeSetting(item) {
  var index = this.form.settings.indexOf(item)
  if (index !== -1) {
    this.form.settings.splice(index, 1)
  }
},
addSetting() {
  this.form.settings.push({
    'name': '',
    'key': '',
    'val': ''
  })
},

实现动态多个输入框为行内模式,其它为行外模式

效果如图:

在这里插入图片描述

实现思路

el-form 定义 :inline="true" 实现行内模式,以便于动态增加的多个输入框在同一行显示;再通过 Layout 布局 将其它比较小的单个输入框控制在一个行内,通过 row 和 col 组件,并通过 col 组件的 span 属性我们就可以自由地组合布局。

实现代码如下:

<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="120px">
  <el-row>
    <el-col :span="24">
      <el-form-item label="test1" prop="teest1">
        <el-input v-model.trim="form.test1" style="width: 220px" />
      </el-form-item>
    </el-col>
    <el-col :span="24">
      <el-form-item label="test2" prop="test2">
        <el-input v-model.trim="form.test2" style="width: 220px" />
      </el-form-item>
    </el-col>
    <el-col :span="24">
      <el-form-item label="test3" prop="test3">
        <el-input v-model.trim="form.test3" style="width: 220px" />
      </el-form-item>
    </el-col>
    <el-col :span="24">
      <el-form-item v-for="(item, index) in form.settings" :key="index" :label="'设置' + (index + 1)">
        <el-form-item label="名称" :prop="'settings.'+index+'.name'" :rules="[{ required: true, message: '必填项', trigger: 'change' }]" label-width="50px">
          <el-input v-model.trim="item.name" style="width: 100px" />
        </el-form-item>
        <el-form-item label="" :prop="'settings.'+index+'.val'" :rules="[{ required: true, message: '必填项', trigger: 'change' }]" label-width="50px">
          <el-input v-model.trim="item.val" style="width: 100px" />
        </el-form-item>
        <el-form-item label="key" :prop="'settings.'+index+'.key'" :rules="[{ required: true, message: '必填项', trigger: 'change' }]" label-width="50px">
          <el-input v-model.trim="item.key" style="width: 100px" />
        </el-form-item>
        <el-form-item>
          <el-button @click.prevent="removeSetting(item)">删除</el-button>
        </el-form-item>
      </el-form-item>
    </el-col>
    <el-col :span="24">
      <el-form-item label=" ">
        <el-button icon="el-icon-circle-plus-outline" @click="addSetting()">新增设置</el-button>
      </el-form-item>
    </el-col>
  </el-row>
</el-form>

扩展

对于数组的下标,上述的prop拼接法如下:

:prop="'settings.'+index+'.name'"

可以修改成更为简洁的格式:

:prop="`settings[${index}].name`"

如下是一个下拉选项必填的示例:

<el-form ref="control" :inline="true" :model="control" size="small">
  <span v-for="(controlItem, controlIndex) in control.specialControl" :key="controlIndex">
    <el-col :span="24">
      <el-form-item label="" :prop="`specialControl[${controlIndex}].id`" :rules="[{ required: true, message: '必填项', trigger: 'change' }]">
        <el-select v-model="controlItem.id" style="width: 220px" size="small" placeholder="控制管理">
          <el-option v-for="(controlManageItem, controlManageIndex) in specialControlManage" :key="controlManageIndex" :label="controlManageItem.name" :value="controlManageItem.id" />
        </el-select>
      </el-form-item>
    </el-col>
  </span>
</el-form>

如果本文帮到了你,不妨点个赞吧~ ❤❤❤

进阶:Element-UI 实现动态增加多个不同类型的输入框并校验(双重v-for表单验证)

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一碗情深

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值