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

2024-08-20 20:28

本文主要是介绍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>

注意事项

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

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

这篇关于uniapp/vue如何实现一个子表单及子表单作用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1091096

相关文章

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动