Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
动态表单生成
ElementUI官网引导
关键配置
- template中,form和form-item的写法和绑定
- data里的值为空
- methods中,向后台获取数据的函数写法
1. form,form-item,input的写法[^code]
<el-form :model="dynamicValidateForm" label-width="120px" ref="dynamicValidateForm">
<el-form-item :key="domain.prop"
:label="domain.label"
:prop="domain.prop"
:rules="rules"
v-for="domain in dynamicValidateForm.domains">
<el-input type="money"
:disabled="domain.editable"
autocomplete="off"
v-model.number="domain.value">
</el-input>
</el-form-item>
</el-form>
需要注意的是,:model和ref绑定的值不能用'form'来表示,不然会出错。
也就是说下面的写法会导致运行不报错,但是结果会显示不出来
问题代码:
<el-form :model="form" label-width="120px" ref="form">
</el-form>
我上的代码里面,基本让后台传回来的数据里包含prop,label,value(输入框默认值填入),editable(是否可编辑)四个值。
当然,如果你还想动态定义类型,就让后端多传一个type,用v-if判断一下type是input或者radio或者其他类型就行,网上也有很多类似的解读,此处仅讨论input输入框。
2. data里的值为空[^code]
data () {
return {
dynamicValidateForm: [
domains: {}
],
rules: [],
id: ''
}
}
此处rules为什么不写校验规则,原因是不能判断后端会返回多少个输入框表单类型,你就不能判断你需要在domains里占用多少占位符。
如果你强行写上rules校验,会导致界面提示你输入没空(就算你确实输入了值),因为你没有在domains里写上若干个对象(如下),但是现在的需求是让后端定义数量,所以前端不能确定多少个就不能使用下面的写法,所以就不能在rules里写校验。
问题代码:
data () {
return {
dynamicValidateForm: [
domains: {
{
prop: '',
label: ''
},
{
prop: '',
label: ''
}
}
],
rules: [],
id: ''
}
}
3. methods中,向后台获取数据的函数写法
methods中,向后台获取数据的函数写法
showEdit () {
let formData = new FormData()
formData.append('id', this.id)
let config = {headers: {'Content-Type': 'multipart/form-data'}}
this.$http.post('/getform', formData, config).then(res => {
this.dynamicValidateForm.domains = []
for (var j = 0; j < res.data.data.length; j++) {
var obj = {}
obj.label = res.data.data[j].label
obj.prop = res.data.data[j].prop
obj.value = res.data.data[j].value
obj.editable = res.data.data[j].editable
this.dynamicValidateForm.domains.push(obj)
}
console.log(this.dynamicValidateForm.domains)
})
}
此处,是将id作为formData形式传参给后台,获取所需要的配置数据。
this.dynamicValidateForm.domains = []
如上代码,每次请求前,都需要先将数据清空,要养成初始化的好习惯
prop是form-item的属性(内部,不会显示出来,除非你label没写,会默认label=prop),label是form-item显示值,value是输入框显示值,editable是布尔值,若为true,则:diabled=true,不可编辑。反之,可以编辑。
动态表格生成
关键配置
- el-table里,各项配置,其实和动态表单差不多
- data里的值为空
- methods中,向后台获取数据的函数写法
1.先上el-table代码
<el-table :data="tableData"
border
width="100%">
<el-table-column
:key="col.prop"
:label="col.label"
:prop="col.prop"
v-for="col in cols">
</el-table-column>
<el-table-column
label="操作"
prop="option">
<template slot-scope="scope">
<el-button @click="edit(scope.row)" size="mini" type="info">
<i class="el-icon-edit"></i>
编辑
</el-button>
</template>
</el-table-column>
</el-table>
这样,每一行的数据,最后都会多一列编辑按钮
2.再看data里的数据
data () {
return {
tableData: [],
cols: [],
id: ''
}
}
3.函数的写法
search () {
let formData = new FormData()
formData.append('id', this.id)
let config = {headers: {'Content-Type': 'multipart/form-data'}}
this.$http.post('/gettable', formData, config).then(res => {
this.$message({
message: '查询成功!',
type: 'success'
})
this.cols = []
for (var j = 0; j < res.data.data.cols_list.length; j++) {
var obj = {}
obj.label = res.data.data.cols_list[j].label
obj.prop = res.data.data.cols_list[j].prop
this.cols.push(obj)
}
console.log(this.cols)
this.tableData = []
for (var i = 0; i < res.data.data.each_row.length; i++) {
this.tableData.push(res.data.data.each_row[i])
}
console.log(this.tableData)
}, (error) => {
this.$message.error('查询失败' + error.response.data.msg)
})
}
函数分析
- [x] 先清空数据,this.cols = [], this.tableData = []
- [x] cols_list是后台发回来的列定义
- [x] each_row是后台发回来的行数据
- [x] 需要注意一点,都是字符串,prop里的'name'属性和下面的'name'键名,必须要一致,是字符串的形式,则两者都必须是字符串,才会对应,不然前端访问页面时,会在控制台看到报错'T.template is not a function!'
后端代码举例:
data: {
'code': 'ok',
'cols_list': [
{prop: 'name',label: '名字'},
{prop: 'sex',label:'性别'}
],
'each_row': [
{'name': '小李','sex': '男'},
{'name': '小红','sex': '女'}
]
}
- [x] 致此,两个动态生成都已搞定!
Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)的更多相关文章
- 封装Vue Element的form表单组件
前两天封装了一个基于vue和Element的table表格组件,阅读的人还是很多的,看来大家都是很认同组件化.高复用这种开发模式的,毕竟开发效率高,代码优雅,逼格高嘛.虽然这两天我的心情很糟糕,就像& ...
- vue + element ui 阻止表单输入框回车刷新页面
问题 在 vue+element ui 中只有一个输入框(el-input)的情况下,回车会提交表单. 解决方案 在 el-form 上加上 @submit.native.prevent 这个则会阻止 ...
- vue+element ui 重置表单
<el-dialog :title="addForm.title" :visible.sync="dialogFormVisible" width=&qu ...
- vue+element 正则表达式进行表单验证
<template> <el-form :model="form" label-width="115px" ref="form&qu ...
- vue+element之多表单验证
方法一:利用promise var p1=new Promise(function(resolve, reject) { this.$refs[form1].validate((valid) => ...
- 循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储
在我们一些系统里面,有时候会需要一些让用户自定义的数据信息,一般这些可以使用扩展JSON进行存储,不过每个业务表的显示项目可能不一样,因此需要根据不同的表单进行设计,然后进行对应的数据存储.本篇随笔结 ...
- K3/Cloud点按钮打开单据,列表,动态表单,简单账表和直接Sql报表示例
BOS IDE中配置了个界面,拖了动态表单界面,加了5个测试按钮. 点击“打开单据”维护界面, 会跳转到一个新的主界面页签,[物料]新增 点击“打开列表”,会弹出[物料]列表界面 点击“打开动态表单” ...
- vue+element 动态表单验证
公司最近的项目有个添加动态表单的需求,总结一下我在表单验证上遇到的一些坑. 如图是功能的需求,这个功能挺好实现的,但是表单验证真是耗费了我一些功夫. vue+element在表单验证上有一些限制,必须 ...
- vue 开发系列(八) 动态表单开发
概要 动态表单指的是我们的表单不是通过vue 组件一个个编写的,我们的表单是根据后端生成的vue模板,在前端通过vue构建出来的.主要的思路是,在后端生成vue的模板,前端通过ajax的方式加载后端的 ...
随机推荐
- 基于Win10极简SonarQube C#代码质量分析
博客有些好些时间未更新了,这几个月的时间里,离开了实习的公司.大学毕了业.来了新公司.转了户口,有点忙,最近总算稍微闲下来了,打算重新拾起博客,坚持写下去. 言归正转,什么是SonarQube ? S ...
- 驰骋工作流引擎-流程数据md5加密
关键字:工作流程数据加密 md5 数据保密流程数据防篡改软加密设置方式: 对工作流引擎的数据加密研究, 流程数据的加密方案与实现过程.输入图片说明需求背景1, 流程数据加密是为了防止流程数据被篡改 ...
- ArcGIS消除图斑重叠错误
在生产中,经常会遇见有图斑重叠这种拓扑错误的矢量,大部分情况下,需要人工比对影像处理.但是如果只需要用到这些矢量的形状.面积,可以在ArcMap中用以下方法,快速消除图斑重叠错误,不必手工处理. 如下 ...
- github常见操作和常见错误!错误提示:fatal: remote origin already exist
如果输入$ git remote add origin git@github.com:djqiang(github帐号名)/gitdemo(项目名).git 提示出错信息:fatal: remote ...
- Core文件简单介绍及生成设置方法
Core文件简单介绍及生成设置方法 Core文件其实就是内存的映像,当程序崩溃时,存储内存的相应信息,主用用于对程序进行调试.当程序崩溃时便会产生core文件,其实准确的应该说是core dump 文 ...
- 理解Device Tree Usage(续)
4 How Interrupts work 与遵循树的自然结构的地址范围转换不同, 中断信号可以起源于或者终止于板卡上的任何设备. 与设备树中自然表示的设备寻址不同,中断信号的表示独立于设备树节点 ...
- Windows10文件目录下添加 Shift+右键打开管理员Powershell窗口
背景(可略过) 目前在调试 Python 程序,遇到了一个问题:当程序中包含多线程时,使用 IDLE 运行是不会执行多线程的语句的,在网上一顿搜罗了解到这种情况可以换成在命令行下执行.好像用 PyCh ...
- 关于'selffilter' is not a registered tag library. Must be one of:
报错代码: 'selffilter' is not a registered tag library. Must be one of: admin_list admin_modify admin_st ...
- Node.js 事件循环机制
Node.js 采用事件驱动和异步 I/O 的方式,实现了一个单线程.高并发的 JavaScript 运行时环境,而单线程就意味着同一时间只能做一件事,那么 Node.js 如何通过单线程来实现高并发 ...
- 开发vue但不使用vue-cli和webpack相关注意事项
1.绑定vue组件使用new Vue() 2.new Vue()需要在dom结构生成之后才有效(毕竟有需要el) 3.Vue.component注册全局组件在vue容器组件挂载之前才有效 4.当然,可 ...