vue+element el-form中多重表单验证问题

3 篇文章 0 订阅
实现效果

1.根据项目需求 实现下面展示
在这里插入图片描述
2.由于存在表单校验且数据格式如下(根据项目需求改造数据结构)如下:

[{
   name: '张三',
   rules: {
     insuranceAmount: { type: 'string', required: true, message: '填写医疗', trigger: 'blur' },
     suggestedPremium: { type: 'string', required: true, message: '填写保费', trigger: 'blur' },
   },
   list: [{ insuranceType: '医疗', insuranceAmount: '', suggestedPremium: '', showFlag: false },
     { insuranceType: '重疾', insuranceAmount: '', suggestedPremium: '', showFlag: false }]
   },
   {
    name: '李四',
    rules: {
      insuranceAmount: { type: 'string', required: true, message: '填写医疗', trigger: 'blur' },
      suggestedPremium: { type: 'string', required: true, message: '填写保费', trigger: 'blur' },
    },
    list: [{ insuranceType: '医疗', insuranceAmount: '', suggestedPremium: '', showFlag: false },
      { insuranceType: '重疾', insuranceAmount: '', suggestedPremium: '', showFlag: false }]
 }]

3.每一列添加显示隐藏按钮-隐藏后当前行表单不做校验(类似以下图)
在这里插入图片描述
4.所以提交时对每个表单都要做校验(html部分)
在这里插入图片描述
5.js提交处理部分

 let newArr = []
 this.wrapList.forEach((ele, index) => {
    this.$refs['form'][index].validate((valid) => {
      if (valid) {
        newArr.push(true)
      } else {
        newArr.push(false)
      }
    })
  })
  let flag = newArr.every((val) => {
    return val == true
  })

  if (flag) {
    console.log('信息填写完整')
  } else {
    console.log('信息未填写完整')
  }

6.完整代码如下(只提供了一个简单demo供参考)

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>vue+element 表单验证-某些行不验证</title>
  <link rel="stylesheet" href="https://unpkg.com/element-ui@2.3.7/lib/theme-chalk/index.css">
</head>

<body>
  <div id="app">
    <div class="wrap">
      <div v-for="(item, index) in wrapList" :key="index">
        <el-form :rules="item.rules" :model="item" ref="form" v-cloak>
          <p>姓名: {{item.name}}</p>
          <el-table :data="item.list" style="width: 500px">
            <el-table-column prop="date" label="日期" width="180">
              <template slot-scope="scope">
                <div>
                  <el-form-item :prop="'list.' + scope.$index + '.insuranceAmount'" :rules="!scope.row.showFlag ? item.rules.insuranceAmount : {}">
                    <span>保额</span>
                    <el-input type="number" v-model="scope.row.insuranceAmount" :disabled="scope.row.showFlag" style="width:100px;"></el-input>
                    <span>万</span>
                  </el-form-item>
                </div>
              </template>
            </el-table-column>
            <el-table-column prop="name" label="姓名" width="180">
              <template slot-scope="scope">
                <div>
                  <el-form-item :prop="'list.' + scope.$index + '.suggestedPremium'" :rules="!scope.row.showFlag ? item.rules.suggestedPremium : {}"
                    :rules='item..suggestedPremium'>
                    保费
                    <el-input type="number" v-model="scope.row.suggestedPremium" :disabled="scope.row.showFlag" style="width:100px;">元/
                  </el-form-item>
                  </el-input>
                </div>
              </template>
            </el-table-column>
            <el-table-column prop="" width="100px">
              <template slot-scope="scope">
                <div>
                  <el-button @click="toggleStatus(scope.row)" type="info" :style="{'background-color': scope.row.showFlag ? '#FFAD41' : '#5C98FD','color': '#fff'}"
                    size="small">
                    {{scope.row.showFlag ? '显示': '隐藏'}}
                  </el-button>
                </div>
              </template>
            </el-table-column>
          </el-table>
        </el-form>
      </div>
      <el-button @click="submitAll">提交</el-button>
    </div>
  </div>
</body>

</html>
<script src="https://cdn.bootcss.com/vue/2.6.10/vue.min.js"></script>
<script src="https://unpkg.com/element-ui@2.3.7/lib/index.js"></script>
<script>

  new Vue({
    el: '#app',
    data: {
      wrapList: []
    },
    mounted() {
      this.setList()
    },
    methods: {
      // 定义一些表单数据
      setList() {
        this.wrapList = [
          {
            name: '张三',
            rules: {
              insuranceAmount: { type: 'string', required: true, message: '填写医疗', trigger: 'blur' },
              suggestedPremium: { type: 'string', required: true, message: '填写保费', trigger: 'blur' },
            },
            list: [{ insuranceType: '医疗', insuranceAmount: '', suggestedPremium: '', showFlag: false },
            { insuranceType: '重疾', insuranceAmount: '', suggestedPremium: '', showFlag: false }]
          },
          {
            name: '李四',
            rules: {
              insuranceAmount: { type: 'string', required: true, message: '填写医疗', trigger: 'blur' },
              suggestedPremium: { type: 'string', required: true, message: '填写保费', trigger: 'blur' },
            },
            list: [{ insuranceType: '医疗', insuranceAmount: '', suggestedPremium: '', showFlag: false },
            { insuranceType: '重疾', insuranceAmount: '', suggestedPremium: '', showFlag: false }]
          }
        ]
      },
      // 显示或者隐藏 禁用或者开启表单校验
      toggleStatus(row) {
        row.showFlag = !row.showFlag
        this.wrapList.forEach((item, index) => {
          this.$refs['form'][index].clearValidate()
        })
      },
      // 校验表单数据
      submitAll() {
        let newArr = []
        this.wrapList.forEach((ele, index) => {
          this.$refs['form'][index].validate((valid) => {
            if (valid) {
              newArr.push(true)
            } else {
              newArr.push(false)
            }
          })
        })

        let flag = newArr.every((val) => {
          return val == true
        })

        if (flag) {
          console.log('信息填写完整')
        } else {
          console.log('信息未填写完整')
        }
      }
    }
  })
</script>
有问题一起讨论
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值