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