uniapp-uview的表单校验——同步,异步,图片必输,数字校验爬坑

16 篇文章 0 订阅
<u-form :model="form" ref="uForm">
	<u-form-item label="电话" prop="faPhone">
		<u-input maxlength="20" v-model="form.faPhone" placeholder="请输入电话" />
	</u-form-item>
	<u-form-item label="头像" prop="touxiang">
		<u-upload :action="actionAvatar" ref="touxiang" width="200" height="142" :custom-btn="true"
			del-bg-color="#666666" max-count="1" :limitType="['png', 'jpg']" @on-success="onChange" :before-remove="deleteImg">
			<view slot="addBtn" class="slot-btn">
				<view class="addBox">
					<u-icon name="camera" size="60" color="#c0c4cc"></u-icon>
					<view class="">
						选择图片
					</view>
				</view>
			</view>
		</u-upload>
	</u-form-item>
	<u-form-item label="需求总量" prop="num">
		<!-- 测试发现,当input框限定type为number时,在修改的场景下,即便输入框有默认值,也会报空不通过校验 -->
		<u-input v-model="form.num" type="number" placeholder="请输入所需需求总量" />
	</u-form-item>
</u-form>
export default {
	data(){
		return {
			rules:{
				faPhone: [
					{
						// 自定义验证函数,同步校验
						validator: (rule, value, callback) => {
							// 上面有说,返回true表示校验通过,返回false表示不通过
							// this.$u.test.mobile()就是返回true或者false的,uview自带的校验方法,此处也可以自己写校验函数
							return this.$u.test.mobile(value) || this.$u.test.landline(value);
						},
						message: '请输入xxx-xxxx或者手机号',
						// 触发器可以同时用blur和change
						trigger: ['change', 'blur'],
					},{
						//异步校验,checkHandle为请求后台的函数,跟后台约定状态码为400则校验不通过
						asyncValidator: (rule, value, callback) => {
							this.checkHandle(value, (res) => {
								if (res.code == 400) {
									// 如果验证不通过,需要在callback()抛出new Error('错误提示信息')
									callback(new Error('电话已存在,请更换'));
								} else {
									// 如果校验通过,也要执行callback()回调
									callback();
								}
							})
						},
						trigger: ['blur'],
					}
				],
				touxiang: [
					{
						validator: (rule, value, callback) => {
							if (!this.form.avatarUrl) {
								return false
							} else {
								return true
							}
						},
						message: '请上传头像',
						trigger: ['change', 'blur'],
					}
				],
				num: [
					{
						required: true,
						//测试发现,当input框限定type为number时,在修改的场景下,即便输入框有默认值,也会报空不通过校验
						//给rules添加transform转为字符可解决报错,猜测应该是类型不匹配造成的验证不通过
						transform(value) {
							return String(value);
						},
						message: '请输入总量',
						trigger: ['change', 'blur'],
					}
				],
			}
		}
	},
	mounted() {
		//设置校验规则
		this.$refs.uForm.setRules(this.rules);
	},
	methods:{
		onChange(res, index, lists, name) {
			this.form.avatarUrl = res.avatarUrl;
		},
		deleteImg(){
			this.form.avatarUrl = '';
		}
	}
}
.slot-btn {
	width: 200rpx;
	height: 142rpx;
	background: rgb(244, 245, 246);
	border: 2rpx dashed #D0D0D0;
	text-align: center;
	font-size: 24rpx;
	font-family: SourceHanSansCN-Regular, SourceHanSansCN;
	font-weight: 400;
	color: #999999;
	line-height: 36rpx;
}

.addBox {
	position: relative;
	top: 50%;
	transform: translateY(-50%);
}
{
	pattern: /^[0-9a-zA-Z]*$/g,
	// 正则检验前先将值转为字符串
	transform(value) {
		return String(value);
	},
	message: '只能包含字母或数字',
	trigger: ['blur', 'change'],
}
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值