<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> 
 |