elementui校验不起作用,哪里出错了?

我用ai生成了前端代码,要求字段都要校验,但不起作用。请问前端大佬们,哪里出错了?

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <title>外出申请</title>
    <link rel="stylesheet" href="/static/vue/css/index.css">
    <style>
        body {
            font-family: 'Arial', sans-serif;
            background-color: #f5f5f5;
            margin: 0;
            padding: 10px;
        }
        .outing-app {
            background: #fff;
            padding: 15px;
            border-radius: 8px;
            box-shadow: 0 2px 12px rgba(0,0,0,0.1);
        }
        .el-form-item {
            margin-bottom: 15px;
        }
        .el-form-item__label {
            width: 100%;
            text-align: left;
            font-size: 16px;
        }
        .el-form-item__content {
            width: 100%;
        }
        .el-input, .el-textarea, .el-date-editor, .el-time-picker {
            width: 100%;
        }
        .el-button {
            width: 100%;
            margin-top: 10px;
        }
        .detail-item {
            border: 1px solid #ebeef5;
            padding: 10px;
            border-radius: 4px;
            margin-bottom: 10px;
        }
        .remove-btn {
            margin-left: 10px;
        }
        @media (min-width: 768px) {
            .el-form-item {
                display: flex;
                align-items: center;
            }
            .el-form-item__label {
                width: auto;
            }
            .el-form-item__content {
                flex-grow: 1;
            }
        }
    </style>
    <script src="/static/vue/js/vue.js"></script>
    <script src="/static/vue/js/index.js"></script>
    <script src="/static/vue/js/axios.min.js"></script>
    <script src="/static/js/moment.min.js"></script>
    <script src="/static/js/compress.js"></script>
</head>
<body>
<div id="outingApp" class="outing-app">
    <el-form ref="outingForm" :model="outingForm" :rules="rules" label-position="top">
        <el-form-item label="外出人员" prop="personName">
            <el-input v-model="outingForm.personName" placeholder="请输入外出人员姓名"></el-input>
        </el-form-item>

        <el-form-item label="外出明细">
            <el-button type="primary" @click="addOutingDetail">新增外出明细</el-button>
            <div v-for="(detail, index) in outingForm.details" :key="index" class="detail-item">
                <el-form-item label="外出地点" :prop="'details[' + index + '].location'">
                    <el-input v-model="detail.location" placeholder="外出地点"></el-input>
                </el-form-item>
                <el-form-item label="日期" :prop="'details[' + index + '].date'">
                    <el-date-picker
                            v-model="detail.date"
                            type="date"
                            placeholder="日期"
                            disabled
                            default-value="new Date()">
                    </el-date-picker>
                </el-form-item>
                <el-form-item label="开始时间" :prop="'details[' + index + '].startTime'">
                    <el-time-picker
                            v-model="detail.startTime"
                            placeholder="开始时间"
                            format="HH:mm:ss"
                            value-format="HH:mm:ss">
                    </el-time-picker>
                </el-form-item>
                <el-form-item label="结束时间" :prop="'details[' + index + '].endTime'">
                    <el-time-picker
                            v-model="detail.endTime"
                            placeholder="结束时间"
                            format="HH:mm:ss"
                            value-format="HH:mm:ss">
                    </el-time-picker>
                </el-form-item>
                <el-button v-if="outingForm.details.length > 1" type="danger" class="remove-btn" @click="removeOutingDetail(index)">删除</el-button>
            </div>
        </el-form-item>

        <el-form-item>
            <el-button type="primary" @click="submitForm">提交申请</el-button>
        </el-form-item>
    </el-form>
</div>

<script>
    new Vue({
        el: '#outingApp',
        data() {
            return {
                outingForm: {
                    personName: '',
                    details: [
                        {
                            location: '',
                            date: new Date(),
                            startTime: '',
                            endTime: ''
                        }
                    ]
                },
                rules: {
                    personName: [
                        { required: true, message: '外出人员不能为空', trigger: 'blur' },
                    ],
                    details: [
                        {
                            validator: (rule, value, callback) => {
                                value.forEach((detail, index) => {
                                    if (!detail.location) {
                                        callback(new Error('外出地点不能为空'));
                                    } else if (!detail.startTime) {
                                        callback(new Error(`第${index + 1}条外出明细的开始时间不能为空`));
                                    } else if (!detail.endTime) {
                                        callback(new Error(`第${index + 1}条外出明细的结束时间不能为空`));
                                    } else if (detail.endTime <= detail.startTime) {
                                        callback(new Error(`第${index + 1}条外出明细的结束时间不能早于开始时间`));
                                    } else {
                                        callback();
                                    }
                                });
                            },
                            trigger: 'blur'
                        }
                    ]
                }
            };
        },
        methods: {
            addOutingDetail() {
                this.outingForm.details.push({
                    location: '',
                    date: new Date(),
                    startTime: '',
                    endTime: ''
                });
            },
            removeOutingDetail(index) {
                if (this.outingForm.details.length > 1) {
                    this.outingForm.details.splice(index, 1);
                }
            },
            submitForm() {
                this.$refs.outingForm.validate((valid) => {
                    console.log(valid)
                    if (valid) {
                        alert('外出申请提交成功');
                        // 这里可以添加提交表单的代码,例如发送请求到服务器
                    } else {
                        console.log('表单验证失败');
                        return false;
                    }
                });
            }
        }
    });
</script>
</body>
</html>
阅读 297
avatarAI BotBETA

可能的问题及解决方案

  1. el-date-pickerdisabled 属性

    • el-date-picker 组件被设置为 disabled,这会导致用户无法选择日期,从而无法触发验证。
    • 解决方案:移除 disabled 属性,使用户可以选择日期。
  2. 验证规则的触发时机

    • 验证规则中的 trigger: 'blur' 适用于输入框,但对于动态添加的表单项(如通过 v-for 渲染的 details),可能需要更复杂的触发逻辑。
    • 解决方案:考虑使用 trigger: ['blur', 'change'] 或在适当的时候手动触发验证。
  3. 验证器中的 callback 调用

    • 在验证器中,对于每个 detail 的验证,如果找到错误,应该立即返回错误,并停止进一步的验证。但当前的实现中,即使找到错误,也会继续遍历其他 detail 并尝试调用 callback()
    • 解决方案:使用标志变量来跟踪是否已发现错误,并在发现错误后立即返回。
  4. 动态表单项的验证路径

    • 对于动态添加的表单项,验证路径(prop)需要正确设置以确保验证器能够正确访问到对应的表单数据。
    • 验证:当前的 prop 设置看起来是正确的,但请确保与数据绑定一致。
  5. 表单引用和验证调用

    • 确保在调用 this.$refs.outingForm.validate 时,outingForm 引用已经正确设置并指向了 el-form 实例。
    • 验证:从代码来看,这部分应该是正确的。

修改后的验证器代码示例

validator: (rule, value, callback) => {
    let hasError = false;
    value.forEach((detail, index) => {
        if (!detail.location) {
            callback(new Error('外出地点不能为空'));
            hasError = true;
            return;
        }
        if (!detail.startTime) {
            callback(new Error(`第${index + 1}条外出明细的开始时间不能为空`));
            hasError = true;
            return;
        }
        if (!detail.endTime) {
            callback(new Error(`第${index + 1}条外出明细的结束时间不能为空`));
            hasError = true;
            return;
        }
        if (detail.endTime <= detail.startTime) {
            callback(new Error(`第${index + 1}条外出明细的结束时间不能早于开始时间`));
            hasError = true;
            return;
        }
    });
    if (!hasError) {
        callback();
    }
},
trigger: ['blur', 'change']  // 或者根据需求调整

总结

  • 确保 el-date-picker 不是 disabled
  • 调整验证触发时机和验证器逻辑。
  • 验证 prop 和数据绑定的一致性。

按照上述建议修改后,Element UI 的表单验证应该能够正常工作。

1 个回答

你用了element的组件和方法,但是element库都没引入啊?从你贴的代码中看不出来,你只引入了这些js,element呢?

<script src="/static/vue/js/vue.js"></script>
<script src="/static/vue/js/index.js"></script>
<script src="/static/vue/js/axios.min.js"></script>
<script src="/static/js/moment.min.js"></script>
<script src="/static/js/compress.js"></script>
推荐问题
宣传栏