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