uniapp uview循环子表单验证组件实现

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

<template>
	<view class="container container15550">
		<u-form :model="form" :rules="formRules" :errorType="['message', 'toast']" ref="formRef" class="flex diygw-form diygw-col-24">
			<u-form-item class="diygw-col-24" :required="true" label="姓名" prop="input">
				<u-input :focus="formData.inputFocus" class="" placeholder="请输入提示信息" v-model="form.input" type="text"></u-input>
			</u-form-item>
			<view class="flex flex-wrap diygw-col-24 flex-direction-column">
				<view class="diygw-col-24" v-for="(subformItem, subformIndex) in form.subform" :key="subformIndex">
					<u-form :model="form.subform[subformIndex]" :errorType="['message', 'toast']" ref="subformRef" :rules="subformItemRules">
						<u-form-item class="diygw-col-24" :required="true" label="公司名" prop="input1">
							<u-input :focus="subformItemData.input1Focus" class="" placeholder="请输入提示信息" v-model="subformItem.input1" type="text"></u-input>
						</u-form-item>
						<u-form-item class="diygw-col-24" label="单选" prop="radio">
							<u-radio-group class="flex flex-wrap diygw-col-24 justify-between" wrapClass=" justify-between" activeColor="#39b54a" v-model="subformItem.radio" @change="changeSubformItemRadio($event, subformIndex, subformItem)">
								<u-radio shape="circle" v-for="(radioitem, radioindex) in subformItemData.radioDatas" :key="radioindex" :name="radioitem.value">
									{{ radioitem.label }}
								</u-radio>
							</u-radio-group>
						</u-form-item>
						<u-form-item class="diygw-col-24" label="复选" prop="checkbox">
							<u-checkbox-group class="flex flex-wrap diygw-col-24 justify-between" wrapClass=" justify-between" activeColor="#39b54a" v-model="subformItem.checkbox" @change="changeSubformItemCheckbox">
								<u-checkbox v-model="checkboxitem.checked" v-for="(checkboxitem, checkboxindex) in subformItemData.checkboxDatas" :key="checkboxindex" :name="checkboxitem.value">
									{{ checkboxitem.label }}
								</u-checkbox>
							</u-checkbox-group>
						</u-form-item>
					</u-form>
					<view class="padding-xs flex justify-end">
						<button @tap="upSubformItem" :data-index="subformIndex" class="diygw-btn green radius margin-xs">上移</button>
						<button @tap="downSubformItem" :data-index="subformIndex" class="diygw-btn green radius margin-xs">下移</button>
						<button @tap="delSubformItem" :data-index="subformIndex" class="diygw-btn red radius margin-xs">删除</button>
					</view>
				</view>
				<view class="padding-xs">
					<button @tap="addSubformItem" class="diygw-btn diygw-col-24 radius" style="background: #07c160; color: #fff">新增</button>
				</view>
			</view>
			<view class="flex diygw-col-24">
				<button @click="submitForm" class="diygw-btn green radius-xs flex-sub margin-xs button-button-clz">按钮</button>
			</view>
		</u-form>
		<view class="clearfix"></view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				//用户全局信息
				userInfo: {},
				//页面传参
				globalOption: {},
				//自定义全局变量
				globalData: {},
				dta: {
					code: 200,
					msg: '获取数据成功',
					data: [
						{
							title: '标题1',
							remark: '描述1',
							id: 1,
							attr: {
								title: '标题1'
							},
							img: 'https://libs.diygw.com/upload/xcx.jpg'
						},
						{
							title: '标题2',
							remark: '描述2',
							id: 2,
							attr: {
								title: '标题2'
							},
							img: 'https://libs.diygw.com/upload/xcx.jpg'
						},
						{
							title: '标题3',
							remark: '描述3',
							id: 3,
							attr: {
								title: '标题3'
							},
							img: 'https://libs.diygw.com/upload/xcx.jpg'
						},
						{
							title: '标题4',
							remark: '描述4',
							id: 4,
							attr: {
								title: '标题4'
							},
							img: 'https://libs.diygw.com/upload/xcx.jpg'
						},
						{
							title: '标题5',
							remark: '描述5',
							id: 5,
							attr: {
								title: '标题5'
							},
							img: 'https://libs.diygw.com/upload/xcx.jpg'
						}
					]
				},
				subformItemData: {
					input1Focus: false,
					radioDatas: [
						{ value: '1', label: '选项一', checked: true },
						{ value: '2', label: '选项二', checked: false },
						{ value: '3', label: '选项三', checked: false }
					],
					checkboxDatas: [
						{ value: '1', label: '选项一', checked: true },
						{ value: '2', label: '选项二', checked: true },
						{ value: '3', label: '选项三', checked: false }
					]
				},
				subformItem: {
					input1: '',
					radio: '1',
					checkbox: ['1', '2']
				},
				formRules: {
					input: [
						{
							trigger: ['change', 'blur'],
							required: true,
							message: '姓名不能为空'
						}
					]
				},
				form: {
					input: '',
					subform: []
				},
				subformItemRules: {
					input1: [
						{
							trigger: ['change', 'blur'],
							required: true,
							message: '公司名不能空'
						}
					]
				},
				formData: {
					inputFocus: false
				}
			};
		},
		onShow() {
			this.setCurrentPage(this);
		},
		onLoad(option) {
			this.setCurrentPage(this);
			if (option) {
				this.setData({
					globalOption: this.getOption(option)
				});
			}

			this.init();
		},
		onReady() {
			this.$refs.formRef?.setRules(this.formRules);
			this.initSubformData();
		},
		methods: {
			async init() {},
			// 新增接口 API请求方法
			async dtaApi(param) {
				let thiz = this;
				param = param || {};
				//请求地址及请求数据,可以在加载前执行上面增加自己的代码逻辑
				let http_url = '/article.php';
				let http_data = {};
				let http_header = {
					'Content-type': 'application/json'
				};

				let dta = await this.$http.post(http_url, http_data, http_header, 'json');

				this.dta = dta;
			},
			//初始化显示子表单数据条数
			initSubformData() {
				if (this.subformItem) {
					for (let i = 0; i < 1; i++) {
						this.form.subform.push(JSON.parse(JSON.stringify(this.subformItem)));
					}
					this.initSubformValid();
				} else {
					this.navigateTo({
						type: 'tip',
						tip: '请先设计子表单哟'
					});
				}
			},
			//子表单验证
			initSubformValid() {
				//如果没找到子表单验证规,不用验证
				if (this.subformItemRules) {
					this.$nextTick(() => {
						this.$refs['subformRef']?.forEach((subform) => {
							subform.setRules(this.subformItemRules);
						});
					});
				}
			},
			//上移子表单
			upSubformItem(evt) {
				let { index } = evt.currentTarget.dataset;
				if (index == 0) {
					this.navigateTo({
						type: 'tip',
						tip: '已经是第一个'
					});
					return false;
				}
				this.form.subform[index] = this.form.subform.splice(index - 1, 1, this.form.subform[index])[0];

				this.initSubformValid();
			},
			//下移子表单
			downSubformItem(evt) {
				let { index } = evt.currentTarget.dataset;
				if (index == this.form.subform.length - 1) {
					this.navigateTo({
						type: 'tip',
						tip: '已经是最后一个'
					});
					return false;
				}
				this.form.subform[index] = this.form.subform.splice(index + 1, 1, this.form.subform[index])[0];
				this.initSubformValid();
			},
			//删除子表单
			delSubformItem(evt) {
				let { index } = evt.currentTarget.dataset;
				this.form.subform.splice(index, 1);
				this.initSubformValid();
			},
			//增加子表单
			addSubformItem() {
				this.form.subform.push(JSON.parse(JSON.stringify(this.subformItem)));
				this.initSubformValid();
			},
			//验证所有的子表单
			checkSubformValid() {
				let formFlag = true;
				return new Promise((resolve, reject) => {
					let list = [];
					this.$refs['subformRef'].forEach((subform) => {
						const p = new Promise((reso, rej) => {
							subform.validate((valid) => {
								if (!valid) {
									formFlag = false;
								}
								reso(); //单个接口执行完毕
							});
						});
						list.push(p);
					});
					Promise.all(list).then((result) => {
						resolve(formFlag); //所有接口都执行完毕
					});
				});
			},
			changeSubformItemRadio(evt, subformIndex, subformItem) {},
			changeSubformItemCheckbox(evt, subformIndex, subformItem) {},
			async submitForm(e) {
				let valid = await this.$refs.formRef.validate();

				let subformvalid = await this.checkSubformValid();
				if (valid && subformvalid) {
					//保存数据
					let param = this.form;
					let header = {
						'Content-type': 'application/json'
					};
					let url = '/sys/form/add';

					let res = await this.$http.post(url, param, header, 'json');

					if (res.code == 200) {
						this.showToast(res.msg, 'success');
					} else {
						this.showModal(res.msg, '提示', false);
					}
				} else {
					console.log('验证失败');
				}
			}
		}
	};
</script>

<style lang="scss" scoped>
	.button-button-clz {
		margin: 3px !important;
	}
	.container15550 {
		padding-left: 0px;
		padding-right: 0px;

		font-size: 12px;
	}
	.container15550 {
	}
</style>

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

uniapp表单循环验证,ui

 文章来源地址https://www.toymoban.com/news/detail-617438.html

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

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

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

相关文章

  • uniapp中UView中 u-form表单在v-for循环下如何进行表单校验

    1、数据data格式 注:rule绑定的tableFromRule中要和表单tableFrom下面放置一个同名数组,确保u-form能找到 2、dom结构 3、u-form-item格式必须用 :prop=“ tableData.${index}.localation ” 4、修改源码 找到async validateField(value, callback, event = null)函数进行替换 5、替换如下 6、在tableData每次塞数据的

    2024年02月09日
    浏览(49)
  • 【vue】element-ui的form数组表单验证(循环表单验证)

    基于 vue2.0 的 element-ui 的 form 表单验证比较简单,但是有些同学可能对于 数组类型 的表单验证无从下手,这里我基于一个我自己项目中的例子,展示一下怎么进行数组的表单验证。 项目截图: 上代码,为了让大家看起来比较清晰,我删掉了无关的代码: 咱们把数组验证的部

    2024年02月07日
    浏览(40)
  • uniapp的UI框架组件库——uView

    在写uniapp项目时候,官方所推荐的样式库并不能满足日常的需求,也不可能自己去写相应的样式,费时又费力,所以我们一般会去使用第三方的组件库UI,就像vue里我们所熟悉的elementUI组件库一样的道理,在uniapp中我们所使用的组件库是uView 一、组件库的使用  uView组件官网:

    2024年02月13日
    浏览(30)
  • uniapp+uview2.0实现表单校验实战

        表单提交是很常见的功能,本文基于uniapp+uview2.0实现表单常见属性校验处理,使用到组件有u–form、Form-item,基本使用说明如下:      u–form 此组件一般是用于表单验证使用,每一个表单域由一个u-form-item组成,表单域中可以放置u-input、u-checkbox、u-radio、u-switch等。 在表

    2023年04月11日
    浏览(28)
  • 【UniApp开发小程序】项目创建+整合UI组件(FirstUI和uView)

    下图为初始化的项目的文件结构 俗话说:“工欲善其事,必先利其器”,为了更加方便地开发出页面较为美观的小程序,我们先引入成熟的UI组件,再开始开发之旅。(如果你是前端高手,也可以选择手写样式,冲!!!) npm安装 首先动动小手打开终端 输入一下命令,安装

    2024年02月17日
    浏览(43)
  • uniapp 给自定义组件或uview等ui组件加class样式或修改样式在微信小程序不生效的情况

    首先不论是自定义组件还是ui组件,本质上的原因都是微信小程序默认的组件隔离策略导致的。 微信小程序组件隔离文档参考 1.在原有class上修改样式 比如我在uview radio 单选组件的原有class(.u-radio ) ,修改样式出现不生效的情况 解决: 加上 ::v-deep 即可 2.增加class 比如我在

    2024年02月02日
    浏览(51)
  • 【Uni-App】uniapp使用uview实现弹出键盘输入密码/验证码功能

    组件使用的是uview组件,Keyboard 键盘和MessageInput 验证码输入两个组件配合使用。 通过mode参数定义键盘的类型,v-model绑定一个值为布尔值的变量,我绑定的是showKeyboard变量,控制键盘的弹出与收起; mode = number (默认值)为数字键盘,此时顶部工具条中间的提示文字为\\\"数字键盘

    2023年04月16日
    浏览(39)
  • uniapp+uview2.0+vuex实现自定义tabbar组件

    效果图 1.在components文件夹中新建MyTabbar组件 2.组件代码 3.父组件 4.创建store目录,下面创建index.js文件

    2024年02月04日
    浏览(35)
  • Vue + Element ui 实现动态表单,包括新增行/删除行/动态表单验证/提交功能

    原创/朱季谦 最近通过Vue + Element ui实现了动态表单功能,该功能还包括了动态表单新增行、删除行、动态表单验证、动态表单提交功能,趁热打铁,将开发心得记录下来,方便以后再遇到类似功能时,直接拿来应用。 简化的页面效果图如下: 最开始,我是用了纯粹的表格形

    2024年02月04日
    浏览(37)
  • uniapp uview微信小程序重置表单resetFields不生效

    1. 问题描述 uniapp + uview点击重置按钮,重置不生效 2. 解决 不生效原因未知,但我们可以模拟重置。 先将表单中的绑定的数据置空,然后把校验结果置空就可以了

    2024年02月16日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包