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
Element el-form 表单详解
本文目录 1. 前言 2. 基本用法 3. 行内表单 4. 标签对齐方式 5. 调整尺寸 6. 小结
1501 0
Element el-form 表单详解
|
1月前
|
移动开发 前端开发
vue3 Element-Plus封装的el-tree-select的使用
vue3 Element-Plus封装的el-tree-select的使用
48 0
vue3 Element-Plus封装的el-tree-select的使用
|
1月前
|
JavaScript
【Vue Error】 error Component name “product“ should always be multi-word vue/multi-word-compone……
【Vue Error】 error Component name “product“ should always be multi-word vue/multi-word-compone……
|
6月前
|
前端开发
el-option样式改变以及多个el-option无法并列问题详解(element-plus+Vue3)
el-option样式改变以及多个el-option无法并列问题详解(element-plus+Vue3)
115 0
|
10月前
|
JavaScript 前端开发
成功解决Component template should contain exactly one root element
成功解决Component template should contain exactly one root element
|
10月前
不使用el-form仅仅单独给el-input设置表单校验
不使用el-form仅仅单独给el-input设置表单校验
263 0
|
11月前
|
JavaScript 容器
4.el与data的两种写法
el与data的两种写法
67 0
|
11月前
vue3+ts:render极简demo -- 引入element ui el-input组件
vue3+ts:render极简demo -- 引入element ui el-input组件
164 0
|
11月前
el-table的用法
el-table的用法
76 0
|
JavaScript
Element el-check 多选框详解
本文目录 1. 用途 2. 普通多选框 3. 带边框的多选框 4. 多选框组 5. 按钮样式的多选框组 6. 多选框组选中数量限制 7. 选项通过变量自动生成 8. 小结
895 0
Element el-check 多选框详解