Bootstrap

vue2 + el-form表单的动态自定义的校验

根据element官网的描述,它的校验方法有很多形式,内置于HTML中,放在data中return里面等等。
不管那种方式,如果说有特定的校验的条件,比如根据表单中的某些字段的值进行一些特出判断时,官网自己的方式处理起来或多或少有些麻烦。
我根据项目中的实际情况(验证字段多,自定义校验,根据条件校验等)把el-form的校验规则用js封装后引入
在这里插入图片描述
rules.js就是我info界面的校验规则
index.vue的部分


<template>
    <div>
        <el-form
            ref="form"
            :model="form"
            :rules="rules"
        >
            <el-form-item label="名称" prop="name">
                <el-input
                    class="w200"
                    v-model.number="form.name"
                    placeholder="请输入名称"
                />
            </el-form-item>
            <el-form-item label="类型" prop="type">
                <el-select
                    class="w200"
                    v-model="form.type"
                    placeholder="请选择类似"
                >
                    <el-option
                        v-for="item in other_type"
                        :key="item.value"
                        :label="item.label"
                        :value="item.value"
                    >
                    </el-option>
                </el-select>
            </el-form-item>
        </el-form>
    </div>
</template>

<script>
import rules from "./rules";
export default {
    data() {
        return {
            rules: rules,
            form: {
                name: "",
                type: "",
            },
            other_type: [
                {label: 'A', value: 'a'},
                {label: 'B', value: 'b'},
                {label: 'C', value: 'c'},
            ],
        };
    },
};
</script>

<style>
.w200{
    width: 200px;
}
</style>

rules.js的部分

const regKeyName = RegExp(/\s/);
const reg = RegExp(/\D/);


const vname = (rule, value, callback) => {
    if ( !value ) {
        callback(new Error('请输入'));
        return;
    }
    if (regKeyName.test(value)) {
        callback(new Error('不能有空格'));
        return;
    }
    if (reg.test(value)) {
        callback('请输入自然数');
        return;
    }
    callback();
    return;
}
const vtype = (rule, value, callback) => {
    if (!value) {
        callback(new Error('请选择'));
        return;
    }
    callback();
    return;
}
const rules = {
    // 名称
    name: [
        { required: true, validator: vname, trigger: 'blur' },
    ],
    // 类型
    type: [
        { required: true, validator: vtype, trigger: 'change' },
    ],
}
export default rules

这样就一目了然了。
但也出现了问题, 此类引入是引入的静态文件,如果说,必填条件的required值不一定是true,需要根据条件成为false时,就不行了,它虽然能改变值,但是试图上不会刷新

在这里插入图片描述

在这里插入图片描述
所以需要对js进行一下改动

我们需要用方法的形式引入
首先对rules.js进行修改

const regKeyName = RegExp(/\s/);
const reg = RegExp(/\D/);
//用方法的形式
export function rules(isRequired) {
    
    const vname = (rule, value, callback) => {
    	// 根据传值isRequired来进行处理
        if (isRequired) {
            if (!value) {
                callback(new Error('请输入'));
                return;
            }
            if (regKeyName.test(value)) {
                callback(new Error('不能有空格'));
                return;
            }
            if (reg.test(value)) {
                callback('请输入自然数');
                return;
            }
        }
        callback();
        return;
    }
    const vtype = (rule, value, callback) => {
        if (!value) {
            callback(new Error('请选择'));
            return;
        }
        callback();
        return;
    }
    return {
        // 名称
        name: [
        	//	 此处动态判断是否校验
            { required: isRequired, validator: vname, trigger: 'blur' },
        ],
        // 类型
        type: [
            { required: true, validator: vtype, trigger: 'change' },
        ],
    }
}

对vue界面中的修改

<template>
    <div>
        <el-form ref="form" :model="form" :rules="formRules">
            <el-form-item label="名称" prop="name">
                <el-input
                    class="w200"
                    v-model.number="form.name"
                    placeholder="请输入名称"
                />
            </el-form-item>
            <el-form-item label="类型" prop="type">
                <el-select
                    class="w200"
                    v-model="form.type"
                    placeholder="请选择类似"
                >
                    <el-option
                        v-for="item in other_type"
                        :key="item.value"
                        :label="item.label"
                        :value="item.value"
                    >
                    </el-option>
                </el-select>
            </el-form-item>
        </el-form>
    </div>
</template>

<script>
// 此处要用{}包裹
import { rules } from "./rules";
export default {
    data() {
        return {
            form: {
                name: "",
                type: "",
            },
            other_type: [
                { label: "A", value: "a" },
                { label: "B", value: "b" },
                { label: "C", value: "c" },
            ],
            isRequired: true,
        };
    },
    computed: {
    	// 界面上绑定的校验值就使用formRules即可
        formRules() {
        	// 此处的rules 就是引入的方法
            return rules(this.isRequired);
        },
    },
    watch: {
        "form.type"(val) {
        	// 此处为判断条件
            if (val === "b") {
                this.isRequired = false;
            } else {
                this.isRequired = true;
            }
        },
    },
};
</script>

<style>
.w200 {
    width: 200px;
}
</style>

至此就完成了根据条件来完成特定的校验,或进行更加复杂的校验
在这里插入图片描述
在这里插入图片描述

;