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的动态表单,动态表格(后端发送配置,前端动态生成)的更多相关文章

  1. 封装Vue Element的form表单组件

    前两天封装了一个基于vue和Element的table表格组件,阅读的人还是很多的,看来大家都是很认同组件化.高复用这种开发模式的,毕竟开发效率高,代码优雅,逼格高嘛.虽然这两天我的心情很糟糕,就像& ...

  2. vue + element ui 阻止表单输入框回车刷新页面

    问题 在 vue+element ui 中只有一个输入框(el-input)的情况下,回车会提交表单. 解决方案 在 el-form 上加上 @submit.native.prevent 这个则会阻止 ...

  3. vue+element ui 重置表单

    <el-dialog :title="addForm.title" :visible.sync="dialogFormVisible" width=&qu ...

  4. vue+element 正则表达式进行表单验证

    <template> <el-form :model="form" label-width="115px" ref="form&qu ...

  5. vue+element之多表单验证

    方法一:利用promise var p1=new Promise(function(resolve, reject) { this.$refs[form1].validate((valid) => ...

  6. 循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储

    在我们一些系统里面,有时候会需要一些让用户自定义的数据信息,一般这些可以使用扩展JSON进行存储,不过每个业务表的显示项目可能不一样,因此需要根据不同的表单进行设计,然后进行对应的数据存储.本篇随笔结 ...

  7. K3/Cloud点按钮打开单据,列表,动态表单,简单账表和直接Sql报表示例

    BOS IDE中配置了个界面,拖了动态表单界面,加了5个测试按钮. 点击“打开单据”维护界面, 会跳转到一个新的主界面页签,[物料]新增 点击“打开列表”,会弹出[物料]列表界面 点击“打开动态表单” ...

  8. vue+element 动态表单验证

    公司最近的项目有个添加动态表单的需求,总结一下我在表单验证上遇到的一些坑. 如图是功能的需求,这个功能挺好实现的,但是表单验证真是耗费了我一些功夫. vue+element在表单验证上有一些限制,必须 ...

  9. vue 开发系列(八) 动态表单开发

    概要 动态表单指的是我们的表单不是通过vue 组件一个个编写的,我们的表单是根据后端生成的vue模板,在前端通过vue构建出来的.主要的思路是,在后端生成vue的模板,前端通过ajax的方式加载后端的 ...

随机推荐

  1. 深入理解Linux内核 学习笔记(5)

    第五章  定时测量 内核必须显式地与三种时钟打交道:实时时钟(Real Time Clock, RTC).时间标记计数器(Time Stamp Counter, TSC)及可编程间隔定时器( Prog ...

  2. 安装Mysql时端口号3306被占用,解决方法

    当我们在卸载mysql数据库重新安装的时候,会出现端口号3306被占用的情况 有两种解决方案: 一:可以不使用3306端口,也可以换成别的端口,如3307,3308等等 二:可以打开命令窗口 1.wi ...

  3. jbpm - 工作流的基本操作

    Jbpm流程引擎. 定义:jbpm,全称是Java Business Process Management(业务流程管理),他是覆盖了业务流程管理,工作流管理,服务协作等领域的一个开源的,灵活的,易扩 ...

  4. SharePoint布局页创建(实战)

    分享人:广州华软 极简 一. 前言 SharePoint有母版页及布局页,母版页控制页面头部.底部,而布局页则控制页面中间内容区域.通过布局页,可以快速修改页面内容区域. SharePoint的页面布 ...

  5. geoserver发布mysql表数据

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.环境部署 Geoserver中并不自带mysql数据发布功能,需要下 ...

  6. iOS----------Mac维修预约-如何找到电脑维修单

    先打开苹果官网,找到技术支持 2.选择维修选项 3.查看维修状态 4.显示维修时间订单

  7. Visual Studio Code-批量在文末添加文本字段

    小技巧一例,在vs code或notepad++文末批量添加文本字段信息,便于数据信息的完整,具体操作如下: Visual Studio Code批量添加"@azureyun.com&quo ...

  8. REST API disable / enable service auto start by API

    how to disable service auto start by API as the following how to enable service auto start by API as ...

  9. zabbix安装及简单使用备注

    1.安装mysql yum install -y mariadb mariadb-server systemctl start mariadb 2.安装apache yum -y install ht ...

  10. 千星项目.Net Core 2.1移植填坑记--OpenAuth.Core诞生

    背景 很早就有把OpenAuth.Net----最好用的.net权限管理工作流框架(好吧!我在吹牛