<xl-form :model="formData" :rules="rules" ref="form">
<xl-form-item labell="手机号" prop="tel">
<xl-input type="tel" maxlength="11" v-model.trim="formData.tel" />
</xl-form-item>
<br/>
<xl-button @click="handleSubmit">提交</xl-button>
</xl-form>
<script>
export default {
data() {
return {
formData: {
tel: ""
},
rules: {
tel: [
{ required: true, message: "您的手机号码未输入" },
{ pattern: /^1[34578]\d{9}$/, message: "您的手机号码输入错误" }
]
},
}
},
methods: {
handleSubmit() {
this.$refs.form.validate(errs => {
console.log(errs);
});
},
}
}
</script>
-
通过$slot和componentName来获取插入到form标签中的数据
if (this.$slots.default) { const children = this.$slots.default .filter(vnode => { return ( vnode.tag && vnode.componentOptions && vnode.componentOptions.Ctor.options.name === "XlFormItem" ); }) .map(({ componentInstance }) => componentInstance); if ( !( children.length === this.formItems.length && children.every((pane, index) => pane === this.formItems[index]) ) ) { this.formItems = children; } } -
使用async-validator库 ,根据rules的规则调用validate()方法,根据结果做处理
validate() { const validator = new AsyncValidator(this.rules); let isSuccess = true; const findErrorByProp = (errors, prop) => { return ( errors.find(error => { return error.field === prop; }) || "" ); }; validator.validate(this.model, (errors, fields) => { this.formItems.forEach(formItem => { const prop = formItem.prop; const error = findErrorByProp(errors || [], prop); if (error) { isSuccess = false; } formItem.showError((error && error.message) || ""); }); }); return Promise.resolve(isSuccess); }
配置规则:
rule属性 type: 'integer', 'float', 'array', 'regexp', 'object', 'method', 'email', 'number', 'date', 'url', 'hex' min、max、len(优先级高于min、max属性)
实用的校验规则
-
数组 array
{ type: 'array', required: true, min: 1 }数据value非空、且为数组类型、且长度匹配校验条件。required为false时,跳过非空校验,后同。 -
时间 date
{ type: 'date', required: true, min: new Date('2017 12 10').getTime() }数据value非空、且为date日期对象,且该日期对象匹配起止时间校验。在date校验器的实现中,通过value.getTime()方法将其转化为毫秒数,然后再作range基础校验。 -
枚举 enum
{ type: 'enum', required: true, enum: ['male', 'female'] } -
正则 pattern
{ pattern: /\s/, required: true } -
字符串 string
{ type: 'string', pattern: /\s/, required: true, min: 1, whitespace: true }数据value非空、且为字符串、且其长度匹配校验条件、且匹配正则表达式或正则字符串、且不是空字符串。
Html5 form校验属性
form action 、method 、autocomplete 、target 、novalidate input onvalid 、require 、pattern、type: email,url,number,tel,date
input:required:invalid {
background-color: powderblue;
}
input:required:invalid, input:focus:invalid {
-moz-box-shadow: none;
}
<form action="demo-form.php" target="_self">
Country code:
<input type="text" name="country_code" required
oninvalid="validData()" onsubmit="setSubmit()"
pattern="[A-Za-z]{3}" title="Three letter country code">
<input type="text" name="country_code" pattern="[A-Za-z]{3}"
title="Three letter country code" onvalid="validData()">
<input type="submit">
</form>
<script>
function validData () {
console.log(11);
}
</script>