vue3 +element动态表单实现

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

可以直接复制,接口看后端
父页面

	<schedules
					ref="schedulesRef"
					:dxbz="props.dxbz"
					:jdlx="props.jdlx"
					:woId="myWoId"
					:addendumList="formInline.addendumList"
					v-if="addendumShow"
					@addendum="addendum"
				></schedules>


ts
//定义附表显示隐藏属性
const addendumShow = ref(false);
const addendum = (val: any) => {
	formInline.value.addendumList = val;
};
保存操作
save(){
	//接收附表信息
		let scedulesData = schedulesRef.value.getScedulesData();
		//获取附表Id值和附表值
		const controlIds = scedulesData.data.map((item: any) => {
			return {
				controlId: item.controlId,
				controlValue: item.controlValue ? item.controlValue.toString() : ""
			};
		});
		//赋值附表信息
		formInline.value.addendumList = controlIds || [];
		//赋值附表校验信息
		formInline.value.schedulesCheck = scedulesData.check;
}

子页面文章来源地址https://www.toymoban.com/news/detail-616780.html

<!-- 自定义附表 -->
<template>
	<div>
		<el-form
			:inline="true"
			:model="modelItems"
			:rules="rules"
			ref="ruleFormRef"
			:disabled="fbDisabled || route.query.isDisabled"
			label-width="130"
		>
			<el-row>
				<el-col :span="item.controlLayout == 'T2' ? 24 : 12" v-for="(item, index) in infoList" :key="index">
					<el-form-item :label="item.controlName" :prop="item.controlId">
						<el-input
							v-model="item.controlValue"
							placeholder="请输入"
							:required="item.required == 'Y'"
							v-if="item.controlLayout == 'T1' || item.controlLayout == 'N1' || item.controlLayout == 'N2'"
						></el-input>
						<el-input
							v-model="item.controlValue"
							:required="item.required == 'Y'"
							placeholder="请输入"
							v-if="item.controlLayout == 'T2'"
							type="textarea"
						></el-input>
						<el-select
							:required="item.required == 'Y'"
							v-model="item.controlValue"
							style="width: 100%"
							placeholder="请选择"
							v-if="item.controlLayout == 'S1'"
						>
							<el-option v-for="item1 in item.optionItem" :key="item1.value" :label="item1.label" :value="item1.value" />
						</el-select>
						<el-select
							multiple
							:required="item.required == 'Y'"
							v-model="item.controlValue"
							style="width: 100%"
							placeholder="请选择"
							v-if="item.controlLayout == 'S2'"
						>
							<el-option v-for="item1 in item.optionItem" :key="item1.value" :label="item1.label" :value="item1.value" />
						</el-select>
						<el-date-picker
							:required="item.required == 'Y'"
							v-model="item.controlValue"
							format="YYYY-MM-DD"
							value-format="YYYY-MM-DD"
							type="date"
							placeholder="请选择"
							v-if="item.controlLayout == 'D1'"
						/>
						<el-time-picker
							:required="item.required == 'Y'"
							v-model="item.controlValue"
							format="HH:mm:ss"
							value-format="HH:mm:ss"
							placeholder="请选择"
							v-if="item.controlLayout == 'D2'"
						/>
						<el-date-picker
							:required="item.required == 'Y'"
							v-model="item.controlValue"
							format="YYYY-MM-DD HH:mm:ss"
							value-format="YYYY-MM-DD HH:mm:ss"
							type="datetime"
							placeholder="请选择"
							v-if="item.controlLayout == 'D3'"
						/>
					</el-form-item>
				</el-col>
			</el-row>
		</el-form>
	</div>
</template>
<script setup lang="ts">
import { loadConfDetail } from "@/api/interface/workManage/index";
import { loadAddendumConfDetail } from "@/api/modules/workManage/indexApi";
import type { FormInstance, FormRules } from "element-plus";
const route = useRoute();
//动态表单model
const modelItems = ref({} as any);
//定义自定义表单数据
const infoList = ref<loadConfDetail[]>([]);
//工单id
const woId = ref("");
//接收父组件的值
interface Props {
	dxbz?: string;
	addendumList: any;
	jdlx?: string;
	woId?: string;
}
const props = defineProps<Props>();
const fbDisabled = ref(false);
//读写标志为只读或者接单类型为一线工程师时,表单不可编辑
if (props.dxbz == "0" || props.jdlx == "1") {
	fbDisabled.value = true;
}
//下拉框数据
interface options {
	label: string;
	value: string;
}
const ruleFormRef = ref<FormInstance>();
const rules = reactive<FormRules>({
	controlValue: [{ required: true, message: "请输入", trigger: ["blur", "change"] }]
});
const emit = defineEmits(["addendum"]);
//表单数据实现方法
const getInfo = () => {
	loadAddendumConfDetail(woId.value || props.woId).then(res => {
		const data = res.data || [];
		//将数据转换成表单需要的格式
		data.forEach((item: loadConfDetail) => {
			item.controlValue = "";
			//下拉数据传成数组显示到页面
			if (item.controlLayout == "S1" || item.controlLayout == "S2") {
				let arr: options[] = [];
				item.options.split(",").forEach((index: string) => {
					arr.push({ label: index, value: index });
				});
				item.optionItem = arr;
			}
			//如果是必填项,加入校验规则
			if (item.required == "Y") {
				rules[item.controlId] = [{ required: true, message: "", trigger: ["blur", "change"] }];
			}
		});
		infoList.value = data;
		emit("addendum", infoList.value);
		let addendumList = props.addendumList;
		//将附表数据赋值到表单
		infoList.value.forEach(e => {
			//如果是下拉框,将下拉框的值转换成数组
			let arr = (addendumList || []).filter((i: any) => i.controlId == e.controlId);
			if (arr.length > 0) {
				if (e.controlLayout == "S2") {
					if (arr[0].controlValue != "" && arr[0].controlValue.length > 0) {
						e.controlValue = (arr[0].controlValue || "").split(",");
					} else {
						e.controlValue = [];
					}
				} else {
					e.controlValue = arr[0].controlValue;
				}
			}
		});
	});
};
getInfo();
//校验是否有必填项未填
const checkFun = () => {
	let l = infoList.value.filter(item => item.required == "Y" && (!item.controlValue || item.controlValue == ""));
	return l.length > 0;
};
//表单数据方法暴露给父组件
const getScedulesData = () => {
	return { data: infoList.value, check: checkFun() };
};
defineExpose({
	getScedulesData
});
</script>

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

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

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

相关文章

  • Element+Vue实现动态表单(多个下拉框组件)

    表单的内容为巡检计划,巡检计划可以选择多个巡检点位,每个巡检点位可以选择多个设备和对应操作。 点击加号图标增加一个下拉框 减号图标删除对应下拉框 下拉框备选项目相同 点击设置动作按钮,弹出可编辑表格,可以为该巡检点位设置多个动作 表格每行内容可编 设

    2024年02月15日
    浏览(30)
  • VUE element-ui实现表格动态展示、动态删减列、动态排序、动态搜索条件配置、表单组件化。

        1、本组件支持列表的表头自定义配置,checkbox实现 2、本组件支持列表列排序,vuedraggable是拖拽插件,上图中字段管理里的拖拽效果 ,需要的话请自行npm install 3、本组件支持查询条件动态配置,穿梭框实现 https://download.csdn.net/download/askuld/88216937

    2024年01月16日
    浏览(48)
  • vue+Element UI 实现动态表单(点击按钮增删表格及嵌套输入框的增删)(1)

    el-button size=“small” @click=“addTable”新增 el-button size=“small” @click=“delTable”删除 el-table ref=“table” :data=“tableDataBind.taAssessltems” tooltip-effect=“dark” border @selection-change=“selectRow” 规格: 重量: 数量: 加工费: el-button size=“mini” type=“primary” icon=“el-icon-circle-plus-ou

    2024年04月13日
    浏览(35)
  • vue3+element Plus实现表格前端分页

    每一处都写了注释,还是很容易看懂的  

    2024年02月11日
    浏览(42)
  • (二) Vue3 + Element-Plus 实现动态菜单栏

    系列介绍:Vue3 + Vite + TS 从零开始学习 项目搭建:(一) Vue3 + Vite + TS 项目搭建 实现动态菜单栏:(二) Vue3 + Element-Plus 实现动态菜单栏 实现动态面包屑:(三) Vue3 + Element-Plus 实现动态面包屑 实现动态标签页:(四) Vue3 + Element-Plus 实现动态标签页 实现动态主题色切换(demo):(五)

    2023年04月23日
    浏览(42)
  • 基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十一:通用表单组件封装实现

      本章实现通用表单组件,根据实体配置识别实体属性,并自动生成编辑组件,实现对应数据填充、校验及保存等逻辑。 1. 详细课程地址: https://edu.csdn.net/course/detail/38183 2. 源码下载地址: 点击下载

    2024年02月10日
    浏览(38)
  • 前端vue3+element plus 分页table排序功能实现

    我有如下所示的一个table,数据data是一个computed计算属性,一般情况下筛选使用element的sortable属性就可以了,可查看Element - The world\\\'s most popular Vue UI framework 但我的 table 是一个分页的 table ,当我使用 sortable 时发现,它只是对当前页的数据进行排序,但这并不是我需要的,我的

    2024年02月14日
    浏览(37)
  • vue3使用el-form实现登录、注册功能,且进行表单验证(Element Plus中的el-form)

    简介:Element Plus 中的 el-form 是一个表单组件,用于快速构建表单并进行数据校验。它提供了丰富的表单元素和验证规则,使表单开发变得更加简单和高效。可以搭配el-dialog实现当前页面的登录、注册页 ,这两天在vue3中用到了表单登录,特意记录一下,这里没有封装,直接使

    2024年02月07日
    浏览(43)
  • vue element 动态生成表单

    场景:表单中的项是由后端返回的,不是前端提前定义好的。 需要注意的点: 1、因为表单上需要绑定v-model来获取此表单项的值,但是要绑的值名称是根据后端数据来的,所以请求回来后端的数据后再渲染整个表单,否则会报错【v-if=\\\"configLabelData\\\"】,根据请求到的后端数据

    2024年02月16日
    浏览(76)
  • Vue3 + Element Plus 实现动态标签页及右键菜单

    目录 先上图  使用el-dropdown绑定右键菜单,为每个tab页绑定一个右键 右键菜单生效后控制每个下拉项的禁用与显示(每一项代表一个功能) 每个右键项对应的功能  控制每次只显示一个右键 完整代码         只有首页的情况         多个tab页的情况  

    2024年02月07日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包