看一眼表单公共校验

507 阅读2分钟

我正在参加「掘金·启航计划」

作为一名前端开发,如果有一天你为写校验而苦恼,你是否愿意回头看我一眼?如果有一天你发现项目历史校验一团糟,你是否愿意将它优化?如果我问你什么,你是否想到,这篇合格的文章。

背景问题

1.前端开发成本高,创建表单需要独立增加校验。

2.代码冗余量大,大量不同的表单,需要相同的校验规则。

3.历史问题,不同开发同学规则写法不统一。

4.维护成本高,每个表单需要单独维护一套校验规则。

目标

1.根据类型抽取公共的校验规则

2.简化前端开发,通过读取已经封装的公共规则,实现简单快速开发

3.减少维护成本,仅需维护公共的规则,将n个文件改动转为1个文件改动

公共规则的使用

image.png

1.公共校验规则类型

如果你需要将你项目的校验规则进行统一,那么你可以先进行分类,罗列出所需要的规则。

text('提示文本') [必填,文本输入框]
select('提示文本') [必填,选择输入框]
float('提示文本', 小数点限制位数, 是否必填) [可选是否必填,限制小数点位数的数值]
int [必填,范围>=0,整数]
email [必填,邮箱格式]
...新增维护后续自己加

2.定义公共校验规则

首先将校验规则进行抽取与定义,这里你可以像公共函数一样,放在指定的js文件中,或者用变量保存,或者放vuex。 由于我们系统使用的是vue3+elementUI,我这里将公共规则放在vuex的state中,以便后续取用。

使用vuex,在store的state中定义commonRules,用到的自定义校验函数,在store中声明(也可在指定js文件定义,在store中引用)。

// store中公共校验规则
state: {
    commonRules: {
        text: (message = "此项为必填项") => {
          return [{ required: true, message, trigger: "blur" }];
        },
        select: (message = "此项为必填项") => {
          return [{ required: true, message, trigger: ["blur", "change"] }];
        },
        float: (message = "此项为必填项", limit = 2, required = false) => {
          return [
            { required, message, trigger: "blur" },
            { validator: validateFloat(limit), trigger: "blur" }
          ];
        },
        int: [
          { required: true, message: "此项为必填项", trigger: "blur" },
          { pattern: /^\d+$/, message: "请输入>=0的整数", trigger: "blur" }
        ],
        email: [
          { required: true, message: "请输入邮箱地址", trigger: "blur" },
          { type: "email", message: "请输入正确的邮箱地址", trigger: "blur" }
        ]
        // 。。。。。。新增后续自己加
    }
}

// 校验规则使用到的公共函数方法
const validateFloat = (limit = 2, label = "当前输入") => {
  return function (rule: any, value: any, callback: any) {
    if (isNaN(value)) {
      callback(new Error("请输入数字~"));
      return;
    }
    if (value) {
      const decimal = value.toString().split(".")[1];
      if (decimal && decimal.length > limit) {
        callback(new Error(`${label}仅到小数点后${limit}位~`));
        return;
      }
    }
    callback();
  };
};
// 。。。。。。新增后续自己加

3.在表单中使用

在任意表单中,只要需要到校验规则,就可以使用,如同使用公共函数一样简单、统一

  <el-form
    ref="ruleFormRef"
    :model="ruleForm">
    <el-form-item
      label="Activity name"
      prop="name"
      :rules="commonRules.text('Please input Activity name')"> 【文本输入框校验】
      <el-input v-model="ruleForm.name" />
    </el-form-item>
    <el-form-item
      label="Activity zone"
      prop="region"
      :rules="commonRules.select('请选择地区')"> 【下拉的校验】
      <el-select v-model="ruleForm.region">
        <el-option label="Zone one" value="shanghai" />
        <el-option label="Zone two" value="beijing" />
      </el-select>
    </el-form-item>
    <el-form-item
      label="Resources"
      prop="resource"
      :rules="commonRules.email"> 【邮箱的校验】
      <el-input v-model="ruleForm.desc" />
    </el-form-item>
    <el-form-item
      label="Activity price"
      prop="price"
      :rules="commonRules.float('价格', 2)"> 【数字小数的校验】
      <el-input v-model="ruleForm.price" />
    </el-form-item>