vue2+elementui,动态生成的表单校验

话不多,先上一段视频,看看是不是你们需要的效果 

elementui动态生成表单校验

附上代码

<template>
	<div class="home">
		<div class="home-box">
			<!-- <menuHtml></menuHtml> -->
			<div class="home-div">
				<div style="margin-top: 20px;display:flex;justify-content: space-between;">
					<div>
						<span class="blueBlock">&nbsp;</span>
						<span class="title">问卷编辑</span>
					</div>
					<div>
						<span style="color:#F56C6C;">问卷编辑完成,千万不要忘记点击保存哦<i class="el-icon-thumb"
								style="transform: rotate(90deg);"></i></span>
						<el-button type="primary" plain size="mini" icon="el-icon-s-claim"
							@click="save('form')">保存</el-button>
					</div>
				</div>
				<el-form abel-position='top' :model="form" ref="form">
					<div class="content">
						<div class="content-top">
							<el-form-item prop="title" :rules="{required: true, message: '  ', trigger: 'blur' }">
								<el-input size="small" v-model="form.title" placeholder="请输入问卷标题">
									<el-button slot="append" @click="addQuestion()" icon="el-icon-circle-plus-outline">
										添加问题
									</el-button>
								</el-input>
							</el-form-item>
						</div>
						<div class="content-box">
							<div class="content-center" v-for="(question,index) in form.questionList">
								<el-form-item>
									<el-radio v-model="question.type" :label="1">单选</el-radio>
									<el-radio v-model="question.type" :label="2">多选</el-radio>
									<el-radio v-model="question.type" :label="3">开放式问题</el-radio>
								</el-form-item>
								<el-form-item class="question" :prop="'questionList.'+index+'.name'"
									:rules="{required: true, message: '', trigger: 'blur' }">
									<el-input placeholder="请输入问题" size="small" v-model="question.name">
										<template slot="prepend">Q{{index+1}}.</template>
									</el-input>
									<div @click="delQuestion(index)">
										<i class="el-icon-delete-solid"></i>
										<span>删除</span>
									</div>
								</el-form-item>
								<el-form-item v-if="question.type==3" :prop="'questionList.'+index+'.answer2'"
									:rules="{required: true, message: '  ', trigger: 'blur' }">
									<el-input type="textarea" :rows="4" placeholder="请输入答案" v-model="question.answer2"
										resize="none"></el-input>
								</el-form-item>
								<el-form-item v-else>
									<div class="answer" v-for="(answer,index1) in question.answerList">
										<el-form-item :prop="'questionList.'+index+'.answerList.'+index1+'.name'" :rules="{required: true, message: '  ', trigger: 'blur' }">
											<el-input size="small" placeholder="请输入答案" v-model="answer.name">
												<template slot="prepend">{{chars[index1]}}.</template>
											</el-input>
										</el-form-item>
										<div class="answer-right">
											<el-button @click="delAnswer(index,index1,question)" size="mini"
												icon="el-icon-minus" circle type="danger" plain></el-button>
											<el-button v-if="question.answerList.length==index1+1"
												@click="addAnswer(index,index1)" size="mini" icon="el-icon-plus" circle
												type="primary" plain></el-button>
										</div>
									</div>

								</el-form-item>
								<el-form-item label="正确答案" v-if="question.type==1" 
								 :prop="'questionList.'+index+'.answer'" :rules="{required: true, message: '  ', trigger: 'blur' }">
									<el-select size="mini" v-model="question.answer" placeholder="请选择答案">
										<el-option v-for="(item,index2) in question.answerList" :key="index2"
											:label="chars[index2]" :value="index2">
										</el-option>
									</el-select>

								</el-form-item>
								<el-form-item label="正确答案" v-if="question.type==2"
								:prop="'questionList.'+index+'.answer1'" :rules="{required: true, message: '  ', trigger: 'blur' }">
									<el-select size="mini" multiple v-model="question.answer1" placeholder="请选择答案">
										<el-option v-for="(item,index2) in question.answerList" :key="index2"
											:label="chars[index2]" :value="index2">
										</el-option>
									</el-select>
								</el-form-item>


							</div>
						</div>
					</div>
				</el-form>
			</div>

		</div>
	</div>
</template>

<script>
	// import menuHtml from '../../../view/leaf-content/menuHtml.vue'
	export default {
		name: 'addWjByTeacher',
		components: {
			// menuHtml,
		},
		props: [],
		data() {
			return {
				chars: ['A', 'B', 'C', 'D'],
				form: {
					title: '',
					// questionList: [],
					questionList: [{
						type: 1, //1.单选,2:多选,3开放式问题
						questionTitle: '',
						answerList: [{}],
						answer: '', //单选答案
						answer1: [], //多选答案
						answer2: '', //开放式问题答案
					}, {
						type: 2, //1.单选,2:多选,3开放式问题
						questionTitle: '',
						answerList: [{}],
						answer: '',
						answer1: [],
						answer2: '',
					}, {
						type: 3, //1.单选,2:多选,3开放式问题
						questionTitle: '',
						answerList: [{}],
						answer: '',
						answer1: [],
						answer2: '',
					}],
				}
			}

		},
		methods: {
			addQuestion() { //添加问题
				this.form.questionList.push({
					type: 1, //1.单选,2:多选,3开放式问题
					questionTitle: '',
					answerList: [{}],
					answer: '',
				});
			},
			delQuestion(index) { //删除问题
				this.form.questionList.splice(index, 1);
			},
			addAnswer(questionIndex, answerIndex) { //添加答案
				console.log(answerIndex);
				if (answerIndex < 3) {
					this.form.questionList[questionIndex].answerList.push({});
				}
			},
			delAnswer(questionIndex, answerIndex, question) { //删除答案
				if (answerIndex >= 1) {
					this.form.questionList[questionIndex].answerList.splice(answerIndex, 1);
				}
				//判断单选还是多选,要一同清空掉答案
				if (question.type == 1) {
					// this.form.questionList[questionIndex].answerList
					question.answer = "";
				} else if (question.type == 2) {
					question.answer1 = "";
				}
			},
			save(formName) { //保存问题
				this.$refs[formName].validate((valid) => {
					if (valid) {
						alert('submit!');
					} else {
						console.log('error submit!!');
						return false;
					}
				});
			},
		},
		mounted() {

		},
		destroyed() {

		},
		created() {

		}

	}
</script>

<style scoped>
	@import '../../../../assets/css/screenBase.css';

	.home {
		margin-top: 100px;
	}

	.home-box {
		margin: 0 auto;
		display: flex;
		align-items: flex-start;
		width: 1000px;
		justify-content: center
	}

	.home-div {
		width: 1000px;
		height: 650px;
		background-color: #fff;
		border-radius: 10px;
		/* 	padding-top: 20px; */
		padding-right: 40px;
		padding-left: 40px;

		/* padding-bottom: 20px; */
	}

	.blueBlock {
		height: 8px;
		width: 2px;
		background-color: #226cd3;
		margin-right: 10px;
	}

	.title {
		font-weight: 600;
		font-size: 24px;
	}

	.content {
		display: flex;
		flex-direction: column;
		align-items: flex-start;
		width: 900px;

	}

	.el-form-item {
		margin-bottom: 0px;
	}

	.content-top {

		margin-top: 20px;
		display: flex;
	}

	.content-top /deep/ input {
		width: 800px;
	}

	.content-center {
		width: 880px;
		background-color: #e9f5f136;
		border-radius: 10px;
		margin-top: 5px;
		padding: 10px;
		box-shadow: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04);
	}

	.content-box {
		/* margin-top: 20px; */
		padding: 5px;
		height: 500px;
		overflow: hidden;
		overflow-y: auto;

	}

	/deep/.el-form--label-top .el-form-item__label {
		padding: 0px;
	}

	.btn {
		margin-top: 40px;
		text-align: center;
	}

	.question {}

	.question /deep/.el-form-item__content {
		display: flex;
		align-items: flex-start;
		justify-content: flex-start;
	}

	/* .answer /deep/.el-form-item__content {
		display: flex;
		align-items: flex-start;
		justify-content: flex-start;
		width: 750px;
	} */

	.question /deep/ input {
		width: 550px;
	}

	.question div {
		width: 100px;
		text-align: center;
	}

	.question i {
		color: #F56C6C;
		margin-right: 5px;
	}

	.answer /deep/ .el-input-group--prepend {
		width: 500px;
	}

	.answer /deep/ .el-input__inner {
		width: 500px;
	}

	.answer-right {
		width: 100px;
		display: flex;
		align-items: flex-start;
		/* text-align: center; */
	}

	.answer-right span {
		width: 25px;
		height: 25px;
		line-height: 25px;
		text-align: center;
		display: inline-block;
		background: #FFFFFF;
		border-radius: 8px;
		border: 1px solid #CCD3E7;

	}

	.answer-right i {
		color: #000;
		font-weight: 600;
	}

	.answer {
		display: flex;
		align-items: center;
	}
</style>

最主要的地方,因为我是双层的循环遍历,先看第一层的注意地方

最最最最最最最主要的地方,这是第二层的地方

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/686470.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 存储过程(二)

本篇继续介绍MySQL存储过程的相关内容。 目录 一、if语句 二、case 三、循环语句 while loop repeat 一、if语句 在存储过程中&#xff0c;可以使用if语句进行条件判断&#xff0c;其语法结构如下&#xff1a; if 判断语句 then 逻辑语句..... elseif 判断语句 then 逻…

JavaScript入门宝典:核心知识全攻略(上)

文章目录 前言一、JavaScript的定义二、JavaScript的使用方式1. 行内式&#xff08;主要用于事件&#xff09;2. 内嵌式3. 外链式 三、变量和数据类型1. 定义变量2. JavaScript注释3. 数据类型4. 变量命名规范5. 匈牙利命名风格 四、函数定义和调用1. 函数定义2. 函数调用3. 定…

ctfshow-web入门-命令执行(web30-web36)

目录 1、web30 2、web31 3、web32 4、web33 5、web34 6、web35 7、web36 命令执行&#xff0c;需要严格的过滤 1、web30 代码差不多&#xff0c;就是过滤的东西变多了&#xff1a; preg_match("/flag|system|php/i", $c) 这里不让用 system &#xff0c;我们…

宝贝,带上WebAssembly,换个姿势来优化你的前端应用

❝ 在你没崛起之前&#xff0c;脸是用来丢的 ❞ 大家好&#xff0c;我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder ❝ 此篇文章所涉及到的技术有 WebAssembly Rust Web Worker( comlink) wasm-pack Photon ffmpeg.wasm 脚手架生成前端项目 ❞ 因为&…

Yolo-v5模型训练速度,与GeForce的AI算力描述

1.GeForce RTX3070 Ti官网参数&#xff1a; GeForce RTXTM 3070 Ti 和 RTX 3070 显卡采用第 2 代 NVIDIA RTX 架构 - NVIDIA Ampere 架构。该系列产品搭载专用的第 2 代 RT Core &#xff0c;第 3 代 Tensor Core、全新的 SM 多单元流处理器以及高速显存&#xff0c;助您在高性…

Hi3519DV500 学习摘录

文章目录 一、问题1、autoreconf2、open-vm-tools 安装3、NFS4、pushd: not found 一、问题 1、autoreconf automake version mismatch | AM_INIT_AUTOMAKE | 版本不匹配 autoreconf ./configure make2、open-vm-tools 安装 open-vm-tools 安装 # 用于安装和升级的命令是相…

Codeforces Round 951 (Div. 2) C、D(构造、线段树)

1979C - Earning on Bets 构造题&#xff1a;观察到k范围很小&#xff0c;首先考虑最终硬币总数可以是多少&#xff0c;我们可以先假设最终的硬币总数为所有k取值的最小公倍数&#xff0c;这样只需要满足每个结果添加1枚硬币即可赚到硬币。 // Problem: C. Earning on Bets //…

​​​​【动手学深度学习】残差网络(ResNet)的研究详情

目录 &#x1f30a;1. 研究目的 &#x1f30a;2. 研究准备 &#x1f30a;3. 研究内容 &#x1f30d;3.1 残差网络 &#x1f30d;3.2 练习 &#x1f30a;4. 研究体会 &#x1f30a;1. 研究目的 了解残差网络&#xff08;ResNet&#xff09;的原理和架构&#xff1b;探究残…

【Vue】声明式导航-导航链接

文章目录 一、引入二、解决方案三、代码示例四、声明式导航-两个类名1&#xff09;router-link-active2&#xff09;router-link-exact-active 一、引入 但凡说到声明式导航&#xff0c;都需要想到router-link 需求 实现导航高亮效果 如果使用a标签进行跳转的话&#xff0c;需要…

JSONPath使用指南(掌握JSON数据提取)

大家好&#xff0c;在处理 JSON&#xff08;JavaScript Object Notation&#xff09;数据时&#xff0c;有时需要从复杂的结构中提取特定部分。JSONPath 就是一个非常有用的工具&#xff0c;它提供了一种简洁而强大的方式来定位和提取 JSON 数据中的元素。无论是在 Web 开发中处…

【C++ | 析构函数】类的析构函数详解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-06-06 1…

上海亚商投顾:微盘股指数大跌超6% 全市场仅500余只个股上涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡调整&#xff0c;创业板指午后一度跌超1%&#xff0c;微盘股指数盘中跌逾7%&#xff0c;小市值个…

YOLO系列模型 pt文件转化为ONNX导出

文章目录 啥是onnx怎么导出导出之后 啥是onnx Microsoft 和合作伙伴社区创建了 ONNX 作为表示机器学习模型的开放标准。许多框架&#xff08;包括 TensorFlow、PyTorch、scikit-learn、Keras、Chainer、MXNet 和 MATLAB&#xff09;的模型都可以导出或转换为标准 ONNX 格式。 在…

09.0手工制作docker镜像-单服务ssh

手动将容器保存为镜像-单服务ssh 本页测试内容&#xff0c;将centos6.9镜像安装ssh服务并提交新的镜像并可使用。 docker commit 容器id或者容器的名字 新的镜像名字[:版本号可选] docker commit test centos6.9-ssh:v11&#xff09;基于容器制作镜像&#xff0c;首先创建一个…

DP:子序列模型

子数组vs子数列 1、子数组&#xff08;n^2&#xff09; 子序列(2^n) 2、子数组是子序列的一个子集 3、子数组必须连续&#xff0c;子序列可以不连续 一、最长递增子序列 . - 力扣&#xff08;LeetCode&#xff09; 算法原理&#xff1a; 1、状态表示&#xff…

使用命令给电脑添加虚拟网卡和IP

目录 1、添加网卡 1-1、windows系统添加网卡 1-2、Linux系统中添加网卡 2、添加IP和DNS 2-1、添加IP 2-2、 设置DNS 3、删除网卡 3-1、Windows: 3-2、Linux 3-3、macOS 4、示例&#xff1a; 首先以管理员方式进入CMD命令行&#xff1b; 点击“开始”->“管理员…

HLA高层体系结构1.0.0版本

名&#xff1a;高层体系结构&#xff08;High Level Architecture&#xff0c;HLA&#xff09; 高层体系结构&#xff08;High Level Architecture&#xff0c;HLA&#xff09;是从体系结构上建立这样一个框架&#xff0c;它能尽量涵盖M&S领域中所涉及的各种不同类型的仿真…

springboot启动配置文件-bootstrap.yml常用基本配置

4.1.5.配置文件 SpringBoot的配置文件支持多环境配置&#xff0c;基于不同环境有不同配置文件&#xff1a; 说明&#xff1a; 文件说明bootstrap.yml通用配置属性&#xff0c;包含服务名、端口、日志等等各环境通用信息bootstrap-dev.yml线上开发环境配置属性&#xff0c;虚…

微服务开发与实战Day01 - MyBatisPlus

一、微服务 概念&#xff1a;微服务是一种软件架构风格&#xff0c;它是以专注于单一职责的很多小型项目为基础&#xff0c;组合除复杂的大型应用。 课程安排&#xff1a; https://www.bilibili.com/video/BV1S142197x7/?spm_id_from333.1007.top_right_bar_window_history.…

41【Aseprite 作图】粉红宫灯——拆解

1 宫灯轮廓 上面三角&#xff0c;下面3 3 3 &#xff08;粉色在后面&#xff0c;做轮廓&#xff09;&#xff0c;棕色在外面&#xff0c;看做是灯骨&#xff08;竖着更长&#xff09;&#xff1b;中间是横着做灯骨 尾部的彩带&#xff0c;下面粉色更浅&#xff0c;上面绿色更浅…