详解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 相关文章推荐
jquery中页面Ajax方法$.load的功能使用介绍
Oct 20 Javascript
实用框架(iframe)操作代码
Oct 23 Javascript
深入理解Ajax的get和post请求
Jun 02 Javascript
Bootstrap编写一个在当前网页弹出可关闭的对话框 非弹窗
Jun 30 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
Aug 24 Javascript
js Canvas绘制圆形时钟效果
Feb 17 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
Mar 08 Javascript
jQuery实现一个简单的验证码功能
Jun 26 jQuery
vue中promise的使用及异步请求数据的方法
Nov 08 Javascript
微信小程序云开发之新手环境配置
May 16 Javascript
JS实现简单移动端鼠标拖拽
Jul 23 Javascript
简单谈谈offsetleft、offsetTop和offsetParent
Dec 04 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
php 分页类 扩展代码
2009/06/11 PHP
PHP执行zip与rar解压缩方法实现代码
2010/12/05 PHP
PHP扩展模块memcached长连接使用方法分析
2014/12/24 PHP
PHP中类的继承和用法实例分析
2016/05/24 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
2016/10/08 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
JavaScript中判断函数是new还是()调用的区别说明
2011/04/07 Javascript
JQuery扩展插件Validate 2通过参数设置验证规则
2011/09/05 Javascript
javascript上传图片前预览图片兼容大多数浏览器
2013/10/25 Javascript
js语法学习之判断一个对象是否为数组
2014/05/13 Javascript
AngularJS入门教程之Hello World!
2014/12/06 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
2016/05/12 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
2016/05/25 Javascript
jQuery图片轮播(二)利用构造函数和原型创建对象以实现继承
2016/12/06 Javascript
bootstrap table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)代码分享
2017/01/24 Javascript
js实现方块上下左右移动效果
2017/08/17 Javascript
Angular2监听页面大小变化的解决方法
2017/10/09 Javascript
angular2系列之路由转场动画的示例代码
2017/11/09 Javascript
浅谈express.js框架中间件(middleware)
2019/04/07 Javascript
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
Python之py2exe打包工具详解
2017/06/14 Python
flask使用session保存登录状态及拦截未登录请求代码
2018/01/19 Python
通过实例简单了解Python sys.argv[]使用方法
2020/08/04 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
2020/11/13 Python
对Pytorch 中的contiguous理解说明
2021/03/03 Python
会走动的图形html5时钟示例
2014/04/27 HTML / CSS
十岁生日同学答谢词
2014/01/19 职场文书
幼儿园庆六一游园活动方案
2014/01/29 职场文书
小学社团活动总结
2014/06/27 职场文书
中专毕业生的自荐书
2014/07/01 职场文书
幼儿园音乐教学反思
2016/02/18 职场文书
ORACLE查看当前账号的相关信息
2021/06/18 Oracle
Java比较两个对象中全部属性值是否相等的方法
2021/08/07 Java/Android
浅谈mysql哪些情况会导致索引失效
2021/11/20 MySQL