每日一题:自定义表单验证器
每日一题:自定义表单验证器
介绍
自定义表单验证器是一种在 Web 开发中常用的技术,用于验证用户输入的数据是否符合特定的规则或要求。通过自定义表单验证器,我们可以对表单字段进行验证,并在用户提交表单之前检查数据的有效性。
准备
本题已经内置了初始代码,打开实验环境,目录结构如下:
1 | ├── components |
其中:
index.html是主页面。css是存放项目样式的文件夹。lib是存放项目依赖的文件夹。components/FormInput.js是input组件。components/FormValidator.js是表单验证器组件。js/util.js是项目需要用到的工具函数。
注意:打开环境后发现缺少项目代码,请手动键入下述命令进行下载:
1 | cd /home/project |
选中 index.html 右键启动 Web Server 服务(Open with Live Server),让项目运行起来。接着,打开环境右侧的【Web 服务】,就可以在浏览器中看到如下效果:

目标
- 完成
FormInput.js中的 TODO 部分,当输入框(class= form-input) 的值变化时,触发事件更新index.html中组件(form-input)的v-model值。(调试 tips:考生可以在点击按钮时通过打印formData的值进行查看)。 - 完成
js/util.js中的is_email函数,参数是邮箱地址,是合法邮箱返回true,否则返回false。
合法邮箱包含两个部分:
- 用户名部分:
- 用户名的结尾是
@符。 @符之前为至少 1 位字符(数字或字母)。
- 用户名的结尾是
- 域名部分:
- 中间必须是
.。 .之前为至少 1 位字符(数字、字母)。.之后为 2 到 4 位字母。
- 中间必须是
合法邮箱示例: a@b.cn、1A@88.com
不合邮箱示例: 1@1.c、1@、33.cn、Ab.cn@
- 完成
components/FormValidator.js中通用表单验证函数validateForm中的 TODO 部分。如果表单验证通过,则Promise为resolve(true),否则为resolve(false)(此部分代码已提供)。index.html中定义的formRules对象对应字段的表单值验证失败时,使用validateForm函数中提供的errors对象,在对应字段中存储错误信息。若某个字段对应的错误信息为多个时,将按照验证规则数组的顺序优先显示,即只显示第一个错误信息。函数使用的数据通过props.rules(字段名和对应的验证规则) 和props.formData(表单数据的键值对) 进行获取。
例: email为空显示了错误信息 邮箱不能为空,则不再显示 邮箱不符合规则或者长度不符 这个错误信息。
errors 数据结构示例:
1 | { |
表单每个字段对应的验证规则为一个数组,验证规则示例的配置如下:
1 | // 定义表单验证规则 |
formRules 对应字段说明如下:
注意:自定义验证函数 validator 不会和其他字段同时出现,其他字段均可同时出现。
| 参数名(Parameter) | 类型(Type) | 描述(Description) |
|---|---|---|
| validator | Function | 表单自定义验证函数,接受三个参数,分别为 rule 表单验证规则数组,value 验证表单的值,callback 回调函数。如果验证成功,callback 函数不做任何处理;如果验证失败,callback 函数接收参数 error 并将其中的文字存储在 errors 对象中,且参数 error 的值为其调用者传递过来的 new Error('这里是错误信息'),其中错误信息是验证失败的具体描述。callback 函数的调用逻辑 index.html 中已经提供,考生只需实现字段验证及 errors 错误信息存储的逻辑即可。 |
| required | Boolean | 表示表单字段是否为必填项。 |
| type | String | 字段类型,通过 FormValidator 中已提供的 validateByType 函数进行验证,该函数接收的参数为 type,类型正确则返回 true,否则返回 false |
| min | Number | 指定表单输入的最小长度。 |
| max | Number | 指定表单输入的最大长度。 |
| message | String | 验证失败时的错误信息 |
完成后示例效果如下:

规定
- 请严格按照考试步骤操作,切勿修改考试默认提供项目中的文件名称、文件夹路径、class 名、id 名、图片名等,以免造成判题无法通过。
判分标准
- 完成目标 1,得 5 分。
- 完成目标 2,得 5 分。
- 完成目标 3,得 15 分。
总通过次数: 61 | 总提交次数: 162 | 通过率: 37.7%
题解
1 | // TODO:目标 1 当输入框的值变化时,触发 input 事件更新父组件的 v-model 值 |
1 | const is_email = (val) => { |
1 | // TODO:目标 3 编写通用的表单验证规则,并将错误信息放置到 errors 对象中 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 江月迟迟!
