From 81b8a7944eaf3d736247b155f7335d5fe1e64fb3 Mon Sep 17 00:00:00 2001 From: Tevin <tingquanren@163.com> Date: Fri, 27 Nov 2020 16:56:58 +0800 Subject: [PATCH] 实现表单第二部分:验证优化、普通文本框、图片选择框、文本域、下拉选择框 --- forms/form/CFormItem.vue | 57 ++++++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 44 insertions(+), 13 deletions(-) diff --git a/forms/form/CFormItem.vue b/forms/form/CFormItem.vue index a8e57fc..ffbf570 100644 --- a/forms/form/CFormItem.vue +++ b/forms/form/CFormItem.vue @@ -6,17 +6,7 @@ <template> <view class="c-form-item"> - <view class="c-form-item-label"> - <text - class="required" - v-if="required" - >*</text> - <text>{{label || name}}</text> - </view> - <slot - :value="formData[name]" - :onChange="evt=>onChange(evt)" - /> + <slot :itemData="itemData" /> </view> </template> @@ -34,7 +24,37 @@ formData: Object, }, data() { - return {}; + return { + error: false, + }; + }, + computed: { + itemData() { + return { + formData: this.formData, + name: this.name, + label: this.label, + required: this.isRequired, + error: this.error, + onChange: (evt) => this.onChange(evt), + }; + }, + isRequired() { + if (this.required) { + return true; + } else { + if (!this.rules || this.rules.length === 0) { + return false; + } else if (this.rules.length > 0) { + for (let rule of this.rules) { + if (rule.required) { + return true; + } + } + return false; + } + } + }, }, methods: { onChange(evt) { @@ -64,12 +84,14 @@ // 未设置验证 if (!this.required && !this.rules) { this.formData.$regItemValidator(this.name, () => { + this.error = false; return Promise.resolve({ name: this.name, passed: true, }); }); } else { + // 验证规则 const descriptor = this.rules || []; if (this.required) { descriptor.unshift({ @@ -79,7 +101,10 @@ const validator = new Schema({ [this.name]: descriptor, }); - validator.messages(validateMsgs); // 自定义验证消息 + // 汉化通用验证消息 + validator.messages(validateMsgs); + // 注册验证 + let errTimer = null; this.formData.$regItemValidator(this.name, () => { return validator .validate({ @@ -87,12 +112,18 @@ }) .then( (res) => { + this.error = false; return { name: this.name, passed: true, }; }, ({ errors, fields }) => { + this.error = true; + clearTimeout(errTimer); + errTimer = setTimeout(() => { + this.error = false; + }, 5000); return { name: this.name, passed: false, -- Gitblit v1.9.1