一个功能强大、易于使用的 Vue 3 表单校验插件,支持 50+ 种常见校验规则。
🎯 开箱即用  - 包含 50+ 种内置校验规则 
🚀 轻量高效  - 体积小,性能优 
💪 TypeScript  - 完整的类型定义 
🔄 异步校验  - 支持异步校验器 
🎨 灵活扩展  - 支持自定义校验规则 
📱 响应式  - 基于 Vue 3 响应式系统 
🌍 国际化  - 支持自定义错误消息 
 
npm  install  vue-form-validator-plus或使用 yarn:
yarn  add  vue-form-validator-plus或使用 pnpm:
pnpm  add  vue-form-validator-plusimport  {  createApp }  from  'vue' 
import  FormValidatorPlugin from  'vue-form-validator-plus' 
import  App from  './App.vue' 
const  app =  createApp ( App) 
app. use ( FormValidatorPlugin,  { 
  
  messages:  { 
    required:  '该字段必填' , 
    email:  '邮箱格式不正确' 
  } 
} ) 
app. mount ( '#app' ) <template>
  <div class="form-container">
    <form @submit.prevent="handleSubmit">
      <div class="form-group">
        <label>用户名:</label>
        <input
          v-model="formData.username"
          @blur="validateField('username')"
          type="text"
        />
        <span class="error" v-if="hasError('username')">
          {{ getFieldError('username') }}
        </span>
      </div>
      <div class="form-group">
        <label>邮箱:</label>
        <input
          v-model="formData.email"
          @blur="validateField('email')"
          type="email"
        />
        <span class="error" v-if="hasError('email')">
          {{ getFieldError('email') }}
        </span>
      </div>
      <div class="form-group">
        <label>手机号:</label>
        <input
          v-model="formData.phone"
          @blur="validateField('phone')"
          type="tel"
        />
        <span class="error" v-if="hasError('phone')">
          {{ getFieldError('phone') }}
        </span>
      </div>
      <div class="form-group">
        <label>密码:</label>
        <input
          v-model="formData.password"
          @blur="validateField('password')"
          type="password"
        />
        <span class="error" v-if="hasError('password')">
          {{ getFieldError('password') }}
        </span>
      </div>
      <div class="form-group">
        <label>确认密码:</label>
        <input
          v-model="formData.confirmPassword"
          @blur="validateField('confirmPassword')"
          type="password"
        />
        <span class="error" v-if="hasError('confirmPassword')">
          {{ getFieldError('confirmPassword') }}
        </span>
      </div>
      <button type="submit" :disabled="validating">
        {{ validating ? '验证中...' : '提交' }}
      </button>
    </form>
  </div>
</template>
<script setup lang="ts">
import { reactive } from 'vue'
import { useFormValidator } from 'vue-form-validator-plus'
// 表单数据
const formData = reactive({
  username: '',
  email: '',
  phone: '',
  password: '',
  confirmPassword: ''
})
// 校验规则
const rules = {
  username: [
    { required: true, message: '请输入用户名' },
    { minLength: 4, message: '用户名至少4个字符' },
    { maxLength: 16, message: '用户名最多16个字符' },
    { username: true, message: '用户名只能包含字母、数字、下划线' }
  ],
  email: [
    { required: true, message: '请输入邮箱' },
    { email: true, message: '邮箱格式不正确' }
  ],
  phone: [
    { required: true, message: '请输入手机号' },
    { phone: true, message: '手机号格式不正确' }
  ],
  password: [
    { required: true, message: '请输入密码' },
    { minLength: 6, message: '密码至少6个字符' },
    { password: true, message: '密码必须包含数字和字母' }
  ],
  confirmPassword: [
    { required: true, message: '请确认密码' },
    { same: 'password', message: '两次密码输入不一致' }
  ]
}
// 创建校验器
const {
  errors,
  validating,
  validate,
  validateField,
  hasError,
  getFieldError,
  clearErrors
} = useFormValidator(formData, rules)
// 提交表单
const handleSubmit = async () => {
  const result = await validate()
  
  if (result.valid) {
    console.log('表单验证通过', formData)
    // 提交表单数据到服务器
  } else {
    console.log('表单验证失败', result.errors)
  }
}
</script>
<style scoped>
.form-container {
  max-width: 400px;
  margin: 0 auto;
  padding: 20px;
}
.form-group {
  margin-bottom: 15px;
}
.form-group label {
  display: block;
  margin-bottom: 5px;
  font-weight: bold;
}
.form-group input {
  width: 100%;
  padding: 8px;
  border: 1px solid #ddd;
  border-radius: 4px;
}
.error {
  color: #f56c6c;
  font-size: 12px;
  margin-top: 5px;
  display: block;
}
button {
  width: 100%;
  padding: 10px;
  background-color: #409eff;
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}
button:disabled {
  background-color: #a0cfff;
  cursor: not-allowed;
}
</style>
规则 
类型 
说明 
示例 
 
 
requiredboolean 
必填项 
{ required: true } 
minnumber 
最小值 
{ min: 0 } 
maxnumber 
最大值 
{ max: 100 } 
minLengthnumber 
最小长度 
{ minLength: 6 } 
maxLengthnumber 
最大长度 
{ maxLength: 20 } 
lengthnumber 
固定长度 
{ length: 11 } 
patternRegExp 
正则表达式 
{ pattern: /^[A-Z]+$/ } 
规则 
说明 
示例 
 
 
email邮箱地址 
{ email: true } 
phone中国手机号 
{ phone: true } 
phoneLoose宽松的电话号码(含座机) 
{ phoneLoose: true } 
tel座机号码 
{ tel: true } 
mobile移动电话 
{ mobile: true } 
规则 
说明 
示例 
 
 
urlURL地址 
{ url: true } 
domain域名 
{ domain: true } 
ipIP地址 
{ ip: true } 
ipv4IPv4地址 
{ ipv4: true } 
ipv6IPv6地址 
{ ipv6: true } 
port端口号(1-65535) 
{ port: true } 
规则 
说明 
示例 
 
 
number数字 
{ number: true } 
integer整数 
{ integer: true } 
float浮点数 
{ float: true } 
positive正数 
{ positive: true } 
negative负数 
{ negative: true } 
positiveInteger正整数 
{ positiveInteger: true } 
negativeInteger负整数 
{ negativeInteger: true } 
规则 
说明 
示例 
 
 
idCard中国身份证号 
{ idCard: true } 
passport护照号码 
{ passport: true } 
规则 
说明 
示例 
 
 
bankCard银行卡号 
{ bankCard: true } 
creditCard信用卡号 
{ creditCard: true } 
规则 
说明 
示例 
 
 
zipCode中国邮政编码 
{ zipCode: true } 
postCode邮政编码(通用) 
{ postCode: true } 
规则 
说明 
示例 
 
 
date日期格式 
{ date: true } 
dateISOISO日期格式 
{ dateISO: true } 
time时间格式 
{ time: true } 
dateTime日期时间 
{ dateTime: true } 
规则 
说明 
示例 
 
 
chinese只能是中文 
{ chinese: true } 
chineseAndNumber中文和数字 
{ chineseAndNumber: true } 
noChinese不能包含中文 
{ noChinese: true } 
规则 
说明 
示例 
 
 
alpha只能是字母 
{ alpha: true } 
alphaNum字母和数字 
{ alphaNum: true } 
alphaDash字母、数字、下划线、破折号 
{ alphaDash: true } 
lowercase小写字母 
{ lowercase: true } 
uppercase大写字母 
{ uppercase: true } 
规则 
说明 
示例 
 
 
username用户名格式 
{ username: true } 
password密码(数字+字母) 
{ password: true } 
strongPassword强密码(数字+字母+特殊字符) 
{ strongPassword: true } 
hex十六进制 
{ hex: true } 
color颜色值 
{ color: true } 
base64Base64编码 
{ base64: true } 
md5MD5格式 
{ md5: true } 
uuidUUID 
{ uuid: true } 
规则 
说明 
示例 
 
 
licensePlate车牌号 
{ licensePlate: true } 
vin车架号 
{ vin: true } 
规则 
说明 
示例 
 
 
qqQQ号 
{ qq: true } 
wechat微信号 
{ wechat: true } 
规则 
类型 
说明 
示例 
 
 
fileExtensionstring[] 
文件扩展名 
{ fileExtension: ['jpg', 'png'] } 
fileSizenumber 
文件大小(字节) 
{ fileSize: 1024000 } 
imageFormatboolean 
图片格式 
{ imageFormat: true } 
规则 
类型 
说明 
示例 
 
 
samestring 
与另一字段相同 
{ same: 'password' } 
differentstring 
与另一字段不同 
{ different: 'oldPassword' } 
gtstring 
大于另一字段 
{ gt: 'minValue' } 
gtestring 
大于等于另一字段 
{ gte: 'minValue' } 
ltstring 
小于另一字段 
{ lt: 'maxValue' } 
ltestring 
小于等于另一字段 
{ lte: 'maxValue' } 
规则 
类型 
说明 
示例 
 
 
inany[] 
必须在数组中 
{ in: ['male', 'female'] } 
notInany[] 
不能在数组中 
{ notIn: ['admin', 'root'] } 
{ 
  custom :  ( value,  formData)  =>  { 
    return  value. startsWith ( 'prefix_' ) 
  } , 
  message:  '必须以 prefix_ 开头' 
} 
{ 
  asyncValidator :  async  ( value,  formData)  =>  { 
    const  response =  await  fetch ( ` /api/check-username?name= ${ value} ` ) 
    const  data =  await  response. json ( ) 
    return  data. available
  } , 
  message:  '用户名已被占用' 
}  创建表单校验器
参数: 
formData: 响应式的表单数据对象rules: 校验规则配置 
返回: 
validator: 校验器实例errors: 错误信息对象(响应式)validating: 是否正在校验(响应式)validate(): 校验所有字段validateField(field): 校验单个字段clearErrors(): 清除所有错误clearFieldError(field): 清除指定字段错误reset(): 重置表单setFieldError(field, errors): 设置字段错误getFieldError(field): 获取字段的第一个错误hasError(field): 检查字段是否有错误 
app. use ( FormValidatorPlugin,  { 
  messages:  { 
    required:  '该字段必填' , 
    email:  '邮箱格式不正确' , 
    phone:  '请输入正确的手机号' 
  } 
} )  const  rules =  { 
  username:  [ 
    { 
      required:  true , 
      message:  '请输入用户名' 
    } , 
    { 
      minLength:  4 , 
      message:  '用户名至少需要4个字符' 
    } 
  ] 
} 查看 example 目录获取更多示例代码。
MIT License © 2024
欢迎提交 Issue 和 Pull Request!
如有问题或建议,请提交 Issue。