|
1 | 1 | <template>
|
2 | 2 | <view class="u-form-item">
|
3 |
| - <slot /> |
| 3 | + <view>{{label}}</view> |
| 4 | + <view class=""> |
| 5 | + <slot /> |
| 6 | + <view :class="isRequired?'ai-form-item-label-required':''" class="ai-form-item-message" v-if="validateState==='error'">{{validateMessage}}</view> |
| 7 | + </view> |
4 | 8 | </view>
|
5 | 9 | </template>
|
6 | 10 |
|
7 | 11 | <script>
|
8 |
| - export default { |
9 |
| - data() { |
10 |
| - return { |
11 |
| - |
| 12 | +import Emitter from '../../libs/util/emitter.js'; |
| 13 | +import schema from '../../libs/util/async-validator'; |
| 14 | +export default { |
| 15 | + name: 'u-form-item', |
| 16 | + mixins: [Emitter], |
| 17 | + inject: ['uForm'], |
| 18 | + props: { |
| 19 | + // input的label提示语 |
| 20 | + label: { |
| 21 | + type: String, |
| 22 | + default: '' |
| 23 | + }, |
| 24 | + // 绑定的值 |
| 25 | + prop: { |
| 26 | + type: String, |
| 27 | + default: '' |
| 28 | + } |
| 29 | + }, |
| 30 | + data() { |
| 31 | + return { |
| 32 | + initialValue: '', // 存储的默认值 |
| 33 | + isRequired: false, // 是否必填 |
| 34 | + validateState: '', // 是否校验成功 |
| 35 | + validateMessage: '' // 校验失败的提示语 |
| 36 | + }; |
| 37 | + }, |
| 38 | + computed: { |
| 39 | + fieldValue() { |
| 40 | + return this.uForm.model[this.prop]; |
| 41 | + } |
| 42 | + }, |
| 43 | + methods: { |
| 44 | + // 判断是否需要required校验 |
| 45 | + setRules() { |
| 46 | + let that = this; |
| 47 | + // 从父组件u-form拿到当前u-form-item需要验证 的规则 |
| 48 | + let rules = this.getRules(); |
| 49 | + if (rules.length) { |
| 50 | + this.isRequired = rules.some(rule => { |
| 51 | + // 如果有必填项,就返回,没有的话,就是undefined |
| 52 | + return rule.required; |
| 53 | + }); |
12 | 54 | }
|
| 55 | +
|
| 56 | + // blur事件 |
| 57 | + this.$on('on-form-blur', that.onFieldBlur); |
| 58 | + // change事件 |
| 59 | + this.$on('on-form-change', that.onFieldChange); |
13 | 60 | },
|
14 |
| - methods: { |
15 |
| - |
| 61 | +
|
| 62 | + // 从u-form的rules属性中,取出当前u-form-item的校验规则 |
| 63 | + getRules() { |
| 64 | + // 父组件的所有规则 |
| 65 | + let rules = this.uForm.rules; |
| 66 | + rules = rules ? rules[this.prop] : []; |
| 67 | + // 保证返回的是一个数组形式 |
| 68 | + return [].concat(rules || []); |
| 69 | + }, |
| 70 | +
|
| 71 | + // blur事件时进行表单校验 |
| 72 | + onFieldBlur() { |
| 73 | + this.validation('blur'); |
| 74 | + }, |
| 75 | +
|
| 76 | + // change事件进行表单校验 |
| 77 | + onFieldChange() { |
| 78 | + this.validation('change'); |
| 79 | + }, |
| 80 | +
|
| 81 | + // 过滤出符合要求的rule规则 |
| 82 | + getFilteredRule(trigger) { |
| 83 | + let rules = this.getRules(); |
| 84 | + // 历遍判断规则是否有对应的事件,比如blur,change触发等的事件 |
| 85 | + return rules.filter(res => !res.trigger || trigger.indexOf(trigger) !== -1); |
| 86 | + }, |
| 87 | +
|
| 88 | + // 校验数据 |
| 89 | + validation(trigger, callback = () => {}) { |
| 90 | + // blur和change是否有当前方式的校验规则 |
| 91 | + let rules = this.getFilteredRule(trigger); |
| 92 | + // 判断是否有验证规则 |
| 93 | + if (!rules || rules.length === 0) return; |
| 94 | + // 设置当前的装填,标识为校验中 |
| 95 | + this.validateState = 'validating'; |
| 96 | + // 调用async-validator的方法 |
| 97 | + let validator = new schema({ [this.prop]: rules }); |
| 98 | + validator.validate({ [this.prop]: this.fieldValue }, { firstFields: true }, (errors, fields) => { |
| 99 | + // 记录状态和报错信息 |
| 100 | + this.validateState = !errors ? 'success' : 'error'; |
| 101 | + this.validateMessage = errors ? errors[0].message : ''; |
| 102 | + // 调用回调方法 |
| 103 | + callback(this.validateMessage); |
| 104 | + }); |
| 105 | + }, |
| 106 | +
|
| 107 | + // 清空当前的u-form-item |
| 108 | + resetField() { |
| 109 | + this.uForm.model[this.prop] = this.initialValue; |
16 | 110 | }
|
| 111 | + }, |
| 112 | +
|
| 113 | + // 组件创建完成时,将当前实例保存到u-form中 |
| 114 | + mounted() { |
| 115 | + // 如果没有传入prop,就不进行校验 |
| 116 | + if (!this.prop) return; |
| 117 | + // 发出事件,让父组件将本实例加入到管理数组中 |
| 118 | + this.dispatch('u-form', 'on-form-item-add', this); |
| 119 | + // 设置初始值 |
| 120 | + this.initialValue = this.fieldValue; |
| 121 | + // 添加表单校验 |
| 122 | + this.setRules(); |
| 123 | + }, |
| 124 | +
|
| 125 | + // 组件销毁前,将实例从 Form 的缓存中移除 |
| 126 | + beforeDestroy() { |
| 127 | + this.dispatch('u-form', 'on-form-item-remove', this); |
17 | 128 | }
|
| 129 | +}; |
18 | 130 | </script>
|
19 | 131 |
|
20 |
| -<style> |
21 |
| -</style> |
| 132 | +<style></style> |
0 commit comments