uniapp之 动态form

本文介绍了uni-app中uni-forms组件的使用方法,包括uni-forms-item和uni-easyinput组件的结合,用于创建表单并进行数据绑定。同时,展示了如何设置表单验证规则,如必填项和长度限制,以及如何通过uni-forms的submit方法提交表单数据。在提交表单后,进行了数据处理和API调用,用于更新或保存表单信息。
摘要由CSDN通过智能技术生成
<template>
	<view>
		<uni-forms ref="form1" :rules="rules1" :value="formData1">
			<uni-forms-item label="标题" name="instTitle" required>
				<uni-easyinput type="text" v-model="formData1.instTitle" placeholder="请输入标题" />
			</uni-forms-item>
			<uni-forms-item label="描述" name="instDesc" required>
				<uni-easyinput type="text" v-model="formData1.instDesc" placeholder="请输入描述" />
			</uni-forms-item>
		</uni-forms>
		<uni-forms ref="form" :rules="rules" :value="formData">
			<view v-for="(item, index) in fromJson" :key="index">
				<uni-forms-item :label="item.name" :name="item.field" :required='item.require'>
					<uni-easyinput type="text" v-model="formData[item.field]" v-if="item.formType == 0" :placeholder="item.placeholder || '请输入'+item.name" />
					<uni-easyinput type="textarea" v-model="formData[item.field]" v-else :placeholder="item.placeholder || '请输入'+item.name" />
				</uni-forms-item>
			</view>
			<button v-if="hidden!=2" type="primary" @click="submit">确定</button>
		</uni-forms>
	</view>

</template>

<script>
	import {
		getNewFormJsonString,
		getNewAnnexJsonString,
		getNewAnnexJsonNull
	} from '@/common/formJson.js'
	import {
		uniForms,
		uniFormsItem,
		uniEasyinput
	} from '@dcloudio/uni-ui'
	export default {
		components: {
			uniForms,
			uniFormsItem,
			uniEasyinput
		},
		data() {
			return {
				itemData: [],
				hidden: null,
				fromJson: [],
				annexJson: [],
				versionNumber: null,
				columnCode:null,
				id: null,
				formData1: {
					instTitle: '',
					instDesc: ''
				},
				formData: {},
				rules: {},
				rules1: {
					instTitle: {
						rules: [{
							required: true,
							errorMessage: '请输入',
						}, {
							maxLength: 50,
							minLength: 1,
							errorMessage: '请输入少于五十个字符'
						}]
					},
					instDesc: {
						rules: [{
							required: true,
							errorMessage: '请输入',
						}, {
							maxLength: 50,
							minLength: 1,
							errorMessage: '请输入少于五十个字符'
						}]
					}
				}
			}
		},
		onLoad(e) {
			this.columnCode = e.flowCode
			if (e.a) {
				this.hidden = e.a
				this.itemData = JSON.parse(e.item)
				this.fromJson = JSON.parse(this.itemData.formJson)
				this.annexJson = this.itemData.annexJson
				this.id = this.itemData.id
				this.versionNumber = this.itemData.versionNumber
				this.formData1.instDesc = this.itemData.instDesc
				this.formData1.instTitle = this.itemData.instTitle
				this.rulesData(this.fromJson)
			} else {
				this.getData();
			}
		},
		methods: {
			getData() {
				var params = {
					flowCode: this.columnCode
				}
				this.config.getRequest('/flow/inst/getBaseFlow', params).then(res => {
					if (res.data.code == 0) {
						this.fromJson = JSON.parse(res.data.data.fromJson)
						var fromJson = JSON.parse(res.data.data.fromJson)
						this.$nextTick(()=>{
							this.rulesData(fromJson)
						})
						
						this.annexJson = res.data.data.annexJson
						this.versionNumber = res.data.data.versionNumber
					} else {

					}
					
				}).catch(err => {});
			},
			submit() {
				this.$refs.form1.submit().then(res => {
					console.log('表单数据信息:', res);
					
					this.$refs.form.submit().then(resdata => {
						console.log('表单数据信息111:', resdata);
						var that = this	
						if (that.hidden) {
							var obj = getNewFormJsonString(that.fromJson, that.$refs.form.value)
							var params = {
								flowCode: that.columnCode,
								versionNumber: that.versionNumber,
								annexJson: that.annexJson,
								formJson: obj,
								instTitle: that.formData1.instTitle,
								instDesc: that.formData1.instDesc,
								id: that.id
							}
							that.config.postRequest('/flow/inst/update', params).then(res => {
								if (res.data.code == 0) {
										let pages = getCurrentPages(); // 当前页面
										let beforePage = pages[pages.length - 2]; // 前一个页面
										uni.navigateBack({
											success: function() { 
												beforePage.$refs.one[0].pageNo=1
												beforePage.$refs.one[0].getData(); // 执行前一个页面的onLoad方法
												console.log(beforePage)
											}
										});
								} else {
					
								}
							}).catch(err => {});
							
						} else {
							var obj = getNewFormJsonString(that.fromJson, resdata)
							var params = {
								flowCode: that.columnCode,
								versionNumber: that.versionNumber,
								annexJson: that.annexJson,
								formJson: obj,
								instTitle: that.formData1.instTitle,
								instDesc: that.formData1.instDesc
							}
							that.config.postRequest('/flow/inst/save', params).then(res => {
								if (res.data.code == 0) {
									let pages = getCurrentPages(); // 当前页面
									let beforePage = pages[pages.length - 2]; // 前一个页面
									uni.navigateBack({
										success: function() {
											beforePage.$refs.one[0].pageNo=1
											beforePage.$refs.one[0].getData(); // 执行前一个页面的onLoad方法
											console.log(beforePage)
										}
									});
								} else {
					
								}
							}).catch(err => {});
						}
					
						
					}).catch(err => {
						console.log('表单错误信息:', err);
					})
				}).catch(err => {
					console.log('表单错误信息:', err);
					
				})
				
				
			},
			rulesData(fromJson){
				console.log(fromJson)
				let myRules={};
				let myFormData={};
				for (var i in fromJson) {
					var field = fromJson[i].field
					myFormData["" + field + ""] = fromJson[i].val || ''
					var requireStr = fromJson[i].require
					
					
					
					var rulesArr = []
					
					//必填验证 添加规则
					if(requireStr==true || requireStr=='true'){
						var rulesFieldObj = {}
						rulesFieldObj.required = fromJson[i].require
						rulesFieldObj.errorMessage = '请输入'
						rulesArr.push(rulesFieldObj)
						
						//添加其他验证 扩展部分
						
						myRules[field]={rules:[]}
						myRules[field].rules=rulesArr;
						
					}else{
						continue
						//结束本次循环,进入下次循环
					}
					
				}
			
			
				
			this.rules=myRules;
			this.formData=myFormData;
			}
		}
	}
</script>

<style>
	page {
		background: #FFFFFF;
	}

	/* 将三个内容view的display设置为none(隐藏) */
	.end-title {
		display: flex;
		height: 90upx;
		align-items: center;
		font-size: 34upx;
		background: #FFFFFF;

	}

	.end-title view {
		flex-grow: 1;
		text-align: center;
		padding: 10upx 0;

		/* margin-bottom: 10upx; */
	}

	.end-cont {
		display: none;
	}

	.btna {
		color: #FFFFFF;
		background: #00A0FF;
		line-height: 70upx;
	}

	.dis {
		display: block;
	}

	.uni-swiper-tab {
		border-bottom: 1upx solid #EEEEEE;
		background-color: #FFFFFF;
		display: flex;
		height: 90upx;
		align-content: space-between;
	}

	.swiper-tab-list {
		color: #969696;
		font-weight: bold;
		font-size: 34upx;
		text-align: center;
	}

	.uni-tab-bar .active {
		color: #343434;
	}

	.active .swiper-tab-line {
		border-bottom: 6upx solid #FEDE33;
		/* width: 70upx; */
		margin: auto;
		border-top: 6upx solid #FEDE33;
		border-radius: 20upx;
	}
</style>

### 动态添加表单元素 在 UniApp 中实现动态添加 `form` 表单项可以通过 Vue 的响应式数据绑定特性来完成。具体来说,通过维护一个数组用于存储表单项的数据,并利用循环渲染机制展示这些项。当需要新增或删除表单项时,则相应地修改该数组即可。 对于具体的实现方式,可以采用 `v-for` 指令遍历列表并创建多个相同的输入框或其他类型的控件[^1]。同时,为了确保每次更新都能被视图层捕捉到变化,应当遵循 Vue 对于数组变更方法的最佳实践[^4]。 以下是基于上述原理的一个简单例子: ```html <template> <view class="container"> <!-- 使用 v-for 渲染表单项 --> <u-form ref="dynamicForm" :model="formData" label-width="auto"> <block v-for="(item, index) in formData.items" :key="index"> <u-form-item :label="'Item ' + (index + 1)"> <input type="text" v-model="item.value"/> </u-form-item> <!-- 移除当前项按钮 --> <button @click.prevent="removeFormItem(index)">Remove</button> </block> <!-- 添加新项按钮 --> <button @click.prevent="addFormItem">Add Item</button> <!-- 提交表单按钮 --> <button size="mini" @click.prevent="submitForm()">Submit</button> </u-form> </view> </template> <script> export default { data() { return { formData: { items: [] } }; }, methods: { addFormItem() { this.formData.items.push({ value: '' }); }, removeFormItem(idx) { if(this.formData.items.length > 0){ this.formData.items.splice(idx, 1); } }, submitForm(){ console.log('Submitting form with values:', JSON.stringify(this.formData)); } } }; </script> ``` 此代码片段展示了如何在一个页面内定义一组可变数量的文本输入字段,并提供了增加和减少这些字段的功能。每当点击 “Add Item” 或者 “Remove” 按钮时,都会触发相应的函数去改变 `formData.items` 数组的状态,进而引起界面的变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jiojio冲冲冲

能帮助你是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值