Vue 96 ,Element 15 ,Vue2 + el-form 和 el-cascader 实现级联选择器的表单验证,深度解析( el-cascader 表单验证注意事项 )

目录

前言
一、表单验证基础实现
1.1 表单规则配置
1.2 表单数据绑定
1.3 表单提交验证
二、次日的字段未验证
2.1 初始值问题
2.2 el-cascader的clearable属性
2.3 验证规则触发时机
2.4 级联选择器的数据问题
三、注意事项
3.1 初始值与数据类型
3.2 组件事件监听
3.3 验证规则调试
四、本文结语
五、更多操作

前言

在Web开发中,表单验证是确保用户输入合法性的关键环节。这里以一个包含日期、时间、级联选择器的表单为例,详细讲解如何使用Vue+Element UI实现表单验证,并重点解决字段未验证的常见问题。通过代码逻辑解析、注意事项总结,帮助我们快速掌握表单验证的核心技巧。

一、表单验证基础实现

1.1 表单规则配置

data中定义rules对象,为每个表单项设置验证规则:

<script>  

export default {  
  data() {  
    return {  
  

      rules: {  
        dutyDate: [  
          { required: true, message: "请选择值班日期", trigger: "change" },  
        ],  
        userId: [  
          { required: true, message: "请选择值班人员", trigger: "change" },  
        ],  
        startTime: [  
          { required: true, message: "请选择开始时间", trigger: "change" },  
        ],  
        endTime: [  
          { required: true, message: "请选择结束时间", trigger: "change" },  
        ],  
        morrow: [  
          { required: true, message: "请选择次日选项", trigger: "change" }, // 触发事件为change  
        ],  
        remark: [  
          { required: true, message: "请输入备注", trigger: "blur" },  
        ],  
      },  

    };  
  },  

      // 其它参数
      addCameraDialogVisiable: false, // 弹窗开关  
      addDutyParams: [  
        {  
          dutyDate: "",  
          userId: "",  
          remark: "",  
          morrow: 0, // 初始值设为null(关键点)  
          startTime: "",  
          endTime: ""  
        },  
      ],  
      dutyPersonList: [],  
      dutyPersonBanci: [  
        // 次日选项数据(关键点)  
        { value: 1, label: "次日值班" },  
        { value: 0, label: "次日休息" },  
      ],  

</script>  

注释说明

  • required: true 表示必填项。
  • trigger 定义触发验证的事件,如change(选择器)、blur(输入框)。

blur 和 change 的主要区别:

  • blur:当输入框失去焦点时触发。
  • change:当输入框的值发生变化时触发。

blur 触发于输入框失去焦点时,而 change 则在输入框的值发生改变时触发。

1.2 表单数据绑定

在模板中绑定el-formrulesref,并为每个el-form-item指定prop

<el-dialog title="新增任务" :visible.sync="addCameraDialogVisiable">  

    <!-- 表单主体 -->  
    <el-form  
      :model="addTaskParams[0]"  
      :rules="rules"  
      ref="dutyForm"  
      label-width="120px"  
    >  
      <!-- 任务日期 -->  
      <el-form-item label="任务日期" prop="dutyDate">  
        <el-date-picker  
          v-model="addTaskParams[0].dutyDate"  
          type="date"  
          placeholder="请选择日期"  
          format="yyyy-MM-dd"  
          value-format="yyyy-MM-dd"  
        />  
      </el-form-item>  

      <!-- 负责人(级联选择器) -->  
      <el-form-item label="负责人" prop="userId">  
        <el-cascader  
          v-model="addTaskParams[0].userId"  
          :options="dutyPersonList"  
          @change="handleSelectChangePerson"  
          clearable  
        />  
      </el-form-item>  

      <!-- 开始时间 -->  
      <el-form-item label="开始时间" prop="startTime">  
        <el-time-picker  
          v-model="addTaskParams[0].startTime"  
          :picker-options="{ selectableRange: '00:00:00 - 23:59:59' }"  
          format="HH:mm"  
          value-format="HH:mm"  
        />  
      </el-form-item>  

      <!-- 次日安排(关键问题所在) -->  
      <el-form-item label="次日安排" prop="morrow">  
        <el-cascader  
          v-model="addTaskParams[0].morrow"  
          :options="dutyPersonBanci"  
          @change="handleSelectChangeBanci"  
          clearable  
        />  
      </el-form-item>  

      <!-- 备注 -->  
      <el-form-item label="任务备注" prop="remark">  
        <el-input v-model="addTaskParams[0].remark" placeholder="请输入任务备注" />  
      </el-form-item>  
    </el-form>  

    <!-- 按钮区域 -->  
    <div slot="footer">  
      <el-button @click="cancelAdd">取消</el-button>  
      <el-button type="primary" @click="addTaskSure">确定</el-button>  
    </div>  

</el-dialog>

逻辑说明

  • ref="dutyForm" 通过this.$refs.dutyForm访问表单实例。
  • prop字段名需与rules中的键严格一致。
  • clearable允许用户清空选择。

这里的 ref="dutyForm"  中的  dutyForm 是一个自定义的引用名称,用于标识 DOM 元素或组件实例。它不需要在 data 中定义,而是一个 Vue 的特性,允许我们在模板中通过 ref 属性为某个元素或组件注册一个引用名称。

什么是 ref ? 具体介绍:

  1. ref 是 Vue 提供的一个特殊属性,用来给元素或子组件注册一个引用标识。
  2. 在组件中,我们可以通过 this.$refs 访问这些被标记的元素或组件实例。

1.3 表单提交验证

addDudySure方法中调用validate触发验证:

methods: {  
    // 添加任务确定
    addDudySure() {  
        this.$refs.dutyForm.validate(valid => {  
            if (valid) {  
                console.log("提交成功");  
            } else {  
                console.log("验证失败");  
                return false;  
            }  
        });  
    }  
}  

        
// 其它函数
        //  添加任务
        choseAddCamera() {
            this.addCameraDialogVisiable = true;
            // 获取人员列表
            dutyManageApi.personList().then((res) => {
                // console.log(res, 123456)
                if (res?.code === 200) {
                    const data = res?.data;
                    this.dutyPersonList = data.map(item => ({
                        label: item.name, // 将 name 赋值给 label
                        value: item.personId // 将 personId 赋值给 value
                    }));
                    // console.log(this.dutyPersonList, 123456)
                }

            });

        },
        handleSelectChangePerson(value) {
            // console.log(value, "负责人")
            // 添加编辑时,层级选择器赋值
            this.addDutyParams[0].userId = value[0]
            this.editDutyParams[0].userId = value[0]
            
            if (!value) this.addDutyParams[0].morrow = null; // 清空时设为null 
        },
        handleSelectChangeBanci(value) {
            // console.log(value, "次日安排")
            // 添加编辑时,层级选择器赋值
            this.addDutyParams[0].morrow = value[0]
            this.editDutyParams[0].morrow = value[0]

            if (!value) this.addDutyParams[0].morrow = null; // 清空时设为null 
        },
        // 添加任务确定
        addDudySure() {
            this.$refs.dutyForm.validate((valid) => {
                if (valid) {
                    // 表单验证通过,提交数据
                    // console.log("提交的数据:", this.addDutyParams[0]);
                    this.dutyTabelLoading = true;
                    dutyManageApi.addDuty(this.addDutyParams).then((res) => {
                        if (res.code === 200) {
                            this.$message({
                                message: "新增成功",
                                type: "su***ess",
                            });
                            this.cancelAdd();
                            this.defineMntrgList();
                        } else if (res.code === 500) {
                            this.dutyTabelLoading = false;
                        }
                    });

                } else {
                    // console.log("表单验证失败");
                    return false;
                }
            });

        },
        // 取消添加
        cancelAdd() {
            this.addCameraDialogVisiable = false;
            this.resetAdd();
        },
        // 重置表单
        resetAdd() {
            this.addDutyParams = [
                {
                    "dutyDate": "",
                    "userId": "",
                    "remark": "",
                    "morrow": 0,
                    "startTime": "",
                    "endTime": ""
                }
            ];
            this.$refs.dutyForm.resetFields()
        },
        // 弹框关闭
        handleDialogClose() {
            this.cancelAdd();
        },

这段代码实现添加任务的流程:点击触发 choseAddCamera 开启添加任务弹窗并获取人员列表;选择负责人、次日安排时对应方法更新数据;点 “确定”,addDudySure 验证表单,通过就提交,成功有提示、关弹窗、刷列表,点 “取消”,cancelAdd 关弹窗、重置表单。

另外注意:

  1. this.$refs.dutyForm.validate() 进行表单校验。
  2. this.$refs.dutyForm.resetFields() 清空表单内容。


二、次日的字段未验证

2.1 初始值问题

如果你发现表单的 次日 没有验证效果,可能是以下原因:v-model 的值类型问题。morrow 的初始值是 0(数字类型),而不是一个空值(如 null"")。如果 el-cascaderv-model 值始终为 0,可能会导致验证逻辑认为它已经有值,从而跳过必填验证。

因此 morrow 的初始值设为0(数字类型)可能导致验证失效,需改为null或空字符串

addDutyParams: [  
    {  
        morrow: null, // 初始值设为null  
        // 其他字段...  
    }  
]  

2.2 el-cascaderclearable属性

用户清空选择时,需确保v-model值被正确重置:

<el-cascader  
    v-model="addDutyParams[0].morrow"  
    :options="dutyPersonBanci"  
    @change="handleSelectChangeBanci"  
    clearable  
></el-cascader>  

handleSelectChangeBanci中处理清空逻辑:

handleSelectChangeBanci(value) {  
    if (!value) this.addDutyParams[0].morrow = null; // 清空时设为null  
}  

2.3 验证规则触发时机

确保morrowtrigger设置为change

rules: {  
    morrow: [  
        { required: true, message: "请选择次日选项", trigger: "change" }  
    ]  
}  

2.4 级联选择器的数据问题

确保dutyPersonBanci包含有效选项:

data() {  
    return {  
        dutyPersonBanci: [  
            { value: 1, label: "次日值班" },  
            { value: 2, label: "次日休息" }  
        ]  
    };  
}  


三、注意事项

3.1 初始值与数据类型

  • 表单验证绑定:ref="dutyForm" 是一个自定义引用名称,用于标识元素或组件,无需在 data 中定义,可通过该名称直接访问:this.$refs.dutyForm.validate() 进行表单校验。this.$refs.dutyForm.resetFields() 清空表单内容。
  • 数字类型陷阱:如morrow初始值为0,会被视为已选值,导致必填验证失效。
  • 统一数据格式:确保v-modeloptionsvalue类型一致(如NumberString)。

3.2 组件事件监听

  • 级联选择器的@change:监听选择变化并更新数据,避免v-model未同步。
  • 清空操作处理:通过clearable触发的清空需手动重置值。

3.3 验证规则调试

  • 控制台日志:通过console.log查看this.$refs.dutyForm的验证结果。
  • 样式检查:确保错误提示未被其他元素遮挡(如el-form-itemerror样式)。


四、本文结语

通过本文的分析,我们不仅实现了完整的表单验证系统,还解决了次日字段的特殊问题。我们需要注意初始值设置、组件事件监听和验证规则的触发时机,才能避免常见陷阱。虽然很简单,但平时要多注意,希望这些经验能帮助您高效构建表单验证逻辑!


五、更多操作

请看,Vue 个人专栏

Vue Develophttps://blog.csdn.***/weixin_65793170/category_12116741.html

转载请说明出处内容投诉
CSS教程网 » Vue 96 ,Element 15 ,Vue2 + el-form 和 el-cascader 实现级联选择器的表单验证,深度解析( el-cascader 表单验证注意事项 )

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买