npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

element-verify

v1.0.8

Published

## 前言 本插件基于Vue2.x + typescript(表单校验核心代码)+ vite + vitest这几个技术栈,绝大部分功能和element-verify v0.2.3[仓库地址](https://www.npmjs.com/package/element-verify/v/0.2.3)保持一致,表单校验核心代码参照了element-ui-verify[官方文档](https://aweiu.com/documents/element-ui-verify/)。

Downloads

63

Readme

element-verify

前言

本插件基于Vue2.x + typescript(表单校验核心代码)+ vite + vitest这几个技术栈,绝大部分功能和element-verify v0.2.3仓库地址保持一致,表单校验核心代码参照了element-ui-verify官方文档

和element-form-verify v0.2.3不同的是,当前版本主要解决了如下问题:

  1. 校验逻辑支持使用validator.js配置,而不是完全依赖自己写一套,解决校验逻辑不全的问题;
  2. 高质量地重构代码,解决代码难以维护和莫名其妙不生效的问题;
  3. 规范命名,解决中英夹杂、中式英语的问题;
  4. 规范api。

代码地址

仓库地址

支持功能

1. 内置常见校验 √
2. 支持非必须校验(非必填项且有输入时校验) √
3. 支持watch关联校验触发(原trigger实现功能与watch重复,该版本去除trigger) √
4. 支持全局注入校验规则 √
5. 支持校验自定义提示 √

快速使用

使用方法:

import ElementVerify from 'element-verify'
Vue.use(ElementVerify, {
  errorMessageTemplate: yourErrorMessageTemplate,
  fieldChange: 'clear',
})

输入参数选项对象,支持选项如下:

  ________________________________________________________________________________________________
|     参数                   说明                        类型             可选值          默认值   |
|------------------------------------------------------------------------------------------------|
| errorMessageTemplate 必填项校验未通过时的提示文案          object             ——            默认模板 |
|------------------------------------------------------------------------------------------------|
|   fieldChange     当绑定字段变化时,插件的默认行为          string             ——           ’verify’|
|————————————————————————————————————————————————————————————————————————————————————————————————|

errorMessageTemplate 错误提示模板。默认值:默认模板

如要使用自定义模板,模板内容要覆盖 默认模板 中定义的所有字段,否则 getErrorMessage 在获取不到值的时候会抛异常

fieldChange 当绑定字段变化时,插件的默认行为。默认值:’verify’。 注意:在输入框失去焦点时会始终触发校验 verify 当绑定字段变化时会实时触发校验 clear 当绑定字段变化时只清空校验结果,不触发校验

<!-- verify - 表示该表单字段是必填字段 -->
<el-form-item label="示例" prop="name" verify>
  <el-input v-model="form__.name"></el-input>
</el-form-item>

关于插件与原生校验规则优先级问题

插件的校验是非侵入式的,不会影响原生校验规则,总体上其优先级是原生校验规则 > 插件校验规则,两者是可以同时使用的。

插件使用方法

插件的开关和入口(verify)

概述:

  1. verify字段是插件的总开关,该字段存在,插件功能才会生效,若要使用本插件,verify 选项是必须的;
  2. verify的另一个作用是表示该表单字段是必填字段。

使用实例:

<el-form-item label="示例" prop="name" verify>
  <el-input v-model="form__.name"></el-input>
</el-form-item>

常规校验

概述: 常规校验则是指常见的普通校验,常规校验为校验的核心功能,插件内置了常见场景的校验,后期会随着搜集越来越丰富,也希望大家踊跃提供自己需要的校验场景。

verify字段注明: verify接收类型包括String、Object、Fucntion,空字符串类型表示开关插件以及该表单字段是否必填,Object类型表示需要校验的属性,Function类型时表示自定义的校验方法。

类型相关:检查输入内容类型的校验

数字类型

包括(正、负)整数 && 0 && (正、负)浮点数,使用 :verify="{ type: 'number' }"

<el-form-item label="手机号码" prop="phone" :verify="{ type: 'number' }">
  <el-input v-model="form__.phone"></el-input>
</el-form-item> 
整数类型

包括(正、负、0)整数,使用 :verify="{ type: 'int' }"

<el-form-item label="表单项" prop="val" :verify="{ type: 'int' }">
  <el-input v-model="form__.val"></el-input>
</el-form-item>
最多小数位

使用 :verify="{ maxDecimalLength: 2 }"

<el-form-item label="表单项" prop="val" :verify="{ maxDecimalLength: 2 }">
  <el-input v-model="form__.val"></el-input>
</el-form-item>
正整数类型(不包括0)

使用 :verify="{ type: 'int', gt: 0 }"

<el-form-item label="表单项" prop="val" :verify="{ type: 'int',  gt: 0 }">
  <el-input v-model="form__.val"></el-input>
</el-form-item>
正整数类型(包括0)

使用 :verify="{ type: 'int', gte: 0 }"

<el-form-item label="表单项" prop="val" :verify="{ type: 'int', gte: 0 }">
  <el-input v-model="form__.val"></el-input>
</el-form-item>
负整数类型(不包括0)

使用 :verify="{ type: 'int', lt: 0 }"

<el-form-item label="表单项" prop="val" :verify="{ type: 'int', lt: 0 }">
  <el-input v-model="form__.val"></el-input>
</el-form-item>
负整数类型(包括0)

使用 :verify="{ type: 'int', lte: 0 }"

<el-form-item label="表单项" prop="val" :verify="{ type: 'int', lte: 0 }">
  <el-input v-model="form__.val"></el-input>
</el-form-item>
小数类型,包括0 && (正、负)浮点数

使用 :verify="{ type: 'decimal' }"

<el-form-item label="表单项" prop="val" :verify="{ type: 'decimal' }">
  <el-input v-model="form__.val"></el-input>
</el-form-item>
正小数类型(不包括0)

使用 :verify="{ type: 'decimal', gt: 0 }"

<el-form-item label="表单项" prop="val" :verify="{ type: 'decimal', gt: 0 }">
  <el-input v-model="form__.val"></el-input>
</el-form-item>
正小数类型(包括0)

使用 :verify="{ type: 'decimal', gte: 0 }"

<el-form-item label="表单项" prop="val" :verify="{ type: 'decimal', gte: 0 }">
  <el-input v-model="form__.val"></el-input>
</el-form-item>
负小数类型(不包括0)

使用 :verify="{ type: 'decimal', lt: 0 }"

<el-form-item label="表单项" prop="val" :verify="{ type: 'decimal', lt: 0 }">
  <el-input v-model="form__.val"></el-input>
</el-form-item>
负小数类型(包括0)

使用 :verify="{ type: 'decimal', lte: 0 }"

<el-form-item label="表单项" prop="val" :verify="{ type: 'decimal', lte: 0 }">
  <el-input v-model="form__.val"></el-input>
</el-form-item>
英文字母(包括大小写)

使用 :verify="{type: 'en'}"

<el-form-item label="表单项" prop="val" :verify="{type: 'en'}">
  <el-input v-model="form__.val"></el-input>
</el-form-item>
小写英文字母

使用 :verify="{type: 'en.lower'}"

<el-form-item label="表单项" prop="val" :verify="{type: 'en.lower'}">
  <el-input v-model="form__.val"></el-input>
</el-form-item>
大写英文字母

使用 :verify="{type: 'en.upper'}"

<el-form-item label="表单项" prop="val" :verify="{type: 'en.upper'}">
  <el-input v-model="form__.val"></el-input>
</el-form-item>
中文

使用 :verify="{type: 'cn'}"

<el-form-item label="表单项" prop="val" :verify="{type: 'cn'}">
  <el-input v-model="form__.val"></el-input>
</el-form-item>
特殊字符

使用 :verify="{type: 'special'}" 注明:特殊字符包括常见的[.,!#$%^&*@_+-/?]

<el-form-item label="表单项" prop="val" :verify="{type: 'special'}">
  <el-input v-model="form__.val"></el-input>
</el-form-item>
自选类型组合

使用 :verify="{ type: 'en|number', includes: 'number' }"

<el-form-item 
  label="用户名" 
  prop="username" 
  :verify="{ type: 'en|number', includes: 'number' }"
>
  <el-input v-model="form__.username"></el-input>
</el-form-item>

注明:

  1. 自选类型组合是用来校验内容是几种类型组合的场景,例如用户密码输入。要求用户密码只能由大小写字母、数字、 特殊符号组成,且必须包含大写字母,即可使用规则:verify="{ type: 'en|number|special', includes: 'en.upper' }"。 typeOptions接收一个数组作为参数,数组参数里包含两个变量['可选字符类型', '必须包含的字符类型'],可选字符类型 表示用户可以输入哪些类型的字符,必须包含的字符类型表示用户输入内容必须包含此类型字符,多类型使用|进行分隔;
  2. 可选字符类型是必填选项,必须包含的字符类型是选填选项,不填则表示没有必须包含的字符类型;
  3. 可选字符类型 / 必须包含的字符类型可填值有如下被支持:
const strategy = {
  'en.upper': 'A-Z',
  'en.lower': 'a-z',
  'en': 'A-Za-z',
  'number': '0-9',
  'cn': '\u4e00-\u9fa5',
  'special': '/./,/!/#/$/%/^/&/*/@/_/+/(/)/-/?',
  '.': '/.',
  ',': '/,',
  '!': '/!',
  '#': '/#',
  '$': '/$',
  '%': '/%',
  '^': '/^',
  '&': '/&',
  '*': '/*',
  '@': '/@',
  '_': '/_',
  '+': '/+',
  '(': '/(',
  ')': '/)',
  '-': '/-',
  '?': '/?',
}

数字比较相关

对输入内容与预期大小比较的校验,只支持数字类型字符。

数字大于

使用 :verify="{ gt: 100 }"

<el-form-item label="价格" prop="price" :verify="{ gt: 100 }">
  <el-input v-model="form__.price"></el-input>
</el-form-item>
数字大于等于

使用 :verify="{ gte: 100 }"

<el-form-item label="价格" prop="price" :verify="{ gte: 100 }">
  <el-input v-model="form__.price"></el-input>
</el-form-item>
数字小于

使用 :verify="{ lt: 100 }"

<el-form-item label="价格" prop="price" :verify="{ lt: 100 }">
  <el-input v-model="form__.price"></el-input>
</el-form-item>
数字小于等于

使用 :verify="{ lte: 100 }"

<el-form-item label="价格" prop="price" :verify="{ lte: 100 }">
  <el-input v-model="form__.price"></el-input>
</el-form-item>
数字等于

使用 :verify="{ eq: 100 }"

<el-form-item label="价格" prop="price" :verify="{ eq: 100 }">
  <el-input v-model="form__.price"></el-input>
</el-form-item>

文本相关

对文本长度相关的校验

文本长度

使用 :verify="{ length: 5 }"

<el-form-item label="姓名" prop="name" :verify="{ length: 5 }">
  <el-input v-model="form__.name"></el-input>
</el-form-item>
最小文本长度

使用 :verify="{ minLength: 5 }"

<el-form-item label="价格" prop="price" :verify="{ minLength: 5 }">
  <el-input v-model="form__.price"></el-input>
</el-form-item>
最大文本长度

使用 :verify="{ maxLength: 5 }"

<el-form-item label="价格" prop="price" :verify="{ maxLength: 5 }">
  <el-input v-model="form__.price"></el-input>
</el-form-item>

常用相关:常见相关场景的校验

注明:便于通用选项好记忆,一般w代表弱校验、s代表强校验

手机号一般校验(11位数字、第二位3-9)

使用 :verify="{ type: 'phone' }"

<el-form-item label="价格" prop="price" :verify="{ type: 'phone' }">
  <el-input v-model="form__.price"></el-input>
</el-form-item>
手机号强校验(弱校验基础上、号段限制)

使用 :verify="{ type: 'sphone' }"

<el-form-item label="价格" prop="price" :verify="{ type: 'sphone' }">
  <el-input v-model="form__.price"></el-input>
</el-form-item>
  1. 移动号段有134,135,136,137, 138,139,147,150,151,152,157,158,159,178,182,183,184,187,188。
  2. 联通号段有130,131,132,155,156,185,186,145,176。
  3. 电信号段有133,153,177,180,181,189。
    这个号段名单随反馈增量更新
座机号码校验

使用 :verify="{ type: 'telephone' }"

<el-form-item label="价格" prop="price" :verify="{ type: 'telephone' }">
  <el-input v-model="form__.price"></el-input>
</el-form-item>

注明:

  1. 只针对国内座机号;
  2. 地区号以0开头;
  3. 地区号一般3~4位;
  4. 地区号与号码间用-符号连接;
  5. 号码一般7~8位。
邮箱(一般校验)

使用 :verify="{ type: 'email' }"

<el-form-item label="价格" prop="price" :verify="{ type: 'email' }">
  <el-input v-model="form__.price"></el-input>
</el-form-item>
邮箱(强校验)

指定固定邮箱列表,使用 :verify="{ semail: ['@qq.com', '@outlook.com', '@gmail.com'] }"

<el-form-item 
  label="价格" 
  prop="price" 
  :verify="{ semail: ['@qq.com', '@outlook.com', '@gmail.com'] }"
>
  <el-input v-model="form__.price"></el-input>
</el-form-item>

注明:semail支持校正指定邮箱列表,接收一个邮箱列表的数组为参数

url链接(一般校验)

使用 :verify="{ type: 'url' }"

<el-form-item label="表单项" prop="val" :verify="{ type: 'url' }">
  <el-input v-model="form__.val"></el-input>
</el-form-item>
url链接(强校验)

指定固定url开头链接,使用 :verify="{ surl: 'https://' }"

<el-form-item label="表单项" prop="val" :verify="{ surl: 'https://' }">
  <el-input v-model="form__.val"></el-input>
</el-form-item>
身份证校验(支持1/2代身份证)

使用 :verify="{ type: 'idCard' }"

<el-form-item label="表单项" prop="val" :verify="{ type: 'idCard' }">
  <el-input v-model="form__.val"></el-input>
</el-form-item>

注明:

  1. 对于1代15位身份证号码只会校验区域号 / 出身年月日是否符合规则;
  2. 对于2代18位身份证号码除了校验区域号 / 出身年月日,还会最后计算检查最后一位校验位,可以避免90%以上假身份号码错误。
密码选项匹配

使用 :verify="{ password: [最小长度, 最大长度, 可选的选项, 必须存在的选项] }"

<el-form-item 
  label="密码" 
  prop="password" 
  :verify="{ password: [6, 18, 'en|number|special', 'en.upper|special'] }"
>
  <el-input v-model="form__.password"></el-input>
</el-form-item>

以上校验表示,输入一个长度为6 ~ 18位,只能由字母、数字、特殊字符组成,且必须包含大写字母、特殊字符的密码 注明:

  1. password专职用于密码校验,使用方法和typeOptions类似,唯一不同是password接收的数组参数包含四个变量[最小长度, 最大长度, 可选字符类型, 必须包含的字符类型];
  2. 可选字符类型 / 必须包含的字符类型可填值有如下被支持:
const strategy = {
  'en.upper': 'A-Z',
  'en.lower': 'a-z',
  'en': 'A-Za-z',
  'number': '0-9',
  'cn': '\u4e00-\u9fa5',
  'special': '/./,/!/#/$/%/^/&/*/@/_/+/(/)/-/?',
  '.': '/.',
  ',': '/,',
  '!': '/!',
  '#': '/#',
  '$': '/$',
  '%': '/%',
  '^': '/^',
  '&': '/&',
  '*': '/*',
  '@': '/@',
  '_': '/_',
  '+': '/+',
  '(': '/(',
  ')': '/)',
  '-': '/-',
  '?': '/?',
}
自定义校验方法

使用示例如下:

<template>
  <el-form :model="model">
    <el-form-item
      label="卡号"
      prop="cardNumber"
      :verify="verifyCardNumber"
      :length="6"
    >
      <el-input v-model="model.cardNumber"></el-input>
    </el-form-item>
  </el-form>
</template>
<script>
  export default {
    data() {
      return {
        model: {
          cardNumber: '',
        },
      }
    },
    methods: {
      // callback形式
      // 校验是否是010,011开头的卡号
      verifyCardNumber(rule, val, callback) {
        // rule: 这个参数很恶心,不经常用到还要放在第一位,不过为了保持async-validator的风格,还是留着它了
        // val: 待校验值
        // callback: 校验结果回调 具体可以点击上文的"校验方法"链接查看
        if (!['010', '011'].includes(val.substr(0, 3)))
          callback(Error('错误的卡号'))
        else callback()
      },
    },
  }
</script>
6位数字验证码

使用 :verify="{ type: 'verifyCode' }"

<el-form-item label="表单项" prop="val" :verify="{ type: 'verifyCode' }">
  <el-input v-model="form__.val"></el-input>
</el-form-item>
使用validator.js配置校验逻辑

使用 :verify="{ validatorjs: ['validator方法名', '校验不通过错误提示标题', 其他参数] }",由于除了validator方法名,还需要传入其他配置参数等,故validator属性为数组类型。其中validator方法名必填,校验不通过错误提示标题必填,其他参数为选填。

<el-form-item 
  label="validator.js校验必填" 
  prop="validatorVerifyValue" 
  :verify="{ validatorjs: ['isEmail', '邮箱'] }"
> 
  <el-input v-model="form__.validatorVerifyValue"></el-input>
</el-form-item>
<el-form-item 
  label="validator.js校验contains通过" 
  prop="validatorContainsTypeValidValue" 
  :verify="{ 
    validatorjs: [
      'contains',  
      '至少包含2个abc', 
      'abc', 
      { ignoreCase: false, minOccurrences: 2 }
    ] 
  }"
> 
  <el-input v-model="form__.validatorContainsTypeValidValue"></el-input>
</el-form-item>

空检测错误提示

使用实例:

<el-form-item prop="head" verify empty-message="请上传头像"></el-form-item>

非必须校验器

使用 :verify="{ required: false }" 概述: “required: false”意指可以为空,但不是不校验的意思. 当表单字段内容为空时不进行校验放行,当表单字段内容不为空时进行校验。

使用场景: 非必须校验的使用场景虽然不是很常用,但是也是不少见的. eg: 手机号码字段,如果该字段不是很重要,既可以设置成非必填字段,但是一旦用户输入,手机号码本身存在规则(只有11位、全是数字等),此时是需要进行校验的,非必须校验器就比较适合了。

使用实例:

<el-form-item 
  label="手机号码" 
  prop="phone" 
  :verify="{ required: false, type: 'phone' }"
>
  <el-input v-model="form__.phone"></el-input>
</el-form-item>      

自定义校验不通过提示errorMessage

自定义校验方法的错误提示不受该值影响。

<el-form-item
  prop="numberProp"
  verify
  number
  error-message="请输入正确的数字"
></el-form-item>

alias

懒人的福音,用于复用错误提示,默认值:”该输入项”。使用场景:

假设你的空检测错误提示模板为:

{empty: '{alias}不能为空'}
<el-form-item prop="unknown" verify></el-form-item>
<el-form-item alias="姓名" prop="name" verify></el-form-item>
<el-form-item label="地址" prop="address" verify></el-form-item>

当unknown输入框为空时,会提示”该输入项不能为空”(alias 值默认为”该输入项”) 当姓名输入框为空时,会提示”姓名不能为空”(显式设置了 alias 值时,提示内容自然会以该值去替换模板) 当地址输入框为空时,会提示”地址不能为空”(大部分 el-form-item 都需要设置一个 label 项,而 label 项往往就代表该输入项的 alias,因此插件会取该值直接作为 alias,很贴心有木有)。

联动校验器(watch)

概述: 联动校验意指一个表单字段的变化引起另一个字段校验的触发。 使用场景:联动校验的使用场景比较业务型,大多是基于业务来考虑。 watch eg: 商品的原价不低于售卖价格

<template>
  <el-form :model="model">
    <el-form-item label="密码" prop="pass1" verify>
      <el-input v-model="model.pass1"></el-input>
    </el-form-item>
    <el-form-item
      label="确认密码"
      prop="pass2"
      :verify="verifyPassword"
      :watch="model.pass1"
    >
      <el-input v-model="model.pass2"></el-input>
    </el-form-item>
    <el-form-item label="账号" prop="userName" verify>
      <el-input v-model="model.userName"></el-input>
    </el-form-item>  
  </el-form>
</template>

<script>
  export default {
    name: 'WatchComponent',
    data() {
      return {
        model: {
          pass1: '',
          pass2: '',
          userName: ''
        },
      }
    },
    methods: {
      verifyPassword(rule, val, callback) {
        if (val !== this.model.pass1) callback(Error('两次输入密码不一致!'))
        else callback()
      },
    } 
  }
</script>

效果:当售价字段内容被改变时,会触发原价字段进行价格比价的校验,达到提醒售价设置不能低于原价的场景。

全局注入选项

概述: 全局注入选项是插件在注入Vue时提供的部分全局功能支持选项。

和自定义校验方法的区别是这个适用于全局,等于增加插件自带的校验规则。

示例 1:新增一个校验是否为 10 位整数的规则。

import elementUIVerify from 'element-ui-verify'
// 通过getRule方法复用已有的int规则
const intRuleGetter = elementUIVerify.getRule('int')
elementUIVerify.addRule('int10', () => [
  // 首先校验是否为整数
  intRuleGetter(),
  // 再校验是否为10位
  {
    validator(rule, val, callback) {
      if ((val + '').length !== 10) {
        // 尽量将出错提示定义在错误模板中(假设为{int10: '该输入项为10位整数'})
        const errorMessage = elementUIVerify.getErrorMessage('int10')
        callback(Error(errorMessage))
      } else callback()
    },
  },
])

这样就完成了一个简单的规则拓展,你就可以在任何地方像使用默认规则那样来调用你的自定义规则,如下:

<el-form-item prop="prop" :verify="{ type: 'int10' }"></el-form-item>

示例 2:新增一个校验是否为任意位整数的规则,与上面不同的是该规则需要接收一个规则参数

import elementUIVerify from 'element-ui-verify'
const intRuleGetter = elementUIVerify.getRule('int')
// 这里最好不要再直接传入'intLength'了,而是一个类似VueProp的配置项,来对规则参数稍作限制
elementUIVerify.addRule({ name: 'intLength', type: Number }, (intLength) => [
  intRuleGetter(),
  // 校验整数长度是否符合规则
  {
    validator(rule, val, callback) {
      if ((val + '').length !== intLength) {
        // 假设出错模板为{intLength: '该输入项为{intLength}位整数'}
        const errorMessage = elementUIVerify.getErrorMessage(
          'intLength',
          intLength,
        )
        callback(Error(errorMessage))
      } else callback()
    },
  },
])

调用:

<el-form-item prop="prop" :verify="{ intLength: 10 }"></el-form-item>

Q&A一些常见问题

1. 如何才能修改错误提示?
  答: 当前版本提出的解决方案如下:
    a. 使用errorMessageTemplate
    b.使用自定义校验方法
    c. 使用全局方法addRule,这样就可以自己定义规则和错误提示

2. 如何自定义校验规则?
  答:插件留给使用者自定义校验规则有以下两种方式:
      a. 使用自定义校验方法
      b. 使用全局方法addRule

单元测试

单元测试使用vitest,vitest对node和vite版本要求如下: "node": ">=14", "vite": ">= 2.7.10"

单元测试基础功能已调通,但是如果引入ElementFormVerify,跑单元测试报错,后期会解决这个问题。

目前使用手动测试,执行npm run dev即可全面测试。