更新记录

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 命中第一条即返回
  • ✅ 同步 / 异步两套入口:validatevalidateAsync(远程查重等)
  • ✅ 规则别名:> / >= / = / != 自动映射到 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

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议