uniapp/vue如何实现一个子表单及子表单作用

子表单是一个辅助表单或一个表,它允许在主表单中添加多个行式项目,以处理与主记录相关联的多个辅助项目或数据。子表单在多种应用场景中发挥着重要作用,特别是在需要处理一对多关系的数据时。

以下是对子表单的详细解析:

定义与特点

  • 定义:子表单是一个插入到主表单中的表单,用于在主表单中显示与主记录相关联的多个辅助记录或数据项。
  • 特点:
    • 提高表单的灵活性和信息的详细程度。
    • 适用于1:N(一对多)的数据场景。
    • 可以包含多种字段类型,如文本框、日期时间、单选框等。

应用场景

  1. 销售部门:

    • 子表单可用于使联系人详细信息与客户相关联。
    • 在销售订单中,子表单可以记录与主产品相关联的配件信息,如配件名称、价格、数量等。
  2. 人力资源管理:

    • 子表单可用于管理员工的多个联系人信息、工作经历、培训历史等。
    • 在员工信息表单中,子表单可以记录员工的工作经历、培训记录、证书等详细信息。
  3. 财务管理:

    • 在报销表单中,子表单可以详细记录每次报销包含的多个报销项目信息。
  4. 库存管理:

    • 出库单、入库单中的商品明细可以用子表单记录,根据实际需要录入的数据新增条数。

功能与优势

  • 数据录入:支持多种字段类型,方便用户录入复杂数据。
  • 数据管理:可以有效地处理复杂的数据关系,提高数据录入的准确性和效率。
  • 数据联动:当其他表单字段与子表单字段相关时,可以设置联动,实现数据的自动填充。
  • 批量操作:支持子表信息的批量导入和导出,提高数据处理效率。

创建与配置

子表单的创建和配置通常依赖于具体的软件或平台。以下是一些通用的步骤:

选择主表单

首先确定主表单,往主表单拖入相关表单输入字段并设置其属性,如字段类型、名称、是否必填等。

添加子表单

往主表单中添加子表单组件,并设置其属性,如字段类型、名称、是否必填等。

配置子表单

在子表单字段中配置需要显示的辅助记录或数据项,如配件名称、价格、数量等。

扩展样式设置

对整个子表单进行外边距设置、边框、圆角等设置

导出源码

点击保存源码至本地,本地可以快速进行调试子表单效果。

本地开发运行效果

保存源码至本地后,会生成uniapp、vue相关子表单源码,此时我们可以快速看见效果.

操作按钮位置设置

自定义操作按钮

支持自定义扩展按钮,可以根据生成上面点击事件拷贝出来,然后自定义操作按钮事件。

子表单代码生成器举例

<template>
	<view class="container container21094">
		<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" label="标题" prop="input">
				<u-input :focus="formData.inputFocus" placeholder="请输入提示信息" v-model="form.input"></u-input>
			</u-form-item>
			<u-form-item class="diygw-col-24" label="标题" prop="input1">
				<u-input :focus="formData.input1Focus" placeholder="请输入提示信息" v-model="form.input1"></u-input>
			</u-form-item>
			<view class="flex flex-wrap diygw-col-24 subform-clz">
				<view class="diygw-col-24" v-for="(subformItem, subformIndex) in form.subform" :key="subformIndex">
					<u-form class="diygw-col-24" :model="form.subform[subformIndex]" :errorType="['message', 'toast']" ref="subformRef" :rules="subformItemRules">
						<text class="diygw-col-24 text-clz"> 子表单 </text>
						<u-form-item class="diygw-col-24" label="标题" prop="input3">
							<u-input :focus="formData.subformItemDatas[subformIndex].input3Focus" placeholder="请输入提示信息" v-model="subformItem.input3"></u-input>
						</u-form-item>
					</u-form>
					<view class="formsubformtools flex justify-end">
						<button @tap="upSubformItem" :data-index="subformIndex" class="diygw-btn flex-sub radius margin-xs">
							<text class="button-icon diy-icon-fold"></text>
						</button>
						<button @tap="downSubformItem" :data-index="subformIndex" class="diygw-btn flex-sub radius margin-xs">
							<text class="button-icon diy-icon-unfold"></text>
						</button>
						<button @tap="addSubformItem" :data-index="subformIndex" class="diygw-btn flex-sub radius margin-xs">
							<text class="button-icon diy-icon-add"></text>
						</button>
						<button @tap="delSubformItem" :data-index="subformIndex" class="diygw-btn flex-sub radius margin-xs">
							<text class="button-icon diy-icon-close"></text>
						</button>
					</view>
				</view>
				<view class="padding-xs diygw-col-24">
					<button @tap="addSubformItem" class="diygw-btn diygw-col-24 radius" style="background: #07c160; color: #fff">新增</button>
				</view>
			</view>
		</u-form>
		<view class="clearfix"></view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				//用户全局信息
				userInfo: {},
				//页面传参
				globalOption: {},
				//自定义全局变量
				globalData: { logintype: '0', agree: '0' },
				subformItemData: {
					input3Focus: false
				},
				subformItem: {
					input3: ''
				},
				form: {
					input: '',
					input1: '',
					subform: []
				},
				formRules: {},
				subformItemRules: {},
				formData: {
					inputFocus: false,
					input1Focus: false,
					subformItemDatas: []
				}
			};
		},
		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() {
				await this.initResetform();
			}, //初始化显示子表单数据条数
			initSubformData() {
				for (let i = 0; i < 1; i++) {
					this.form.subform.push(JSON.parse(JSON.stringify(this.subformItem)));
					this.formData.subformItemDatas.push(JSON.parse(JSON.stringify(this.subformItemData)));
				}
				this.initSubformValid();
			},
			//子表单验证
			initSubformValid() {
				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.formData.subformItemDatas[index] = this.formData.subformItemDatas.splice(index - 1, 1, this.formData.subformItemDatas[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.formData.subformItemDatas[index] = this.formData.subformItemDatas.splice(index + 1, 1, this.formData.subformItemDatas[index])[0];
				this.initSubformValid();
			},
			//删除子表单
			delSubformItem(evt) {
				let { index } = evt.currentTarget.dataset;
				this.form.subform.splice(index, 1);
				this.formData.subformItemDatas.splice(index, 1);
				this.initSubformValid();
			},
			//增加子表单
			addSubformItem() {
				this.form.subform.push(JSON.parse(JSON.stringify(this.subformItem)));
				this.formData.subformItemDatas.push(JSON.parse(JSON.stringify(this.subformItemData)));
				this.initSubformValid();
			},
			//验证所有的子表单
			checkSubformValid() {
				let flag = true;
				this.$refs['subformRef']?.forEach((subform) => {
					subform.validate((valid) => {
						if (!valid) {
							flag = false;
							return false;
						}
					});
				});
				return flag;
			},
			initResetform() {
				this.initform = JSON.stringify(this.form);
			},
			resetForm() {
				this.form = JSON.parse(this.initform);
			},

			async submitForm(e) {
				this.$refs.formRef?.setRules(this.formRules);

				this.initSubformValid();
				this.$nextTick(async () => {
					let subformvalid = await this.checkSubformValid();
					let valid = await this.$refs.formRef.validate();
					if (valid && subformvalid) {
						//保存数据
						let param = this.form;
						let header = {
							'Content-Type': 'application/json'
						};
						let url = '';
						if (!url) {
							this.showToast('请先配置表单提交地址', 'none');
							return false;
						}

						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>
	.subform-clz {
		margin-left: 10rpx;
		border: 2rpx solid #ac0a0a;
		border-bottom-left-radius: 12rpx;
		overflow: hidden;
		width: calc(100% - 10rpx - 10rpx) !important;
		border-top-left-radius: 12rpx;
		margin-top: 10rpx;
		border-top-right-radius: 12rpx;
		border-bottom-right-radius: 12rpx;
		margin-bottom: 10rpx;
		margin-right: 10rpx;
	}
	.formsubformtools {
		position: absolute;
		z-index: 1;
		right: 0rpx;
		top: 0rpx;
	}
	.formsubformtools .diygw-btn {
		padding: 5px;
		height: auto;
		flex: inherit;
		border-radius: 20px;
	}
	.text-clz {
		margin-left: 10rpx;
		padding-top: 10rpx;
		padding-left: 10rpx;
		width: calc(100% - 10rpx - 10rpx) !important;
		padding-bottom: 10rpx;
		margin-top: 10rpx;
		margin-bottom: 10rpx;
		margin-right: 10rpx;
		padding-right: 10rpx;
	}
	.container21094 {
	}
</style>

注意事项

  • 在使用子表单时,需要注意数据的完整性和准确性,避免出现数据冗余或错误。
  • 根据实际需求合理配置子表单的字段和关联关系,以提高数据处理的效率和准确性。
  • 在进行批量操作时,如批量导入和导出,需要注意数据的格式和顺序,确保数据的正确性和完整性。

综上所述,子表单是一种重要的数据管理工具,能够有效地处理复杂的数据关系和提高数据处理的效率。在实际应用中,需要根据具体需求合理配置和使用子表单。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值