• ElmentUI表单校验自定义——动态添加和删除


    需求:

    1.表单列表:点击按钮增加一行、删除、校验输入;

    2.表格列表:点击按钮增加一行、删除、输入校验。

    <template>
      <el-form :model="form" ref="ruleForm" label-width="100px">
        <el-form-item label="负责人" prop="principal" :rules="rules.principal">
          <el-input v-model="form.principal"></el-input>
        </el-form-item>
        <el-form-item label="活动列表">
          <el-row v-for="(item, index) in form.activities" :key="index" style="margin-bottom: 20px;">
            <el-col :span="11">
              <el-form-item :label="`名称${index + 1}`" :prop="`activities.${index}.name`" :rules="rules.name">
                <el-input v-model="item.name" placeholder="请输入活动名称"></el-input>
              </el-form-item>
            </el-col>
            <el-col :span="11">
              <el-form-item :label="`主题${index + 1}`" :prop="`activities.${index}.content`" :rules="rules.content">
                <el-input v-model="item.content" placeholder="请输入活动主题"></el-input>
              </el-form-item>
            </el-col>
            <el-col :span="2" style="text-align:center; font-size: 16px" >
              <i class="el-icon-circle-plus-outline" @click="addItem" v-if="index === 0"></i>
              <i class="el-icon-remove-outline" @click="removeItem(index)" v-else></i>
            </el-col>
          </el-row>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="submitForm('ruleForm')">立即创建</el-button>
          <el-button @click="resetForm('ruleForm')">重置</el-button>
        </el-form-item>
      </el-form>
    </template>
    
    <script>
    export default {
      data () {
        return {
          form: {
            principal: '',
            activities: [{
              name: '',
              content: ''
            }]
          },
          rules: {
            principal: [{ required: true, message: '请输入负责人', trigger: 'blur' }],
            name: [
              { required: true, message: '请输入活动名称', trigger: 'blur' }
            ],
            content: [
              { required: true, message: '请输入活动主题', trigger: 'blur' }
            ]
          }
        }
      },
      methods: {
        submitForm (formName) {
          this.$refs[formName].validate((valid) => {
            if (!valid) return console.log('未通过校验')
          })
        },
        addItem () {
          this.form.activities.push({
            name: '',
            content: ''
          })
        },
        removeItem (index) {
          this.form.activities.splice(index, 1)
        },
        resetForm (formName) {
          this.$refs[formName].resetFields()
        }
      }
    }
    </script>
    <template>
      <el-form :model="form" ref="ruleForm" label-width="0px" style="margin: 20px;">
        <el-form-item>
          <el-button type="primary" @click="addItem('ruleForm')">新增一行</el-button>
          <el-button type="primary" @click="saveItem('ruleForm')" :disabled="!isAdd">保存</el-button>
          <el-button type="primary" @click="resetForm('ruleForm')" :disabled="!isAdd">重置</el-button>
        </el-form-item>
        <el-form-item>
          <el-table border :data="form.tableData">
            <el-table-column
              v-for="(item, index) in form.tableColumn"
              :key="index"
              :prop="item.prop"
              :label="item.label"
              align="center"
            >
              <template slot-scope="scope">
                <el-form-item :prop="`tableData.${scope.$index}.${item.prop}`" :rules="rules[item.prop]" v-if="isSave">
                  <el-input v-model="scope.row[item.prop]" :placeholder="`请输入${item.label}`"></el-input>
                </el-form-item>
                <span v-else>{{scope.row[item.prop]}}</span>
              </template>
            </el-table-column>
            <el-table-column width="80" align="center" label="操作" v-if="isSave">
              <template slot-scope="scope">
                <el-button round plain type="danger" @click="removeItem(scope)">删除</el-button>
              </template>
            </el-table-column>
          </el-table>
        </el-form-item>
      </el-form>
    </template>
    
    <script>
    export default {
      data() {
        return {
          isAdd:false,
          isSave:false,
          form: {
            tableColumn: [
            {
              default: "",
              label: "输出",
              prop: "output"
            },
            {
              default: "",
              label: "比例",
              prop: "proportion"
            }],
            tableData: []
          },
        }
      },
      computed: {
        proportionSum(){
          let res = this.form.tableData.reduce((acc,cur) => {// 上次累计值+正在处理取值+索引+源数组
              return acc+Number(cur.proportion)
          },0)
          return res
        },
        rules() {
          const rules = {};
          this.form.tableColumn.forEach((item) => {
            rules[item.prop] = [{ required: true, message: item.label+"不可为空", trigger: "blur" }]
            if(item.prop==='proportion'){
              const validatorP = (rule, value, callback) => {
                if (value) {
                  const rtx = /^-?(0.d*[1-9]+d*)|1/
                  if (!value.match(rtx)) {
                    callback(new Error('须是大于0,小于或等于1的数字'))
                  } else {
                    callback()
                  }
                } else {
                  callback(new Error('比例不可为空'))
                }
              }
              rules[item.prop].push(            
              {
                // pattern: /^-?(0.d*[1-9]+d*)|1/,
                // message: "须是大于0,小于或等于1的数字",
                validator: validatorP, 
                trigger: "blur"
              })
            }
          });
          return rules;
        }
      },
      methods: {
        saveItem(formName){
          this.$refs[formName].validate((valid) => {
            if (!valid) {
              return
            } else {
              let res = this.form.tableData.reduce((acc,cur,index,arr) => {// 上次累计值+正在处理取值+索引+源数组
                  return acc+Number(cur.proportion)
              },0)
              if(res!==1){
                this.$message.error('所有列表比例之和必须等于1')
                this.isSave = true
                this.isAdd = true
              }else{
                this.isSave = false
                this.isAdd = false
              }
            }
          })
        },
        addItem(formName) {
          this.$refs[formName].validate((valid) => {
            if (!valid) {
              return
            } else {
              this.form.tableData.push({
                output: '',
                proportion: ''
              })
              this.isSave = true
              this.isAdd = true
            }
          })
        },
        removeItem(scope) {
          this.form.tableData.splice(scope.$index, 1);
        },
        resetForm(formName) {
          this.$refs[formName].resetFields()
          this.form.tableData = []
          this.isSave = false
          this.isAdd = false
        }
      }
    }
    </script>

    -end-

  • 相关阅读:
    点语法
    第一个OC的类
    gitlab教程
    php接收post的json数组
    phpstorm10.0.2三月22号补丁原来的网址被封了
    冰点下载器在转换pdf的时候出现停止工作
    乱码问题
    有用的网址(php)
    ubuntu16.04安装mysql5.6
    MapUtils常用方法
  • 原文地址:https://www.cnblogs.com/wheatCatcher/p/13706016.html
Copyright © 2020-2023  润新知