Validator

1.5.0 新增

校验器,用于对表单进行验证,并提示相应的错误信息。

示例

基本用法

Validator 作为一个独立的组件,通过 model 属性绑定它需要检验的数据;rules 定义验证规则,在 rules 规则中,可以配置 type、required 等内置规则,也可以用 pattern 添加校验的正则表达式,或 custom 自定义验证函数,具体细节可见后面的规则;针对各类规则,我们有比较完善的默认提示文案,具体可见后面的默认提示文案;同时,你也可以用 messages 属性用于自定义提示信息。

  1. <cube-input v-model="text" placeholder="E-mail"></cube-input>
  2. <cube-validator v-model="valid" :model="text" :rules="rules" :messages="messages"></cube-validator>
  1. export default {
  2. data() {
  3. return {
  4. text: '',
  5. valid: undefined,
  6. rules: {
  7. required: true,
  8. type: 'email',
  9. pattern: /didi.com- /,
  10. custom: (val) => {
  11. return val.length >= 12
  12. }
  13. },
  14. messages: {
  15. pattern: 'The E-mail suffix need to be didi.com.',
  16. custom: 'The E-mail need contain at least 12 characters.'
  17. },
  18. }
  19. }
  20. }

给表单添加警告样式

如果想给表单组件添加警告样式,可以通过把表单组件作为默认插槽,插在 Validator 组件内。因为当未通过验证时,Validator 组件会有一个样式类,cube-validator_warn,给这个类下的表单元素增加样式即可。

  1. <cube-validator :model="text" :rules="rules" v-model="valid">
  2. <cube-input v-model="text"></cube-input>
  3. </cube-validator>
  1. export default {
  2. data() {
  3. return {
  4. text: '',
  5. valid: undefined,
  6. rules: {
  7. required: true,
  8. type: 'email',
  9. min: 6
  10. }
  11. }
  12. }
  13. }
  1. // add warning style to input
  2. .cube-validator_warn
  3. input
  4. border: solid 1px yellow

自定义提示插槽

用 messages 属性只能配置提示信息文案,但当你想加图标等自定义提示时,可以使用 message 插槽。这是一个作用域插槽,提供的作用域参数基本上能够满足所有的灵活定制需求,参数包括了:dirty,待检验的数据是否有修改过;message,首条没通过的规则的提示信息;result,对象,内含每条规则的校验结果和提示信息,如{ required: { valid: false, invalid: true, message: '必填' } }

  1. <cube-validator v-model="valid" :model="text" :rules="rules" :messages="messages">
  2. <cube-input v-model="text" placeholder="component name"></cube-input>
  3. <div slot="message" class="custom-msg" slot-scope="props">
  4. <div v-if="(props.dirty || props.validated) &amp;&amp; !valid">
  5. <i class="dd-cubeic-important"></i> {{ props.message }}
  6. <div>
  7. <span v-for="(item, index) in Object.values(props.result)" :key="index" v-if="item.inValid">
  8. {{ item.message + ' ' }}
  9. </span>
  10. </div>
  11. </div>
  12. </div>
  13. </cube-validator>
  1. export default {
  2. data() {
  3. return {
  4. valid: undefined,
  5. text: '',
  6. rules: {
  7. type: 'string',
  8. pattern: /^cube-/,
  9. min: 8,
  10. max: 10
  11. },
  12. messages: {
  13. pattern: 'The component name need start with &#34;cube-&#34;'
  14. },
  15. }
  16. }
  17. }
  1. .custom-msg
  2. color: orange

异步校验1.8.0+

支持校验规则是异步的情况,约定如果校验规则函数的返回值是一个函数(该函数接收一个 resolve 回调,如果调用传入 true 则代表校验成功,否则都视为失败)或者是一个 Promise 对象(resolve 的值是 true 的话就是校验成功,否则都视为失败)那么就是异步校验,同时在校验的过程中会派发 validating 事件,在校验后派发 validated 事件。

  1. <div class="validator-item">
  2. <p>Async validate: </p>
  3. <cube-validator v-model="valid" :model="captcha" :rules="rules" :messages="messages" :immediate="immediate" @validating="validatingHandler" @validated="validatedHandler">
  4. <cube-input v-model="captcha" placeholder="Please input captcha"></cube-input>
  5. </cube-validator>
  6. </div>
  1. export default {
  2. data() {
  3. return {
  4. valid: undefined,
  5. captcha: '',
  6. rules: {
  7. type: 'number',
  8. required: true,
  9. len: 6,
  10. captchaCheck: (val) => {
  11. return (resolve) => {
  12. setTimeout(() => {
  13. resolve(val === '123456')
  14. }, 1000)
  15. }
  16. /** or return promise:
  17. return new Promise((resolve) => {
  18. setTimeout(() => {
  19. resolve(val === '123456')
  20. }, 1000)
  21. })
  22. **/
  23. }
  24. },
  25. messages: {
  26. captchaCheck: 'Please input &#34;123456&#34;'
  27. }
  28. }
  29. },
  30. methods: {
  31. validatingHandler() {
  32. console.log('validating')
  33. },
  34. validatedHandler() {
  35. console.log('validated')
  36. }
  37. }
  38. }

上述的 captchaCheck 就是一个异步校验规则,校验过程需花费 1 秒。

提交

虽然提交不属于 Validator 组件,但它往往与校验结果相关联着。所以这里说一下我们对提交的一种最佳实践,可供参考。重点在于对同时存在多个校验任务,以及提交时无论是否填写过表单都要进行校验,这两个需求的处理。

  1. <cube-input v-model="text0" placeholder="Required">
  2. <cube-validator ref="validator0" v-model="result[0]" :model="text0" :rules="rules0">
  3. <cube-input v-model="text1" placeholder="E-mail">
  4. <cube-validator ref="validator1" v-model="result[1]" :model="text1" :rules="rules1">
  5. <cube-input v-model="text2" placeholder="TEL">
  6. <cube-validator ref="validator2" v-model="result[2]" :model="text2" :rules="rules2">
  7. <cube-button @click="submit">Submit</cube-button>
  1. export default {
  2. data() {
  3. return {
  4. result: [undefined, undefined, undefined],
  5. text0: '',
  6. rules0: {
  7. required: true,
  8. },
  9. text1: '',
  10. rules1: {
  11. type: 'email',
  12. },
  13. text2: '',
  14. rules2: {
  15. type: 'tel',
  16. },
  17. trigger: false
  18. }
  19. },
  20. methods: {
  21. submit() {
  22. const p1 = this.- refs.validator0.validate()
  23. const p2 = this.- refs.validator1.validate()
  24. const p3 = this.- refs.validator2.validate()
  25. Promise.all([p1, p2, p3]).then(() => {
  26. if (this.result.every(item => item)) {
  27. this.- createToast({
  28. type: 'correct',
  29. txt: 'Submited',
  30. time: 1000
  31. }).show()
  32. }
  33. })
  34. }
  35. }
  36. }

对于有多个校验同时通过才可提交的情况,为了不用一个一个去取校验结果变量,可以把这组校验结果存在一个数组,在提交时,遍历这个数组即可。

通过调用 Validator 实例的 validate 方法可以去校验处理,从 1.8.0 版本后支持回调参数且如果浏览器支持 Promise 那么返回值就是 Promise 对象。

Props

参数 说明 类型 可选值 默认值
model 必传,指定需要校验的数据 Any - -
v-model 校验结果,是否通过验证 Boolean true/false true
rules 校验规则,具体见后面的内置规则和创建规则 Object - {}
messages 自定义提示信息 Object - {}
immediate 初始时是否立即校验 Boolean true/false false
disabled1.7.0+ 是否禁用 Boolean true/false false

Slot

名字 说明 作用域参数
default 表单组件 -
message 错误提示 dirty: 待检验的数据是否有修改过 validating: 是否正在校验 validated: 是否校验过 message: 首条没通过的规则的提示信息 result: 对象,内含每条规则的校验结果和提示信息,如{ required: { valid: false, invalid: true, message: ‘必填’ } }

事件

事件名 说明 参数
validating 正在校验(只在异步场景下触发) -
validated 校验完成(只在异步场景下触发) valid: 校验是否成功
msg-click 错误消息点击 -

实例方法

方法名 说明 参数 返回值
validate(cb) 校验 cb: 校验完成后回调函数,主要用于异步校验场景,调用参数为 valid 的值 如果支持 Promise 返回值为 Promise 对象(只有 resolved 状态,值为 valid),否则返回值为 undefined

规则

已有规则

目前已有的内置规则,有 required、type、min、max、len、notWhitespace、pattern、custom。

参数 说明 类型 可选值 示例
required 必填 Boolean true/false true
type 类型 String ‘string’, ‘number’, ‘array’, ‘date’, ‘email’, ‘tel’, ‘url’ ‘tel’
min 当类型为 number 或 date 时,表示待校验的数据必须大于等于 min;其它类型,表示待校验数据的长度必须大于等于 min Number - 6
max 当类型为 number 或 date 时,表示待校验的数据必须小于等于 max;其它类型,表示待校验数据的长度必须小于等于 max Number - 8
len 当类型为 number 或 date 时,表示待校验的数据必须等于 len;其它类型,表示待校验数据的长度必须等于 len Number - 7
notWhitespace 不允许全是空白符 Boolean true/false true
pattern 正则匹配 RegExp - /1$/
custom 自定义验证函数,当返回值严格等于 true 时,代表验证通过。 Function - val => val.length === 7

添加规则

除了已有的内置规则,你还可以使用 Validator 的 addRule 方法,添加自定义的公共规则,以及 addMessage 方法添加相应的默认提示信息。

  1. import { Validator } from 'cube-ui'
  2. Validator.addRule('odd', (val, config, type) => !config || Number(val) % 2 === 1)
  3. Validator.addMessage('odd', 'Please input odd.')

接下来你就可以在 rules 的配置中使用 odd 规则了:

  1. <cube-validator v-model="valid" :model="text" :rules="rules">
  2. <cube-input v-model="text3" placeholder="odd"></cube-input>
  3. </cube-validator>
  1. export default {
  2. data() {
  3. return {
  4. text: '100',
  5. valid: undefined,
  6. rules: {
  7. type: 'number',
  8. odd: true
  9. }
  10. }
  11. }
  12. }

添加默认提示信息

首先我们看一下内置的默认提示信息是怎样的,如果你需要修改,可以通过 addMessage 修改相应子属性。

  • 内置的默认提示信息

    1. const messages = {
    2. required: '此为必填项',
    3. type: {
    4. string: '请输入字符',
    5. number: '请输入数字',
    6. array: '数据类型应为数组',
    7. date: '请选择有效日期',
    8. email: '请输入有效邮箱',
    9. tel: '请输入有效的手机号码',
    10. url: '请输入有效网址'
    11. },
    12. min: {
    13. string: (config) => `至少输入 - {config} 位字符`,
    14. number: (config) => `不得小于 - {config}`,
    15. array: (config) => `请选择至少 - {config} 项`,
    16. date: (config) => `请选择 - {toLocaleDateString(config, 'zh')} 之后的时间`,
    17. email: (config) => `至少输入 - {config} 位字符`,
    18. tel: (config) => `至少输入 - {config} 位字符`,
    19. url: (config) => `至少输入 - {config} 位字符`
    20. },
    21. max: {
    22. string: (config) => `请勿超过 - {config} 位字符`,
    23. number: (config) => `请勿大于 - {config}`,
    24. array: (config) => `最多选择 - {config} 项`,
    25. date: (config) => `请选择 - {toLocaleDateString(config, 'zh')} 之前的时间`,
    26. email: (config) => `请勿超过 - {config} 位字符`,
    27. tel: (config) => `请勿超过 - {config} 位字符`,
    28. url: (config) => `请勿超过 - {config} 位字符`
    29. },
    30. len: {
    31. string: (config) => `请输入 - {config} 位字符`,
    32. number: (config) => `需等于 - {config}`,
    33. array: (config) => `请选择 - {config} 项`,
    34. date: (config) => `请选择 - {toLocaleDateString(config, 'zh')}`,
    35. email: (config) => `请输入 - {config} 位字符`,
    36. tel: (config) => `请输入 - {config} 位字符`,
    37. url: (config) => `请输入 - {config} 位字符`
    38. },
    39. pattern: '格式错误',
    40. custom: '未通过校验',
    41. notWhitespace: '空白内容无效'
    42. }
  • 修改已有提示信息

    1. import { Validator } from 'cube-ui'
    2. Validator.addMessage('required', '必填')

添加类型

  • 添加新的类型

    1. import { Validator } from 'cube-ui'
    2. Validator.addType('yourType', (val) => {
    3. return typeof val === 'string' && /^[a-z0-9_-]+/i.test(val)
    4. })
  • 修改已有类型

    1. import { Validator } from 'cube-ui'
    2. Validator.addType('email', (val) => {
    3. return typeof val === 'string' && /^[a-z0-9_-]+@[a-z0-9_-]+(\.[a-z0-9_-]+)- /i.test(val)
    4. })

原文:

https://didi.github.io/cube-ui/#/zh-CN/docs/validator