elementui el-form 动态表单角色验证

摆地摊
• 阅读 636
根据系统选角色 => 给选中重复角色id的选项,添加验证错误提示。

一、效果图

elementui el-form 动态表单角色验证

三、上代码

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <!-- 引入样式 -->
  <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
  <style type="text/css">
    .el-form {
      width: 500px;
      margin: 20px auto 0;
    }
    .wrap {
      display: flex;
    }
    .wrap .el-form-item{
      margin-right: 8px;
    }
  </style>
</head>

<body>
  <div id="app">
    <el-form :model="roleForm" ref="roleForm">
      <el-alert
        title="根据系统选角色 => 给选中重复角色id的选项,添加验证错误提示。"
        type="error"
        :closable="false">
      </el-alert>
      <br>
      <div class="wrap" v-for="(item, index) in roleForm.list" :key="index">
        <el-form-item :prop="'list.' + index + '.sysNo'" :rules="{
            required: true, message: '系统不能为空!', trigger: 'change'
          }">
          <el-select v-model="item.sysNo" placeholder="请选择系统" @change="(val)=> toChange(val, item)">
            <el-option v-for="dict in item.system" :key="dict.sysNo" :label="dict.sysName" :value="dict.sysNo">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item :prop="'list.' + index + '.roleId'" :rules="{
              trigger: ['change', 'blur'],
              validator: validateKey
          }">
          <el-select v-model="item.roleId" placeholder="请选择角色" @change="roleChange(index)">
            <el-option v-for="dict in item.roles" :key="dict.roleId" :label="dict.roleName" :value="dict.roleId"
              :disabled="dict.disabled">
            </el-option>
          </el-select>
        </el-form-item>
        <div>
          <el-button @click.prevent="delItem(item)">删除</el-button>
        </div>
      </div>

      <el-form-item>
        <el-button type="primary" @click="submitForm('roleForm')">提交</el-button>
        <el-button @click="addItem">新增一项</el-button>
        <el-button @click="resetForm('roleForm')">重置</el-button>
      </el-form-item>
    </el-form>
  </div>
</body>
<!-- 先引入 Vue -->
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js"></script>
<!-- 引入组件库 -->
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<script>
  new Vue({
    el: '#app',
    data: function () {
      return {
        roleData: [
          {
            sysName: '档案管理系统',
            sysNo: 'ms1001',
            value: '',
            roles: [
              { roleName: '管理员', roleId: 'role1001' },
              { roleName: '测试人员', roleId: 'role1002' },
              { roleName: '财务人员', roleId: 'role1003' },
              { roleName: '市场人员', roleId: 'role1004' },
            ]
          },
          {
            sysName: '贷后管理系统',
            sysNo: 'ms2001',
            value: '',
            roles: [
              { roleName: '管理员22', roleId: 'role2001' },
              { roleName: '测试人员22', roleId: 'role2002' },
              { roleName: '财务人员22', roleId: 'role2003' },
              { roleName: '市场人员22', roleId: 'role2004' },
            ]
          },
          {
            sysName: '催收管理系统',
            sysNo: 'ms3001',
            value: '',
            roles: [
              { roleName: '管理员33', roleId: 'role3001' },
              { roleName: '测试人员33', roleId: 'role3002' },
              { roleName: '财务人员33', roleId: 'role3003' },
              { roleName: '市场人员33', roleId: 'role3004' },
              { roleName: '开发人员33', roleId: 'role3005' },
            ]
          },
        ],
        roleForm: {
          list: [],
        },
        repeatRoleIds: [], // 重复的roleId
      }
    },
    mounted() {
      this.addItem();
    },
    methods: {
      submitForm(formName) {
        // 校验时 repeatRoleIds 要存重复的roleId
        this.repeatRoleIds = this.getRepeatRoleIds();
        this.$refs[formName].validate((valid) => {
          if (valid) {
            console.log(this.roleForm.list)
            // alert('submit!');
          }
        });
      },
      resetForm(formName) {
        this.$refs[formName].resetFields();
      },
      // 删除一项
      delItem(item) {
        var index = this.roleForm.list.indexOf(item)
        if (index !== -1) {
          this.roleForm.list.splice(index, 1)
          this.$nextTick(() => {
            this.clearItemValidate();
          })
        }
      },
      // 新增一项
      addItem() {
        this.roleForm.list.push(
          {
            sysNo: this.roleData[0].sysNo,
            system: JSON.parse(JSON.stringify(this.roleData)),
            roleId: '',
            roles: JSON.parse(JSON.stringify(this.roleData[0].roles)),
          },
        );
      },
      // 选择系统下拉框,选中值发生变化时触发
      toChange(sysNo, item) {
        item.roleId = '';
        for (let i = 0; i < this.roleData.length; i++) {
          if (sysNo == this.roleData[i].sysNo) {
            item.roles = JSON.parse(JSON.stringify(this.roleData[i].roles))
            return false
          }
        }
      },
      // 选择角色下拉框,选中值发生变化时触发
      roleChange(i) {
        // change 时,找到非当前下拉框的其他roleId,用于校验。
        this.repeatRoleIds = this.roleForm.list.filter((item, index) => index !== i).map(item => item.roleId)
        // 下拉框 切换 选中值时触发 => 清除验证
        this.clearItemValidate();
      },
      // 获取重复的roleId
      getRepeatRoleIds() {
        const allRoleIdList = this.roleForm.list.map(item => item.roleId)
        const noRepeat = []
        const repeat = []
        allRoleIdList.forEach(item => {
          noRepeat.includes(item) ? repeat.push(item) : noRepeat.push(item)
        })
        return repeat
      },
      // 清除验证
      clearItemValidate() {
        this.repeatRoleIds = this.getRepeatRoleIds();
        this.$refs['roleForm'].fields.map(i => {
          // 选中值并且没有重复的,清除验证
          if (i.fieldValue != '' && !this.repeatRoleIds.includes(i.fieldValue)) {
            i.clearValidate()
          }
        })
      },
      //  rules 验证规则
      validateKey(rule, value, callback) {
        if (value === '') {
          callback(new Error('角色不能为空!'))
        } else if (this.repeatRoleIds.includes(value)) {
          callback(new Error('不能选择重复的角色!'))
        } else {
          callback()
        }
      },
    }
  })
</script>

</html>
微信公众号【前端学馆】程序员IT编程书籍分享!
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
3年前
List的Select 和Select().tolist()
List<PersondelpnewList<Person{newPerson{Id1,Name"小明1",Age11,Sign0},newPerson{Id2,Name"小明2",Age12,
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这