更新记录
1.0.0(2026-06-09) 下载此版本
- 首次发布。
- 纯函数
validate(data, rules, options),无状态、可并发,一次返回全部错误。 - 内置规则:require / number / integer / float / chn 系列 / alphaNum / alphaLine / mobile / landline / email / zipCode / idCard / url / regex / min / max / length / between / notbetween / in / notIn / 数值比较(gt/egt/lt/elt/eq/notEq)/ 跨字段(identical/different)/ 文件上传(uploading/uploaderr)。
- 支持规则别名(> >= < <= = != 等)、错误信息模板与逐字段自定义文案。
- 支持通过
options.validators/options.messages注入自定义规则与文案。
平台兼容性
uni-app(5.12)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
uni-app x(5.12)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ |
其他
| 多语言 | 暗黑模式 | 宽屏模式 |
|---|---|---|
| √ | √ | √ |
dh-validator
轻量级表单校验工具(uni-app / 纯 JS / 无依赖)。核心为无状态纯函数:可并发调用、互不污染,一次校验返回全部错误。
特性
- ✅ 纯函数
validate(data, rules),无共享可变状态 - ✅ 一次收集全部错误,也可
firstOnly命中第一条即返回 - ✅ 同步 / 异步两套入口:
validate与validateAsync(远程查重等) - ✅ 规则别名:
>/>=/=/!=自动映射到gt/egt/eq/notEq - ✅ 错误信息模板 + 逐字段自定义文案
- ✅ 跨字段校验,支持嵌套路径(
user.pwd) - ✅ 可扩展:
options.validators/options.messages注入自定义规则与文案 - ✅ 多端兼容(H5 / 各家小程序 / App)
引入
import dhValidator from '@/uni_modules/dh-validator';
// 或按需引入
import { validate, validateAsync } from '@/uni_modules/dh-validator';
快速上手
import { validate } from '@/uni_modules/dh-validator';
const data = {
nickname: '阿丁',
mobile: '***',
pwd: '123456',
pwd2: '123455',
age: 12,
};
const rules = [
{ name: 'nickname', label: '昵称', rules: ['require', 'min:2', 'max:12'] },
{ name: 'mobile', label: '手机号', rules: ['require', 'mobile'] },
{ name: 'pwd', label: '密码', rules: ['require', 'length:6,16'] },
{
name: 'pwd2',
label: '确认密码',
rules: ['require', ['identical', 'pwd']],
messages: { identical: '两次输入的密码不一致' },
},
{ name: 'age', label: '年龄', rules: ['require', 'integer', ['between', [18, 99]]] },
];
const result = validate(data, rules);
if (!result.valid) {
uni.showToast({ title: result.firstError, icon: 'none' });
console.log('全部错误:', result.errors); // 数组
console.log('按字段:', result.fields); // { age: '年龄必须在18到99之间', ... }
}
API
validate(data, rules, options?) => result
| 参数 | 类型 | 说明 |
|---|---|---|
data |
object |
待校验数据 |
rules |
FieldRule[] |
字段规则数组 |
options |
object |
可选项,见下 |
validateAsync(data, rules, options?) => Promise<result>
与 validate 同源、参数一致,但支持规则函数返回 Promise<boolean>,用于远程查重等异步场景(见下方「异步校验」)。
FieldRule
| 字段 | 类型 | 说明 |
|---|---|---|
name |
string |
字段名(对应 data 的 key) |
label |
string? |
展示名,用于错误信息中的 :attribute,默认取 name |
rules |
Rule[] |
规则列表 |
messages |
object? |
该字段自定义错误文案,按规则名覆盖默认模板 |
Rule 写法
- 无参:
'require' - 带参(字符串):
'min:6'、'length:6,16' - 带参(数组,参数任意类型):
['min', 6]、['between', [1, 10]]、['identical', 'pwd'] - 跨字段参数支持嵌套路径:
['identical', 'user.pwd']
非必填字段:当值为空且规则里没有
require时,自动跳过该字段的其余规则。未知规则名(拼写错误,或自定义规则未通过
options.validators注入)会被跳过且不会导致校验失败,但会在控制台console.warn告警,便于开发期发现校验静默失效。
options
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
firstOnly |
boolean |
false |
命中第一条错误即返回 |
validators |
object |
{} |
注入/覆盖校验器 (value, arg, data) => boolean |
messages |
object |
{} |
注入/覆盖错误信息模板 |
result
| 字段 | 类型 | 说明 |
|---|---|---|
valid |
boolean |
是否全部通过 |
errors |
string[] |
全部错误信息 |
fields |
object |
字段名 → 该字段首条错误 |
firstError |
string |
第一条错误,无错误为 '' |
内置规则
| 规则 | 说明 |
|---|---|
require |
必填(空串/纯空格/空数组/空对象 {} 均判为空) |
number / integer / positiveInt / float |
数值类型 |
chn / chnNum / chnOrNum |
中文 / 中文+数字 / 中文或数字 |
alphaNum / alphaLine |
字母数字 / 字母下划线(首尾非下划线) |
mobile / landline |
手机号 / 座机 |
email / zipCode / idCard / url |
邮箱 / 邮编 / 身份证 / 链接 |
regex |
自定义正则,参数为正则字符串或 RegExp |
min:n / max:n |
长度下限 / 上限(字符串长度或数组长度) |
length |
长度等于或区间:'length:6,16'、['length', [6, 16]] |
between / notbetween |
数值区间内 / 外:'between:1,10'、['between', [1, 10]] |
in / notIn |
枚举范围内 / 外:'in:a,b,c'、['in', ['a', 'b']] |
gt egt lt elt |
数值大小比较(别名 > >= < <=) |
eq / notEq |
相等 / 不等,按字符串比较,适合验证码、状态值(别名 = == same / != <>) |
identical / different |
跨字段相等 / 不等,支持嵌套路径 |
uploading / uploaderr |
文件上传中 / 上传失败检测(值为 [{ loading, error }]) |
错误信息模板
默认文案内置占位符,渲染时自动替换:
| 占位符 | 含义 |
|---|---|
:attribute |
字段展示名(取 label,缺省取 name) |
:rule |
规则参数 |
:1 / :2 |
区间规则的下限 / 上限 |
逐字段覆盖文案:在 FieldRule.messages 里按规则名给出,如上方「确认密码」示例的
{ identical: '两次输入的密码不一致' }。
扩展自定义规则
const result = validate(data, rules, {
validators: {
// (value, arg, data) => boolean
even: (value) => Number(value) % 2 === 0,
},
messages: {
even: ':attribute必须是偶数',
},
});
// 使用:{ name: 'num', label: '数字', rules: ['require', 'even'] }
异步校验
需要远程查重(用户名是否占用、手机号是否注册等)时使用 validateAsync,规则函数可返回 Promise<boolean>:
import { validateAsync } from '@/uni_modules/dh-validator';
const result = await validateAsync(data, [
{
name: 'username',
label: '用户名',
rules: [
'require',
'min:3',
// 内联函数规则:返回 true 表示通过
[
'remote',
async (value) => {
const { available } = await api.checkUsername(value);
return available;
},
],
],
messages: { remote: '该用户名已被占用' },
},
]);
if (!result.valid) {
uni.showToast({ title: result.firstError, icon: 'none' });
}
- 同步规则在
validateAsync中继续可用,无需改写; - 异步规则 reject 或抛错时,视为不通过;
- 同步
validate无法等待异步规则,若误用会在控制台告警并判为不通过。
License
MIT

收藏人数:
下载插件并导入HBuilderX
下载插件ZIP
赞赏(0)
下载 282
赞赏 5
下载 12202528
赞赏 1918
赞赏
京公网安备:11010802035340号