详解Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)


Posted in Javascript onApril 20, 2019

动态表单生成

ElementUI官网引导

Element表单生成
Element动态增减表单,在线代码

关键配置

  1. template中,form和form-item的写法和绑定
  2. data里的值为空
  3. 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,不可编辑。反之,可以编辑。

# 动态表格生成

关键配置

  1. el-table里,各项配置,其实和动态表单差不多
  2. data里的值为空
  3. 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)
    })
  }

函数分析

  1. [x] 先清空数据,this.cols = [], this.tableData = []
  2. [x] cols_list是后台发回来的列定义
  3. [x] each_row是后台发回来的行数据
  4. [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动态表单动态表格详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js 日期转换成中文格式的函数
Jul 07 Javascript
[JSF]使用DataModel处理表行事件的实例代码
Aug 05 Javascript
枚举的实现求得1-1000所有出现1的数字并计算出现1的个数
Sep 10 Javascript
jQuery实现图片轮播特效代码分享
Sep 15 Javascript
javascript产生随机数方法汇总
Jan 25 Javascript
js替换字符串中所有指定的字符(实现代码)
Aug 17 Javascript
JS中将多个逗号替换为一个逗号的实现代码
Jun 23 Javascript
angular实现input输入监听的示例
Aug 31 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
Oct 25 Javascript
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
Jan 12 Javascript
Vue项目移动端滚动穿透问题的实现
May 19 Javascript
JavaScript实现酷炫的鼠标拖尾特效
Feb 18 Javascript
详解vue使用$http服务端收不到参数
Apr 19 #Javascript
ajaxfileupload.js实现上传文件功能
Apr 19 #Javascript
AjaxFileUpload.js实现异步上传文件功能
Apr 19 #Javascript
读懂CommonJS的模块加载
Apr 19 #Javascript
js module大战
Apr 19 #Javascript
如何根据业务封装自己的功能组件
Apr 19 #Javascript
vue项目打包上传github并制作预览链接(pages)
Apr 19 #Javascript
You might like
解析smarty模板中类似for的功能实现
2013/06/18 PHP
PHP读取Excel类文件
2017/05/15 PHP
PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例
2019/06/13 PHP
Javascript实例教程(19) 使用HoTMetal(6)
2006/12/23 Javascript
利用JS自动打开页面上链接的实现代码
2011/09/25 Javascript
JS 退出系统并跳转到登录界面的实现代码
2013/06/29 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
javascript 动态修改css样式方法汇总(四种方法)
2015/08/27 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
2015/09/07 Javascript
js实现select选择框效果及美化
2016/08/19 Javascript
parabola.js抛物线与加入购物车效果的示例代码
2017/10/25 Javascript
Angular4 组件通讯方法大全(推荐)
2018/07/12 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
2018/09/20 Javascript
傻瓜式vuex语法糖kiss-vuex整理
2018/12/21 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
JavaScript实现旋转木马轮播图
2020/03/16 Javascript
解决vue scoped html样式无效的问题
2020/10/24 Javascript
pymssql ntext字段调用问题解决方法
2008/12/17 Python
各个系统下的Python解释器相关安装方法
2015/10/12 Python
十个Python程序员易犯的错误
2015/12/15 Python
python 转换 Javascript %u 字符串为python unicode的代码
2016/09/06 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
用virtualenv建立多个Python独立虚拟开发环境
2017/07/06 Python
使用python实现ANN
2017/12/20 Python
Python实现图片转字符画的代码实例
2019/02/22 Python
python文件写入write()的操作
2019/05/14 Python
Python中base64与xml取值结合问题
2019/12/22 Python
使用python将微信image下.dat文件解密为.png的方法
2020/11/30 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
LORAC官网:美国彩妆品牌
2019/08/27 全球购物
波兰在线运动商店:YesSport
2020/07/23 全球购物
美国鲜花递送:UrbanStems
2021/01/04 全球购物
教师节促销方案
2014/03/22 职场文书
岗位说明书范文
2014/05/07 职场文书
pycharm代码删除恢复的方法
2021/06/26 Python
MySQL实战记录之如何快速定位慢SQL
2022/03/23 MySQL