element el-form-item循环创建验证和自定义规则验证

项目需求

 实现效果

写一个一个简单dome

<template>
    <div class="body">

      <el-form ref="approvalDataResults" :model="approvalDataResults" label-width="150px" class="demo-ruleForm">
  
        <div v-for="(item, index) in approvalDataResults.PenaltyItemComponentData" :key="index">
          <el-divider>Component-{{ index + 1 }}</el-divider>
  
          <el-form-item label="选择器" :rules="rules.educationPenaltyItemId"
                        :prop="'PenaltyItemComponentData.' + index + '.educationPenaltyItemId'">
            <el-cascader
  
                v-model="item.educationPenaltyItemId"
                :options="options"
                :props="{ expandTrigger: 'hover' }"
                @change="selectChange(index)"
            ></el-cascader>
          </el-form-item>
  
          <el-form-item label="分值处理"
                        v-if="approvalDataResults.PenaltyItemComponentData[index].radio_show"
                        :rules="rules.radio_level" :prop="'PenaltyItemComponentData.' + index + '.radio_level'"
  
          >
            <el-radio-group v-model="item.radio_level" @change="radioChange(index)">
              <el-radio :label="item.radio_options[0].value">{{ item.radio_options[0].text }}</el-radio>
              <el-radio :label="item.radio_options[1].value">{{ item.radio_options[1].text }}</el-radio>
              <el-radio :label="item.radio_options[2].value">{{ item.radio_options[2].text }}</el-radio>
            </el-radio-group>
          </el-form-item>
  
          <el-form-item label="分数"
                        :rules="rules.cost_value" :prop="'PenaltyItemComponentData.' + index + '.cost_value'"
                        v-if="approvalDataResults.PenaltyItemComponentData[index].cost_show"
  
          >
            <el-input-number
  
                v-model="item.cost_value"
               ></el-input-number>
          </el-form-item>
  
        </div>
  
      </el-form>
      <el-button type="primary" @click="add">添加组件</el-button>
      <el-button type="primary" @click="remove">移除组件</el-button>
      <el-button type="warning" @click="submit">表单验证</el-button>
    </div>
  </template>
  
  <script>
  
  
  export default {
    data() {
  
      return {
  
  
        approvalDataResults: {
          PenaltyItemComponentData: []
        },
        options: [{
          value: 'zhinan',
          label: '指南',
          children: [{
            value: 'shejiyuanze',
            label: '设计原则',
            children: [{
              value: 'yizhi',
              label: '一致'
            }, {
              value: 'fankui',
              label: '反馈'
            }]
          }, {
            value: 'daohang',
            label: '导航',
            children: [{
              value: 'cexiangdaohang',
              label: '侧向导航'
            }, {
              value: 'dingbudaohang',
              label: '顶部导航'
            }]
          }]
        }, {
          value: 'zujian',
          label: '组件',
          children: [ {
            value: 'data',
            label: 'Data',
            children: [{
              value: 'pagination',
              label: 'Pagination 分页'
            }, {
              value: 'badge',
              label: 'Badge 标记'
            }]
          }, {
            value: 'notice',
            label: 'Notice',
            children: [ {
              value: 'message-box',
              label: 'MessageBox 弹框'
            }, {
              value: 'notification',
              label: 'Notification 通知'
            }]
          }, {
            value: 'others',
            label: 'Others',
            children: [{
              value: 'card',
              label: 'Card 卡片'
            }, {
              value: 'carousel',
              label: 'Carousel 走马灯'
            }, {
              value: 'collapse',
              label: 'Collapse 折叠面板'
            }]
          }]
        }],
        rules: {
          educationPenaltyItemId: [{required: true, message: '请选择选择器', trigger: 'change'}],
          radio_level: [
            {
              required: true, message: '请选择选择器', trigger: 'change'
            }
          ],
          cost_value: [
            {required: true, type: 'number', message: '请输入正确数据', trigger: 'blur'},
            {validator: this.validateCostValue, trigger: 'change'}
          ]
        }
      };
    }
    ,
    methods: {
      submit() {
        //测试代码验证
        var contest=true
        this.$refs['approvalDataResults'].validate(valid => {
          if (valid) {
            //通过
        
          } else {
            //不通过
       
            return false;
  
          }
        });
      },
        //自定义验证规则
      validateCostValue(rule, value, callback) {
        console.log(rule,"SDERER");
        //分割字符串
        let numberContent = this.extractNumber(rule.field);
        //获取一个对象
        let numberArrayObject = this.approvalDataResults.PenaltyItemComponentData[numberContent]
        console.log(numberArrayObject,"numberArrayObject")
        //选中的值
        let select;
        //需要现在三个值
        let radioOptions = numberArrayObject.radio_options;
        //输入框的值
        let flag;
        //单选框数据集合
        let numberArray = [];
        for (let a = 0; a < radioOptions.length; a++) {
          //获取值
          if (radioOptions[a].isSelect) {
            select = radioOptions[a].value
          }
          if (radioOptions[a].value == select) {
            flag = a;
          }
          numberArray.push(radioOptions[a].value)
        }
        //输入框数字
        let figure = value;
        if (figure > select) {
          callback(new Error('分数不能大于' + select));
        }
        if (flag == 0) {
          if (figure <= 0) {
            console.log("就来了")
            callback(new Error('分数不能大于0'));
          }
          else {
            callback();
          }
        }
        if (flag == 1) {
          if (figure < numberArray[flag - 1]) {
            callback(new Error('分数不能小于' + numberArray[flag - 1]));
          }
          else {
            callback();
          }
        }
        if (flag == 2) {
          if (figure < numberArray[flag - 1]) {
            callback(new Error('分数不能小于' + numberArray[flag - 1]));
          }
          else {
            callback();
          }
        }
  
  
      },
      //添加组件
      add() {
        var com_data = {
          educationPenaltyItemId: '',
          radio_options: [{
            text: '',
            value: '',
            isSelect: false,
  
          }, {
            text: '',
            value: '',
            isSelect: false
          }, {
            text: '',
            value: '',
            isSelect: false
          }],
          radio_level: null,
          radio_show: false,
          cost_value: 0,
          cost_show: false,
          cost_disabled: true
        }
        var a = this.RandomNumBoth(10, 20);
        var b = this.RandomNumBoth(a, a + 20);
        var c = this.RandomNumBoth(b, b + 20);
        com_data.radio_options[0].text = a
        com_data.radio_options[0].value = a
        com_data.radio_options[1].text = b
        com_data.radio_options[1].value = b
        com_data.radio_options[2].text = c
        com_data.radio_options[2].value = c
        this.approvalDataResults.PenaltyItemComponentData.push(com_data)
      },
      //删除组件
      remove() {
        if (this.approvalDataResults.PenaltyItemComponentData.length > 1) {
          var index = this.approvalDataResults.PenaltyItemComponentData.length
          this.approvalDataResults.PenaltyItemComponentData.splice(index - 1, 1)
        }
      },
      RandomNumBoth(Min, Max) {
        var Range = Max - Min;
        var Rand = Math.random();
        var num = Min + Math.round(Rand * Range); //四舍五入
        return num;
      },
      selectChange(index) {
        this.approvalDataResults.PenaltyItemComponentData[index].radio_show = true
      },
      radioChange(index) {
        this.approvalDataResults.PenaltyItemComponentData[index].cost_show = true
        var picd = this.approvalDataResults.PenaltyItemComponentData[index]
        picd.radio_options[0].isSelect = false
        picd.radio_options[1].isSelect = false
        picd.radio_options[2].isSelect = false
        console.log(picd)
        if (picd.radio_level == picd.radio_options[0].value) {
          picd.cost_value = picd.radio_level
          picd.radio_options[0].isSelect = true
  
        }
        if (picd.radio_level == picd.radio_options[1].value) {
          picd.cost_value = picd.radio_level
          picd.radio_options[1].isSelect = true
        }
        if (picd.radio_level == picd.radio_options[2].value) {
          picd.cost_value = picd.radio_level
          picd.radio_options[2].isSelect = true
        }
  
      },
      //分割字符串
      extractNumber(str) {
        // 使用正则表达式匹配数字部分
        let number = str.match(/\d+/);
        // 如果找到数字部分则返回,否则返回空字符串
        return number ? number[0] : '';
      },
    },
    mounted() {
      this.add()
    }
  
  
  }
  </script>
  <style>
  .body{
    width: 400px;
  }
  
  </style>

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用 Element UI 组件库来创建精美的登录界面。通过组合使用 `el-form`、`el-form-item` 和 `el-input` 组件,可以轻松地构建一个具有表单验证和美观样式的登录界面。 首先,你需要在你的项目中引入 Element UI 组件库。可以通过 CDN 的方式引入,也可以通过 npm 安装并导入组件。 下面是一个示例代码,演示如何使用这些组件创建一个简单的登录界面: ```html <template> <el-form ref="loginForm" :model="loginData" :rules="loginRules" label-width="80px"> <el-form-item label="用户名" prop="username"> <el-input v-model="loginData.username"></el-input> </el-form-item> <el-form-item label="密码" prop="password"> <el-input type="password" v-model="loginData.password"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="login">登录</el-button> <el-button @click="resetForm">重置</el-button> </el-form-item> </el-form> </template> <script> export default { data() { return { loginData: { username: '', password: '' }, loginRules: { username: [ { required: true, message: '请输入用户名', trigger: 'blur' } ], password: [ { required: true, message: '请输入密码', trigger: 'blur' } ] } }; }, methods: { login() { // 处理登录逻辑 // ... }, resetForm() { this.$refs.loginForm.resetFields(); } } }; </script> ``` 在上面的示例代码中,`el-form` 组件包裹了登录表单,并通过 `ref` 属性绑定了一个名为 "loginForm" 的引用。`el-form-item` 是每个表单项的容器,其中 `label` 属性用于显示表单项的标签,`prop` 属性用于进行表单验证。 `el-input` 组件用于获取用户输入的用户名和密码。通过 `v-model` 指令将输入框的值绑定到 `loginData` 对象的属性上。 `loginRules` 对象定义了表单的验证规则,以确保用户输入的有效性。 登录按钮和重置按钮使用 `el-button` 组件创建,并绑定了相应的点击事件。 通过这样的组合使用,你可以创建一个具有表单验证和美观样式的登录界面。可以根据自己的需求进行进一步的样式定制和功能扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值