新人,仅记录自己编程中遇到的东西,使用WxValidate之前在网上查了部分博客,关于自定义验证方法写的模模糊糊。最后还是自己摸索出来的。
在小程序开发中有一款常用的表单验证插件:WxValidate.js。该插件是参考jQuery Validate封装的,为小程序提供一套常用的验证规则。
一、github地址
二、参数说明
参数 | 类型 | 描述 |
---|---|---|
rules | object | 验证字段的规则 |
messages | object | 验证字段的提示信息 |
三:内置校验规则
序号 | 规则 | 描述 |
---|---|---|
1 | required: true | 这是必填字段。 |
2 | email: true | 请输入有效的电子邮件地址。 |
3 | tel: true | 请输入11位的手机号码。 |
4 | url: true | 请输入有效的网址。 |
5 | date: true | 请输入有效的日期。 |
6 | dateISO: true | 请输入有效的日期(ISO),例如:2009-06-23,1998/01/22。 |
7 | number: true | 请输入有效的数字。 |
8 | digits: true | 只能输入数字。 |
9 | idcard: true | 请输入18位的有效身份证。 |
10 | equalTo: 'field' | 输入值必须和 field 相同。 |
11 | contains: 'ABC' | 输入值必须包含 ABC。 |
12 | minlength: 5 | 最少要输入 5 个字符。 |
13 | maxlength: 10 | 最多可以输入 10 个字符。 |
14 | rangelength: [5, 10] | 请输入长度在 5 到 10 之间的字符。 |
15 | min: 5 | 请输入不小于 5 的数值。 |
16 | max: 10 | 请输入不大于 10 的数值。 |
17 | range: [5, 10] | 请输入范围在 5 到 10 之间的数值。 |
四:常用实例方法
名称 | 返回类型 | 描述 |
---|---|---|
checkForm(e) | boolean | 验证所有字段的规则,返回验证是否通过。 |
valid() | boolean | 返回验证是否通过。 |
size() | number | 返回错误信息的个数。 |
validationErrors() | array | 返回所有错误信息。 |
addMethod(name, method, message) | boolean | 添加自定义验证方法。 |
五:使用方法
1.上面的链接下载WxValidate.js放入本地utils目录
2.import导入
找到自己的WxValidate.js的所在目录,../是返回上一级目录,我这里的做了分包所以结构多上去了一级目录。
import WxValidate from "../../../utils/WxValidate";
var app = getApp();
Page({
/**
* 页面的初始数据
*/
data: {
form: {
name: '',
contactPhone: '',
lawManIDcard:'',
businessImage: [],
IDcardImages: []
},
},
})
3.验证规则的书写
首先要在onLoad函数中加入验证规则函数,然后是验证规则和报错规则的代码。
此处需要注意的是一定要在js文件中onLoad验证规则,否则编译会报checkform is not a function
onLoad(options) {
this.initValidate();
},
//验证函数
initValidate() {
const rules = {
name: {
required: true,
},
contactPhone: {
required: true,
},
lawManIDcard: {
required: true,
idcard: true
},
businessImage: {
required: true,
},
IDcardImages: {
required: true,
IDcardImages: true,
}
}
const messages = {
name: {
required: '请填写公司名称',
},
contactPhone: {
required: "请填写联系人手机号",
},
lawManIDcard: {
required: "请填写法人身份证号",
idcard: "请输入正确身份证号码"
},
businessImage: {
required: "请上传营业执照",
},
IDcardImages: {
required: "请上传身份证正反两面照片",
}
}
this.WxValidate = new WxValidate(rules, messages)
// 自定义验证规则
this.WxValidate.addMethod('IDcardImages', (value, param) => {
return this.WxValidate.optional(value) || value.length == 2
}, '请上传身份证正反两面照片')
},
这里我增加了自定义验证规则,我这段addMethod的意思是在他的里面增加了个名叫IDcardImages的验证方法,第二个参数是函数,第三个是错误信息。
rules中的required的意思就不用多说了,按照我自己理解的意思就是调用什么验证方法,required和idcard是它本身自带的验证方法,IDcardImages是我自定义的验证方法。
3.表单提交
wxml中的表单我下面会贴出来,这里直接贴验证方法。
formSubmit(e) {
let params = e.detail.value
console.log(params, '---');
//这是表单提交方法返回的
//校验表单
if (!this.WxValidate.checkForm(params)) {
const error = this.WxValidate.errorList[0]
wx.showToast({
title: error.msg,
icon: 'none'
})
return false
}
//通过表单验证执行的操作
},
六.全部代码
wxml中fc-imageUp为我自己封装的图片上传组件,form中的formSubmit为提交触发方法,需点击formType为submit的button触发。自定义组件的值想通过提交方法去获取,需要在组件内通过wx://form-field使自定义组件有类似于表单控件的行为。 form 组件可以识别这些自定义组件,并在 submit 事件中返回组件的字段名及其对应字段值。这将为它添加name和value属性。关于表单方面的问题在官方自行查阅form相关的文档。
//wxml表单
<!-- 表单 -->
<view class="formBox">
<form catchsubmit="formSubmit" catchreset="formReset">
<view class="formItem">
<view class="label">公司名称:</view>
<input class="valueBox" name='name' value='{{form.name}}' placeholder="请输入公司名称"/>
</view>
<view class="formItem">
<view class="label">联系人手机号:</view>
<input class="valueBox" name='contactPhone' value='{{form.contactPhone}}' placeholder="请输入联系人手机号"/>
</view>
<view class="formItem">
<view class="label">法人身份证号:</view>
<input class="valueBox" name='lawManIDcard' value='{{form.lawManIDcard}}' placeholder="请输入法人身份证"/>
</view>
<view class="formItem-img">
<view class="label">营业执照:</view>
<fc-imageUp name="businessImage" image="{{form.businessImage}}" maxlength="2"
binddelImg="delBusinessImage" bindchangeImg="changeBusinessImage"/>
</view>
<view class="formItem-img">
<view class="label">身份证照片:</view>
<fc-imageUp name="IDcardImages" image="{{form.IDcardImages}}" maxlength="2" binddelImg="delIDcardImages"
bindchangeImg="changeIDcardImages"/>
</view>
<view>
<button class="subBtn" type="primary" formType="submit">提交</button>
</view>
</form>
</view>
//js
import WxValidate from "../../../utils/WxValidate";
var app = getApp();
Page({
/**
* 页面的初始数据
*/
data: {
form: {
name: '',
contactPhone: '',
lawManIDcard: '',
businessImage: [],
IDcardImages: []
},
},
onLoad(options) {
this.initValidate();
},
//验证函数
initValidate() {
const rules = {
name: {
required: true,
},
contactPhone: {
required: true,
},
lawManIDcard: {
required: true,
idcard: true
},
businessImage: {
required: true,
},
IDcardImages: {
required: true,
IDcardImages: true,
}
}
const messages = {
name: {
required: '请填写公司名称',
},
contactPhone: {
required: "请填写联系人手机号",
},
lawManIDcard: {
required: "请填写法人身份证号",
idcard: "请输入正确身份证号码"
},
businessImage: {
required: "请上传营业执照",
},
IDcardImages: {
required: "请上传身份证正反两面照片",
}
}
this.WxValidate = new WxValidate(rules, messages)
// 自定义验证规则
this.WxValidate.addMethod('IDcardImages', (value, param) => {
return this.WxValidate.optional(value) || value.length == 2
}, '请上传身份证正反两面照片')
},
formSubmit(e) {
let params = e.detail.value
console.log(params, '---');
//这是表单提交方法返回的
//校验表单
if (!this.WxValidate.checkForm(params)) {
const error = this.WxValidate.errorList[0]
wx.showToast({
title: error.msg,
icon: 'none'
})
return false
}
//通过表单验证执行的操作
},
})
//wxss 按钮设置为全局变量
.textBold{
font-size: 32rpx;
font-weight: bold;
text-align: center;
margin: 30rpx;
}
.textL{
width: 80%;
font-size: 25rpx;
color: rgb(112, 112, 112);
margin: 0 auto;
}
.formBox{
width: 90%;
margin: 20rpx auto;
padding-bottom: 100rpx;
box-sizing: border-box;
}
.formItem{
display: flex;
align-items: center;
margin: 20rpx 0;
}
.formItem-img{
display: flex;
/* align-items: center; */
margin: 20rpx 0;
}
.formItem-img>.label{
padding-top: 20rpx;
}
.label{
width: 180rpx;
margin-right: 20rpx;
text-align: right;
}
.valueBox{
padding: 10rpx 20rpx;
background-color: #E9E9E9;
flex:1;
/* border: 2rpx solid rgb(112, 112, 112); */
border-radius: 10rpx;
}
.subBtn{
margin-top: 20rpx;
background-color: var(--themeColor) !important;
}