| <template> | 
|     <view class="u-form"><slot /></view> | 
| </template> | 
|   | 
| <script> | 
|     /** | 
|      * form 表单 | 
|      * @description 此组件一般用于表单场景,可以配置Input输入框,Select弹出框,进行表单验证等。 | 
|      * @tutorial http://uviewui.com/components/form.html | 
|      * @property {Object} model 表单数据对象 | 
|      * @property {Boolean} border-bottom 是否显示表单域的下划线边框 | 
|      * @property {String} label-position 表单域提示文字的位置,left-左侧,top-上方 | 
|      * @property {String Number} label-width 提示文字的宽度,单位rpx(默认90) | 
|      * @property {Object} label-style lable的样式,对象形式 | 
|      * @property {String} label-align lable的对齐方式 | 
|      * @property {Object} rules 通过ref设置,见官网说明 | 
|      * @property {Array} error-type 错误的提示方式,数组形式,见上方说明(默认['message']) | 
|      * @example <u-form :model="form" ref="uForm"></u-form> | 
|      */ | 
|   | 
| export default { | 
|     name: 'u-form', | 
|     props: { | 
|         // 当前form的需要验证字段的集合 | 
|         model: { | 
|             type: Object, | 
|             default() { | 
|                 return {}; | 
|             } | 
|         }, | 
|         // 验证规则 | 
|         // rules: { | 
|         //     type: [Object, Function, Array], | 
|         //     default() { | 
|         //         return {}; | 
|         //     } | 
|         // }, | 
|         // 有错误时的提示方式,message-提示信息,border-如果input设置了边框,变成呈红色, | 
|         // border-bottom-下边框呈现红色,none-无提示 | 
|         errorType: { | 
|             type: Array, | 
|             default() { | 
|                 return ['message', 'toast'] | 
|             } | 
|         }, | 
|         // 是否显示表单域的下划线边框 | 
|         borderBottom: { | 
|             type: Boolean, | 
|             default: true | 
|         }, | 
|         // label的位置,left-左边,top-上边 | 
|         labelPosition: { | 
|             type: String, | 
|             default: 'left' | 
|         }, | 
|         // label的宽度,单位rpx | 
|         labelWidth: { | 
|             type: [String, Number], | 
|             default: 90 | 
|         }, | 
|         // lable字体的对齐方式 | 
|         labelAlign: { | 
|             type: String, | 
|             default: 'left' | 
|         }, | 
|         // lable的样式,对象形式 | 
|         labelStyle: { | 
|             type: Object, | 
|             default() { | 
|                 return {} | 
|             } | 
|         }, | 
|     }, | 
|     provide() { | 
|         return { | 
|             uForm: this | 
|         }; | 
|     }, | 
|     data() { | 
|         return { | 
|             rules: {} | 
|         }; | 
|     }, | 
|     created() { | 
|         // 存储当前form下的所有u-form-item的实例 | 
|         // 不能定义在data中,否则微信小程序会造成循环引用而报错 | 
|         this.fields = []; | 
|     }, | 
|     methods: { | 
|         setRules(rules) { | 
|             this.rules = rules; | 
|         }, | 
|         // 清空所有u-form-item组件的内容,本质上是调用了u-form-item组件中的resetField()方法 | 
|         resetFields() { | 
|             this.fields.map(field => { | 
|                 field.resetField(); | 
|             }); | 
|         }, | 
|         // 校验全部数据 | 
|         validate(callback) { | 
|             return new Promise(resolve => { | 
|                 // 对所有的u-form-item进行校验 | 
|                 let valid = true; // 默认通过 | 
|                 let count = 0; // 用于标记是否检查完毕 | 
|                 let errorArr = []; // 存放错误信息 | 
|                 this.fields.map(field => { | 
|                     // 调用每一个u-form-item实例的validation的校验方法 | 
|                     field.validation('', error => { | 
|                         // 如果任意一个u-form-item校验不通过,就意味着整个表单不通过 | 
|                         if (error) { | 
|                             valid = false; | 
|                             errorArr.push(error); | 
|                         } | 
|                         // 当历遍了所有的u-form-item时,调用promise的then方法 | 
|                         if (++count === this.fields.length) { | 
|                             resolve(valid); // 进入promise的then方法 | 
|                             // 判断是否设置了toast的提示方式,只提示最前面的表单域的第一个错误信息 | 
|                             if(this.errorType.indexOf('none') === -1 && this.errorType.indexOf('toast') >= 0 && errorArr.length) { | 
|                                 this.$u.toast(errorArr[0]); | 
|                             } | 
|                             // 调用回调方法 | 
|                             if (typeof callback == 'function') callback(valid); | 
|                         } | 
|                     }); | 
|                 }); | 
|             }); | 
|         } | 
|     } | 
| }; | 
| </script> | 
|   | 
| <style scoped lang="scss"> | 
| @import "../../libs/css/style.components.scss"; | 
| </style> |