基本用法

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

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

    给表单添加警告样式

    如果想给表单组件添加警告样式,可以通过把表单组件作为默认插槽,插在 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. .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. </div>
    1. export default {
    2. data() {
    3. return {
    4. valid: undefined,
    5. captcha: '',
    6. rules: {
    7. required: true,
    8. len: 6,
    9. captchaCheck: (val) => {
    10. return (resolve) => {
    11. setTimeout(() => {
    12. resolve(val === '123456')
    13. }, 1000)
    14. }
    15. /** or return promise:
    16. return new Promise((resolve) => {
    17. setTimeout(() => {
    18. resolve(val === '123456')
    19. }, 1000)
    20. })
    21. **/
    22. }
    23. },
    24. messages: {
    25. captchaCheck: 'Please input &#34;123456&#34;'
    26. }
    27. }
    28. },
    29. methods: {
    30. validatingHandler() {
    31. console.log('validating')
    32. },
    33. validatedHandler() {
    34. console.log('validated')
    35. }
    36. }
    37. }

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

    提交

    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. }).show()
    30. }
    31. })
    32. }
    33. }
    34. }

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

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

    Props

    事件

    规则

    已有规则

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

    添加规则

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

    接下来你就可以在 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. }
    • 内置的默认提示信息

      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. })
    • 修改已有类型

    原文: