135 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Vue
		
	
	
	
		
		
			
		
	
	
			135 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Vue
		
	
	
	
|  | <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> |