el-tree在el-form中通过rules进行校验

简介: el-tree在el-form中通过rules进行校验


背景

如下图,在el-form中想实现el-tree的校验,elementUI并没有提供相关的示例。

如果是按照通常的方法配置rules,无论是否选择el-tree的选项,都会报错,提示请选择功能权限配置,这说明如果按照这种方法来配置el-tree的rules,是错误的

addRoleFormRules: {
  permissionIdList: [
    { type: 'array', required: true, message: '请选择功能权限配置', trigger: 'change' },
  ],
},

正确配置el-tree的rules校验

通过自定义validator实现el-tree的校验。如下代码所示:

  1. el-form绑定校验rules: addRoleFormRules
  2. 给el-tree绑定ref为addTree
  3. 自定义addRoleFormRules中关于el-tree的校验
  4. 通过this.$refs.addTree.getCheckedKeys()获取el-tree选择的项
  5. 调用this.$refs[‘addRoleForm’].validate()实现表单的校验
<template>
  <el-card shadow="never">
    <el-dialog
      title="新增角色"
      :visible.sync="isShowAddRolePopup"
      width="35%"
      :before-close="hideAddRolePopup">
      <div class="add-role">
        <el-form ref="addRoleForm" :rules="addRoleFormRules" :model="addRoleForm" label-width="120px" class="popup-form">
          <el-form-item label="角色名称" prop="name">
            <el-input v-model="addRoleForm.name" placeholder="请输入角色名称"></el-input>
          </el-form-item>
          <el-form-item label="备注" prop="note">
            <el-input type="textarea" :rows="2" resize="none" maxlength="50" show-word-limit v-model="addRoleForm.note" placeholder="请输入备注"></el-input>
          </el-form-item>
          <el-form-item label="功能权限设置" prop="permissionIdList">
            <el-tree
              :data="permissionOptions"
              show-checkbox
              node-key="permissionId"
              :props="permissionTreeDefaultProps"
              ref="addTree"
              @check-change="addPermissionIdListChange"
              >
            </el-tree>
          </el-form-item>
          <el-form-item>
            <div class="popup-form-btn">
              <el-button @click="hideAddRolePopup">取消</el-button>
              <el-button type="primary" @click="submitAddRole">确认</el-button>
            </div>
          </el-form-item>
        </el-form>
      </div>
    </el-dialog>
  </el-card>
</template>
<script>
export default {
  name: 'RoleManagement',
  data() {
    var validatePass = (rule, value, callback) => {
      let arr = this.$refs.addTree.getCheckedKeys()
      if (arr.length == 0 || !arr) {
        callback(new Error("请选择功能权限设置"));
      } else {
        callback();
      }
    };
    return {
      isShowAddRolePopup: false,
      permissionOptions: [],
      addRoleForm: {},
      addRoleFormRules: {
        name: [
          { required: true, message: '请输入角色名称', trigger: 'blur' },
        ],
        note: [
          { required: false, message: '请输入备注', trigger: 'blur' },
          { min: 0, max: 50, message: '长度在 0 到 50 个字符', trigger: 'blur' }
        ],
        permissionIdList: [{ required: true, validator: validatePass, trigger: "change" }]
      },
      permissionTreeDefaultProps: {
        children: 'childPermissionList',
        label: 'permissionName'
      },
    }
  },
  mounted() {
    this.getPermissionOptions();
  },
  methods: {
    // 获取功能权限设置
    getPermissionOptions() {
      this.$http.get('/getRolePermissionList', {}).then(res => {
        if (res.data.code === 0) {
          this.permissionOptions = res.data.data;
        } else {
          this.$message.error(res.data.msg);
        }
      }).catch(e => {
        this.$message.error(e.message);
      });
    },
    // 展示新增账号弹窗
    showAddRolePopup() {
      this.isShowAddRolePopup = true;
    },
    // 隐藏新增账号弹窗
    hideAddRolePopup() {
      this.isShowAddRolePopup = false;
    },
    // 提交添加账号
    submitAddRole() {
      console.log(this.$refs.addTree.getCheckedKeys())
      this.$refs['addRoleForm'].validate((valid) => {
        if (valid) {
          this.fetchAddRole();
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    },
    // 提交添加账号到后台
    fetchAddRole() {
      this.$http.post('/addEnterpriseRole', this.addRoleForm).then(res => {
        if (res.data.code === 0) {
          this.$message.success('添加角色成功');
          this.addRoleForm = {};
          this.hideAddRolePopup();
          this.$refs.table.reload();
        } else {
          this.$message.error(res.data.msg);
        }
      }).catch(e => {
        this.$message.error(e.message);
      });
    },
    // 新增角色权限变化
    addPermissionIdListChange() {
      this.addRoleForm.permissionIdList = this.$refs.addTree.getCheckedKeys();
    },
  }
}
</script>
<style lang="scss" scoped>
  .add-role {
    width: 100%;
  }
  .popup-form {
    width: 80% !important;
  }
  .popup-form-btn {
    display: flex;
    justify-content: flex-end;
  }
</style>
目录
相关文章
|
前端开发 JavaScript 安全
【面试题】路由的两种模式:hash模式和 history模式
【面试题】路由的两种模式:hash模式和 history模式
531 1
subject may not be empty | type may not be empty
subject may not be empty | type may not be empty
|
JavaScript
VUE element-ui之table表格全选框(复选框)隐藏
VUE element-ui之table表格全选框(复选框)隐藏
2238 0
VUE element-ui之table表格全选框(复选框)隐藏
|
JavaScript
Vue~在线预览doc、docx、pdf、img文件
Vue~在线预览doc、docx、pdf、img文件
8369 0
|
JavaScript
Vue你不知到的$this.emit()的用法
Vue你不知到的$this.emit()的用法
Vue你不知到的$this.emit()的用法
|
应用服务中间件 Linux 网络安全
nginx安装部署ssl证书,同时支持http与https方式访问
为了使HTTP服务支持HTTPS访问,需生成并安装SSL证书,并确保Nginx支持SSL模块。首先,在`/usr/local/nginx`目录下生成RSA密钥、证书申请文件及自签名证书。接着,确认Nginx已安装SSL模块,若未安装则重新编译Nginx加入该模块。最后,编辑`nginx.conf`配置文件,启用并配置HTTPS服务器部分,指定证书路径和监听端口(如20000),保存后重启Nginx完成部署。
5495 8
|
缓存 JavaScript 前端开发
Vue 项目中动态添加 HTML 元素的方法与实践
本文探讨了 Vue 中动态添加 HTML 元素的多种技术方案,包括条件渲染(v-if/v-show)、动态组件(component :is)、手动挂载($mount)及 Vuex 状态管理等方法。通过实例分析,如动态表单生成器与全局模态框服务,展示了这些方案在实际开发中的应用。同时提供了性能优化建议和注意事项,帮助开发者根据需求选择最佳方式,在保持 Vue 响应式特性的同时实现灵活交互。附带代码示例,便于理解和实践。
638 2
|
JavaScript
computed 计算属性和 watch 监听函数的执行顺序
【10月更文挑战第23天】理解`computed`计算属性和`watch`监听函数的执行顺序是 Vue.js 开发中的一个重要知识点,它有助于我们更好地处理数据的变化和响应,确保应用的正常运行和性能优化。
|
JSON JavaScript 前端开发
VUE element-ui之table表格前端自动过滤(筛选),不调用数据接口筛选表格,方法
VUE element-ui之table表格前端自动过滤(筛选),不调用数据接口筛选表格,方法
1930 0
VUE element-ui之table表格前端自动过滤(筛选),不调用数据接口筛选表格,方法
|
Java
Java aop 如何获取方法的参数体
【8月更文挑战第12天】Java aop 如何获取方法的参数体
833 2