element ui动态生成表单数据与校验(后台传入数据)
前言
最近有一个需求是通过后台返回的数据,生成表单并添加校验。在做的过程中,动态表单挺好做,关键是校验。困扰了我2天,最后通过查找资料和“运气”终于解决了。解决问题关键点:vue的响应式。官方链接:https://cn.vuejs.org/v2/guide/reactivity.html
官方是这样说的:受现代 JavaScript 的限制 (而且 Object.observe 也已经被废弃),Vue 无法检测到对象属性的添加或删除。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化,所以属性必须在 data 对象上存在才能让 Vue 将它转换为响应式的。例如:
var vm = new Vue({
data:{
a:1
}
})
// `vm.a` 是响应式的
vm.b = 2
// `vm.b` 是非响应式的
对于已经创建的实例,Vue 不允许动态添加根级别的响应式属性。但是,可以使用 Vue.set(object, propertyName, value) 方法向嵌套对象添加响应式属性。例如,对于:
Vue.set(vm.someObject, 'b', 2)
您还可以使用 vm.$set 实例方法,这也是全局 Vue.set 方法的别名:
this.$set(this.someObject,'b',2)
有时你可能需要为已有对象赋值多个新属性,比如使用 Object.assign() 或 _.extend()。但是,这样添加到对象上的新属性不会触发更新。在这种情况下,你应该用原对象与要混合进去的对象的属性一起创建一个新的对象。
// 代替 `Object.assign(this.someObject, { a: 1, b: 2 })`
this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })
回到正题
原型一:单层循环生成的表单(简单,没有遇到问题)

1.表单
1 <el-form label-width="140px" :model="goodForm" size="small" style="width: 750px;">
2 <el-col :key="index" :span="12" v-if="!(index%2==0)" v-for="(item,index) in goodForm.specSPUParams">
3 <el-form-item :label="item.k" :prop="'specSPUParams.'+index+'.v'" :rules="[{required: true, message: item.k+'不能为空', trigger: 'blur'}]">
4 <el-input v-model="item.v"></el-input>
5 </el-form-item>
6 </el-col>
7 <el-col :key="index" :span="12" v-if="index%2==0" v-for="(item,index) in goodForm.specSPUParams">
8 <el-form-item :label="item.k">
9 <el-input v-model="item.v"></el-input>
10 </el-form-item>
11 </el-col>
12 </el-form>
2.数据初始化声明
1 data() {
2 return {
3 goodForm: {
4 specSPUParams: []
5 }
6 }
7 }
3.后台返回的数据结构

原型二:多层循环生成表单
需求是:根据后台返回的数据生成一个表单,如图一;各表单输入一个,动态添加一个输入框,如图二;这里只进行了各表单的第一个输入框进行校验。
遇到的问题:输入框输入了值,校验不能消失。
解决方法:vue响应式的理解


1.表单
1 <el-form label-width="110px" :model="goodForm.specSKUParams" ref="sssss" size="small" style="width: 700px;" class="demo-dynamic">
2 <div :key="index" v-for="(array,key,index) in goodForm.specSKUParams">
3 <el-form-item v-for="(item, indexA) in array" :label="key" v-if="indexA===0" :key="indexA" :prop="key+'.'+indexA+'.v'"
4 :rules="[{required: true, message: key+'不能为空', trigger: 'blur'}]">
5 <el-input placeholder="请输入参数值" v-model="item.v" style="width: 500px;" @change="skuChange(key,indexA)"></el-input>
6 <el-button class="btnG" v-if="indexA+1!==array.length" @click.prevent="removeDomain(item,key)" icon="el-icon-delete-solid" type="text"
style="font-size: 18px;color: #545C64;"></el-button>
7 </el-form-item>
8 <el-form-item v-for="(item, indexA) in array" v-if="!(indexA===0)" :key="indexA">
9 <el-input placeholder="请输入参数值" v-model="item.v" style="width: 500px;" @change="skuChange(key,indexA)"></el-input>
10 <el-button class="btnG" v-if="indexA+1!==array.length" @click.prevent="removeDomain(item,key)" icon="el-icon-delete-solid" type="text"
11 style="font-size: 18px;color: #545C64;"></el-button>
12 </el-form-item>
13 </div>
14 </el-form>
2.数据初始化声明
1 data() {
2 return {
3 goodForm: {
4 specSKUParams: {}
5 }
6 }
7 }
3.获得后台数据 (第2行的commonGet是自己封装的ajax请求;第4行是解决问题的关键点:给specSKUParams添加一个属性,这样此属性就具有响应式)
1 getSpecParams() {
2 commonGet('item/spec/querySpecParam?cID=76').then(res => {
3 res.data.data.rows.forEach(item => {
4 this.$set(this.goodForm.specSKUParams,item.name,true);
5 this.goodForm.specSKUParams[item.name]=[{
6 v:''
7 }]
8 })
9 })
10 },
4.附带两个方法(动态增加输入框;动态删除输入框)
1 skuChange(key, index) {
2 //console.log(key);
3 let len = this.goodForm.specSKUParams[key].length;
4 //console.log(len)
5 if (index + 1 === len) { //如果操作的是最后一个输入框就再添加一个输入框
6 this.goodForm.specSKUParams[key].push({
7 v: ''
8 });
9 }
10 },
11 removeDomain(item,key){
12 //console.log(item);
13 //console.log(key);
14 let index=this.goodForm.specSKUParams[key].indexOf(item);
15 this.goodForm.specSKUParams[key].splice(index,1);
16 },
总结:学习一时爽,一直学习一直爽!
element ui动态生成表单数据与校验(后台传入数据)的更多相关文章
- vue 使用 element ui动态添加表单
html部分 <div class="hello"> <el-form :model="dynamicValidateForm" ref=&q ...
- vue动态生成表单
vue动态生成表单 一.下拉框 <!DOCTYPE html> <html> <head> <meta charset="utf-8" / ...
- element ui 表格提交时获取所有选中的checkbox的数据
<el-table ref="multipleTable" :data="appList" @selection-change="changeF ...
- Jquery 动态生成表单 并将表单数据 批量通过Ajax插入到数据库
利用Jquery 动态生成 Table 表单 之后利用each 方法来遍历所有文本框获取文本的value值 并通过Ajax 将数据 提交到Web服务里把数据插入数据库 Html页面 <!DOC ...
- vue自定义表单生成器,可根据json参数动态生成表单
介绍 form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成器.并且支持生成任何 Vue 组件.结合内置17种常用表单组件和自定义组件,再复杂的表单都可 ...
- MVC动态生成表单
1*书写方式 一.using语句可以不写结束标记,自动加上 服务端 客户端 默认提交当前控制器和操作方法 二.开始与结束代码都写 服务端 客户端 三.一些常用的重载方法 (1)要提交的控制器,和操作方 ...
- Sql Server备份表,动态生成表名称
1.常用的数据库备份表语句 SELECT * INTO tableNameNew FROM tableName 2.动态备份表,且备份表名称后面增加三位随机字符和当前日期 1 DECLARE @bak ...
- Asp.net动态生成表单
control.ascx <%@ Control Language="C#" AutoEventWireup="true" CodeBehind=&quo ...
- [终章]进阶20-流程控制结构--if/case/while结构 - 三个while的存储过程案例(批量生成表单数据) - 随机长度的随机字符串的存储过程案例
. mysql 存储过程中尽量使用 @变量 而不用局部变量, @变量不容易报错!权限小,更改一下就报错! . sql中判断相等'=' ,用'=' 不用'=='. . #流程控制结构 /* 顺序结构: ...
- 使用js/jquery动态提交表单数据到搜索引擎或者接口
现在一般需要用jquery等方式动态提交到某个接口,比如通过iframe <iframe id="mainIframe" name="mainIframe" ...
随机推荐
- Linux系统root密码忘记修改
重启Linux系统 到启动状态: 按任意键,进入GRUB菜单: 按字母e进入: 调整到上图,按字母e,进入 不进行删减,在后面输入" 1"(空格1),按回车,进入 或者将" ...
- 关于活动目录AD(域)的相关配置(已更新8.31)
关于活动目录AD(域)的相关配置 目录 一. 配置Server2019升级活动目录AD 1 二. 配置活动目录AD内的文件服务器 13 三. 配置活动目录AD域内分发软件 ...
- linux下第三方库的配置和链接——以opencv为例
安装OpenCV(可参考链接) 下载source到 /usr/local/路径下 新建 /build/ cmake 编译 添加库路径 vim /etc/ld.so.conf 该目录作用参考链接 输入: ...
- 前端vue的JsPDF html2canvas 生成pdf并以文件流形式上传到后端(转载)
原文地址 1.首先在文件内引入htmlToPdf.js这里代码引入了html2canvas和jspdf//需要 npm i html2Canvas 和 npm i jspdf 在这里将getPdf 这 ...
- [Github]获取github ID号
[Github]获取github ID号 https://api.github.com/users/ + 你的账户名称 实例:我github账号叫iBoundary. https://api.gith ...
- BottomNavigationBar 自定义 底部导航条、以及实现页面切换
一.Flutter BottomNavigationBar 组件 BottomNavigationBar 是底部导航条,可以让我们定义底部 Tab 切换,bottomNavigationBar是 Sc ...
- Java注解及应用原理
视频地址:https://www.bilibili.com/video/BV1Py4y1Y77P/?spm_id_from=333.337.search-card.all.click&vd_s ...
- nginx 编译安装支持 upload progress module, upload module
下载地址: wiki.nginx.org/HttpUploadModule wiki.nginx.org/HttpUploadProgressModule 下载后解压至:/usr/src/文件夹下,其 ...
- 【剑指Offer】【链表】合并两个排序的链表
题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. A:若链表1为空,则合并后的链表头结点为pHead2:若链表2为空,则合并后的链表头结点为pHead ...
- SignalR《二》接着前篇的继续
SignalR<二>接着前篇的继续 SignalR身份验证 在ChatRoomHub加上[Authorize] 这样登录了才能发送消息 using Microsoft.AspNetCor ...