uniapp+uview2.0实现表单校验实战

这篇具有很好参考价值的文章主要介绍了uniapp+uview2.0实现表单校验实战。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

    表单提交是很常见的功能,本文基于uniapp+uview2.0实现表单常见属性校验处理,使用到组件有u–form、Form-item,基本使用说明如下:
    u–form

此组件一般是用于表单验证使用,每一个表单域由一个u-form-item组成,表单域中可以放置u-input、u-checkbox、u-radio、u-switch等。

在表单组中,通过model参数绑定一个对象,这个对象的属性为各个u-form-item内组件的对应变量。
由于表单验证和绑定表单规则时,需要通过ref操作,故这里需要给form组件声明ref="form1"属性。
关于u-from-item内其他可能包含的诸如input、radio等组件,请见各自组件的相关文档说明。

    u-form-item

此组件一般需要搭配Form组件使用,也可以单独搭配Input等组件使用,由于此组件参数较多,这里只对其中参数最简要介绍,其余请见底部的API说明:

prop为传入Form组件的model中的属性字段,如果需要表单验证,此属性是必填的。
labelPosition可以配置左侧"label"的对齐方式,可选为left和top。
borderBottom是否显示表单域的下划线,如果给Input组件配置了边框,可以将此属性设置为false,从而隐藏默认的下划线。
如果想在表单域配置左右的图标或小图片,可以通过leftIcon和rightIcon参数实现。

    下面结合简单的demo介绍一下基本使用,现在有一个用户信息表单信息,包含基本的用户昵称、头像、生日、简介信息,现在需要对各字段进行校验。点击提交时都为空时的异常提示信息如下图:
uniapp+uview2.0实现表单校验实战
    代码内容:

<template>
	<view>
		<!-- 注意,如果需要兼容微信小程序,最好通过setRules方法设置rules规则 -->
		<u--form labelPosition="left" :model="model1" :rules="rules" ref="form1">
			<u-form-item label="昵称" prop="userInfo.userName" borderBottom ref="item1">
				<u--input v-model="model1.userInfo.userName" border="none"></u--input>
			</u-form-item>
			<u-form-item label="头像" prop="userInfo.userImg" borderBottom ref="item1">
				<u-avatar :src="model1.userInfo.userImg" shape="circle" v-model="model1.userInfo.userImg"
					@click="chooseTheImg()"></u-avatar>
			</u-form-item>
			<u-form-item label="性别" prop="userInfo.gender" borderBottom @click="showGender = true; hideKeyboard()"
				ref="item1">
				<u--input v-model="model1.userInfo.gender" disabled disabledColor="#ffffff" placeholder="请选择性别"
					border="none"></u--input>
				<u-icon slot="right" name="arrow-right"></u-icon>
			</u-form-item>
			<u-form-item label="生日" prop="userInfo.birthday" borderBottom @click="showBirthday = true; hideKeyboard()"
				ref="item1">
				<u--input v-model="model1.userInfo.birthday" disabled disabledColor="#ffffff" placeholder="请选择生日"
					border="none"></u--input>
				<u-icon slot="right" name="arrow-right"></u-icon>
			</u-form-item>
			<u-form-item label="简介" prop="userInfo.intro" borderBottom ref="item3">
				<u--textarea placeholder="不低于3个字" v-model="model1.userInfo.intro" count></u--textarea>
			</u-form-item>
		</u--form>
		<u-button @click="submit">提交</u-button>
		<u-action-sheet :show="showGender" :actions="actions" title="请选择性别" description="如果选择保密会报错"
			@close="showGender = false;genderClose()" @select="genderSelect()">
		</u-action-sheet>
		<u-datetime-picker :show="showBirthday" :value="birthday" mode="date" closeOnClickOverlay
			@confirm="birthdayConfirm" @cancel="birthdayClose" @close="birthdayClose"></u-datetime-picker>
	</view>

</template>

<script>
	export default {
		data() {
			return {
				showGender: false, // 是否显示性别选择
				showBirthday: false, // 是否展示生日选择
				model1: {
					userInfo: {
						userName: 'uView UI',
						gender: '',
						userImg: '/static/logo.png',
						birthday: '',
						intro: '',
					}
				},
				actions: [{
						name: '男',
					},
					{
						name: '女',
					},
					{
						name: '保密',
					}

				],
				rules: {
					'userInfo.userName': {
						type: 'string',
						required: true,
						message: '请填写昵称',
						trigger: ['blur', 'change']
					},
					'userInfo.gender': {
						type: 'string',
						max: 1,
						required: true,
						message: '请选择男或女',
						trigger: ['blur', 'change']
					},
					'userInfo.userImg': {
						type: 'string',
						required: true,
						message: '请上传头像',
						trigger: ['blur', 'change']
					},
					'userInfo.birthday': {
						type: 'string',
						required: true,
						message: '请选择生日',
						trigger: ['change']
					},
					'userInfo.intro': {
						type: 'string',
						required: true,
						message: '请填写简介',
						trigger: ['change']
					}
				},
				radio: '',
				switchVal: false
			};
		},
		methods: {
			// 隐藏键盘
			hideKeyboard() {
				uni.hideKeyboard()
			},
			//选择图片
			chooseTheImg() {
				uni.chooseImage({
					count: 1, //图片可选择数量
					sizeType: ['original', 'compressed'], //original 原图,compressed 压缩图,默认二者都有
					sourceType: ['album', 'camera', '海报图库'], //album 从相册选图,camera 使用相机,默认二者都有。
					success: res => {
						let imgFiles = res.tempFilePaths //图片的本地文件路径列表
						console.log('本地地址', imgFiles)
						this.uploadTheImg(imgFiles)
					}
				})
			},
			//上传图片
			uploadTheImg(imgFiles) {
				uni.uploadFile({
					url: `XXXXXX`, //后端用于处理图片并返回图片地址的接口
					header: {
						"Content-Type": "multipart/form-data", // formdata提交格式
					},
					filePath: imgFiles[0],
					name: 'uploadfile', // 默认
					formData: { // 其他的formdata参数
						fileType: '2',
						uid: '10001',
						fileContainerName: 'default'
					},
					success: res => {
						let data = JSON.parse(res.data) //返回的是字符串,需要转成对象格式,打印data如下图
						if (data.code == 200) {
							console.log(data.msg) //图片地址
						}
					},
					fail: () => {}
				})
			},
			// 显示性别列表并校验性别是否为那女
			genderSelect(e) {
				this.model1.userInfo.gender = e.name
				this.$refs.form1.validateField('userInfo.gender')
				// 校验头像是否上传
				// this.$refs.form1.validateField('userInfo.userImg')
			},
			// 性别选择关闭,校验是否选择性别
			genderClose() {
				this.$refs.form1.validateField('userInfo.gender')
			},
			// 生日选择关闭时校验生日格式以及是否为空
			birthdayConfirm(e) {
				this.showBirthday = false
				this.model1.userInfo.birthday = uni.$u.timeFormat(e.value, 'yyyy-mm-dd')
				this.$refs.form1.validateField('userInfo.birthday')
			},
			// 生日列表关闭时校验是否为空			
			birthdayClose() {
				this.showBirthday = false
				this.$refs.form1.validateField('userInfo.birthday')
			},
			submit() {
				this.$refs.form1.validate().then(res => {
					console.log("提交表单信息:" + JSON.stringify(this.model1.userInfo))
					// uni.$u.toast('校验通过')
					// 调用服务端入表接口
				}).catch(errors => {
					console.log("失败信息:" + JSON.stringify(errors))
					// uni.$u.toast('校验失败')
				})
			}
		},
		onReady() {
			//如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过setRules方法设置规则。
			this.$refs.form1.setRules(this.rules)
		}

	};
</script>

<style lang="scss">


</style>

    规则说明:
    校验规则需要从u--form组件中指定规则名,此处为rules,data属性中rules用于定义表单各个属性的校验内容如下:

trigger{String | Array}:触发校验的方式有2种:

change:字段值发生变化时校验 blur:输入框失去焦点时触发 如果同时监听两种方式,需要写成数组形式:[‘change’,
‘blur’] type{String}
内置校验规则,如这些规则无法满足需求,可以使用正则匹配、或者使用validator自定义方法并结合uView自带验证规则。

string:必须是 string 类型,默认类型 number:必须是 number 类型 boolean:必须是 boolean 类型
method:必须是 function 类型 regexp:必须是 regexp
类型,这里的正则,指的是判断字段的内容是否一个正则表达式,而不是用这个正则去匹配字段值 integer:必须是整数类型
float:必须是浮点数类型 array:必须是 array 类型 object:必须是 object 类型 enum:必须出现在 enmu
指定的值中 date:必须是 date 类型 url:必须是 url 类型 hex:必须是 16 进制类型 email:必须是 email
类型 any:任意类型 required
布尔值,是否必填,配置此参数不会显示输入框左边的必填星号,如需要,请配置u-form-item的required为true,注意:如需在swiper标签内显示星号,需要给予swiper-item第一个根节点一定的margin样式

pattern 要求此参数值为一个正则表达式,如: /\d+/,不能带引号,如:“/\d+/”,组件会对字段进行正则判断,返回结果。

min 最小值,如果字段类型为字符串和数组,会取字符串长度与数组长度(length)与min比较,如果字段是数值,则直接与min比较。

max 最大值,规则同min参数

len 指定长度,规则同min,优先级高于min和max

enum{Array} 指定的值,配合 type: ‘enum’ 使用

whitespace{Boolean} 如果字段值内容都为空格,默认无法通过required:
true校验,如果要允许通过,需要将此参数设置为true

transform{Function},校验前对值进行转换,函数的参数为当前值,返回值为改变后的值,参数如如下:

value:当前校验字段的值 message 校验不通过时的提示信息

validator{Function}:自定义同步校验函数,参数如下:

rule:当前校验字段在 rules 中所对应的校验规则 value:当前校验字段的值
callback:校验完成时的回调,一般无需执行callback,返回true(校验通过)或者false(校验失败)即可
asyncValidator{Function}:自定义异步校验函数,参数如下:

rule:当前校验字段在 rules 中所对应的校验规则 value:当前校验字段的值
callback:校验完成时的回调,执行完异步操作(比如向后端请求数据验证),如果不通过,需要callback(new
Error(‘提示错误信息’)),如果校验通过,执行callback()即可

    this.$refs.form1.validateField('userInfo.gender')用于执行表单字段的校验处理;
    this.$refs.form1.validate()用于执行表单提交时各个字段的校验处理;
补充:
    from表单中input与左边的lable距离过大问题处理方式:直接修改u-form-item中的label-width即可;另外u-input中如果想添加边框,可以使用customStyle属性,添加示例:

<u-input  placeholder="请输入密码" customStyle="border: 5rpx solid #36373d;border-radius: 20rpx;"></u-input>

    以上是表单提交使用uview2.0进行的校验实现方案,如果感觉有所帮助欢迎评论区留言点赞或是收藏!

    官方参考链接:https://www.uviewui.com/components/form.html文章来源地址https://www.toymoban.com/news/detail-410470.html

到了这里,关于uniapp+uview2.0实现表单校验实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp 报错之 uView UI 表单校验 相关字段有数据有值的情况下非空验证失败问题

    1、uniapp 微信小程序使用了uView UI,表单字段有验证; 2、表单添加功能,数据校验正常,因为表单数据本身都是空的; 3、表单更新数据的时候,有些字段明明是有数据的,提交的时候非空验证提示不能为空; 表单更新,此时表单是有数据的,未再次改变表单校验的选择器的值

    2024年02月16日
    浏览(44)
  • uview2.0 【uniapp】购物车样式

    2024年01月18日
    浏览(32)
  • 【RuoYi移动端】uniApp导入和引用uView2.0插件

    安装 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架 uView UI,是 uni-app 生态最优秀的 UI 框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水 https://uviewui.com/components/install.html  也可直接点击以下下载地址: uView2.0重磅发布,利剑出鞘,一统江湖 - DCloud 插件市

    2024年02月11日
    浏览(42)
  • uniapp uview循环子表单验证组件实现

    uniapp uview循环子表单验证组件实现,比如果我们最常见的简历功能实现,一个人会多个工作经验。  

    2024年02月15日
    浏览(31)
  • vue3 antd项目实战——Form表单的提交与校验【v-model双向绑定input输入框、form表单数据,动态校验规则】

    本文依旧沿用 ant design vue 组件库和 ts 语言🔥🔥更多内容见Ant Design Vue官方文档 🔥🔥 vue3 antd项目实战——Form表单【后台管理系统 v-model数据的双向绑定,input输入框、Radio单选框的嵌套使用】 在上期文章中,我们完成了 UI界面的渲染 (渲染效果如下图),本期文章将带着大

    2023年04月22日
    浏览(75)
  • uview2.0封装http请求实战以及常见请求传参实录

         1.前言      2.使用步骤          2.1 配置请求拦截器以及api集中管理配置          2.2 main.js中进行引入请求拦截器          2.3 页面中引入请求方法并使用     uview2.0是uniapp开发中使用频率相对来讲比较高的一款框架,今天从实战角度介绍一下关于http请求

    2023年04月26日
    浏览(26)
  • vue实现多个el-form表单提交统一校验

    通过以下两种方法实现多个表单的统一校验: 1. 定义模板内容 在 el-form 表单中添加 ref 属性来获取表单组件对象 2. 方法一 在上述代码中,我们给每个 el-form 表单添加了 ref 属性,分别为 form1 和 form2,在 submit 方法中,分别对两个表单使用 validate 方法进行表单校验 3. 方法二

    2024年02月13日
    浏览(37)
  • 解决uview下表单无法动态校验的问题

    声明:关于uniapp插件uview表单动态校验的一个解决方案 1.uview小程序必须用 // 如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过setRules方法设置规则  this.$refs.form1.setRules(this.rules)  2.动态使用,v-for需要放在u-form下的view下面  3.绑定的校验规则rules和表单model下面

    2023年04月09日
    浏览(25)
  • 关于uview小程序表单校验不生效问题,以及小程序自定义校验

    Form 表单 | uView - 多平台快速开发的UI框架 - uni-app UI框架 官网例子 编写完了之后发现正则这块不生效 是因为不兼容,如果需要兼容小程序 需要加上 即可解决 如果校验还没生效请检查标签是否填入必要的属性

    2024年02月06日
    浏览(36)
  • 单页面内循环遍历的多个表单做校验(ui框架:elementui + uview)

    界面展示: 用户每次在【物资扫码】成功后,都会在右侧【物资列表】中增加一个如图的结构(分为上中下三部分,上为【物资编号】,中为表格展示的物资基本信息,下为用户需要填写的表单项【本次组盘数】),需要在用户点击【保存】时,校验每一个表单项必填且数量

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包