Element实现表格嵌套、多个表格共用一个表头的方法


Posted in Javascript onMay 09, 2020

一、分析需求

这里先上一张图说明 需求

根据后端返回的数据 ( res 是一个数组,它的元素是一个对象,对象里面的 ext 属性是一个对象,它又包含了, defaultfreepay 三个属性,且这三个都是数组格式。):

Element实现表格嵌套、多个表格共用一个表头的方法 

渲染出一个这样子的 表格

res 数据:

res 的每一个元素的直接属性 name (即为邮费模板名称,比如成都运费模板),

resext 属性下的三个数组 defaultfreepay ,每一个数组要大的一行(这一行中,第一列是运送到的地址的名字,这里定义的是 area 属性,但后端是未给到这个字段的,可自己处理数据添加该字段 ,这里就不细说了。) 这个 area 属性占据的这一列,在页面的展示效果 应该是多行合并的效果。

Element实现表格嵌套、多个表格共用一个表头的方法 

二、代码实现:

<template>
 <div class="layout">
  <el-table :data="res" >
  <el-table-column prop="name">
   <template slot-scope="scope">
   <div class="tab_header">
    <span style="font-weight:600;">{{scope.row.name}}</span>
    <div class="operate">
    <span @click="handleEdit(scope.$index, scope.row)">修改</span>
    <span @click="handleDelete(scope.$index, scope.row)">删除</span>
    </div>
   </div>

   <!-- 这里要实现 多个表格共用一个表头,故需做判断,当表格要渲染的数据为default这个数组的时候,才显示表头的label值 -->
   <!-- 注意:当label无值的时候,还是会占用空间,故当前表格在页面上会出现一个代表表头的空行,需要手动更改(重写)Element表格的 thead样式 -->

   <div v-for="item in (scope.row.ext)" :key="item.id">
    <el-table :data="item" border :class="item!==scope.row.ext.default?'tab-thead-style':''" style="box-sizing: border-box;border-top:none;" :span-method="objectSpanMethod">
    <el-table-column :label="item===scope.row.ext.default?'运送到':''" prop="area"></el-table-column>
    <el-table-column :label="item===scope.row.ext.default?'首重':''" prop="weight"></el-table-column>
    <el-table-column :label="item===scope.row.ext.default?'运费':''" prop="first_price"></el-table-column>
    <el-table-column :label="item===scope.row.ext.default?'续重':''" prop="weight_incre"></el-table-column>
    <el-table-column :label="item===scope.row.ext.default?'最终运费':''" prop="extend_price"></el-table-column>
    </el-table>
   </div>

   </template>
  </el-table-column>
  </el-table>
 </div>
</template>
<script>
export default {
 data () {
 return {
  // res 参考的是后端返回的数据格式,
  res: [
  {
   id: 1,
   dealer_id: 0,
   name: '成都运费模板',
   type: 1,
   ext: {
   default: [{ area: '默认', type: 1, region: '1', weight: '首重d', weight_incre: '续重d', first_price: '运费d', extend_price: '最终运费d' }],
   free: [{ area: 'free', type: 1, region: '1', weight: '首重f', weight_incre: '续重f', first_price: '运费f', extend_price: '最终运费f' }, { area: 'free', type: 1, region: '1', weight: '首重f', weight_incre: '续重f', first_price: '运费f', extend_price: '最终运费f' }],
   pay: [{ area: 'pay', type: 1, region: '1', weight: '首重p', weight_incre: '续重p', first_price: '运费p', extend_price: '最终运费p' }, { area: 'pay', type: 1, region: '1', weight: '首重p', weight_incre: '续重p', first_price: '运费p', extend_price: '最终运费p' }, { area: 'pay', type: 1, region: '1', weight: '首重p', weight_incre: '续重p', first_price: '运费p', extend_price: '最终运费p' }]
   }
  },
  {
   id: 2,
   dealer_id: 0,
   name: '重庆运费模板',
   type: 2,
   ext: {
   default: [{ area: '默认1', type: 1, region: '1', weight: '首重d', weight_incre: '续重d', first_price: '运费d', extend_price: '最终运费d' }],
   free: [{ area: 'free1', type: 1, region: '1', weight: '首重f', weight_incre: '续重f', first_price: '运费f', extend_price: '最终运费f' }, { area: 'free', type: 1, region: '1', weight: '首重f', weight_incre: '续重f', first_price: '运费f', extend_price: '最终运费f' }],
   pay: [{ area: 'pay1', type: 1, region: '1', weight: '首重p', weight_incre: '续重p', first_price: '运费p', extend_price: '最终运费p' }, { area: 'pay', type: 1, region: '1', weight: '首重p', weight_incre: '续重p', first_price: '运费p', extend_price: '最终运费p' }, { area: 'pay', type: 1, region: '1', weight: '首重p', weight_incre: '续重p', first_price: '运费p', extend_price: '最终运费p' }, { area: 'pay1', type: 1, region: '1', weight: '首重p', weight_incre: '续重p', first_price: '运费p', extend_price: '最终运费p' }, { area: 'pay', type: 1, region: '1', weight: '首重p', weight_incre: '续重p', first_price: '运费p', extend_price: '最终运费p' }, { area: 'pay', type: 1, region: '1', weight: '首重p', weight_incre: '续重p', first_price: '运费p', extend_price: '最终运费p' }]
   }
  }

  ]
 }
 },
 methods: {
 handleEdit (index, row) {
  console.log(index, row)
 },
 handleDelete (index, row) {
  console.log(index, row)
 },
 objectSpanMethod ({ row, column, rowIndex, columnIndex }) {
  if (columnIndex === 0) {
  if (rowIndex === 0) {
   let maxLen
   this.res.forEach(val => {
   const arr = [val.ext.default.length, val.ext.free.length, val.ext.pay.length]
   arr.sort((a, b) => a - b)// arr数组 按数字大小从小到大排序
   maxLen = arr.pop()// 取出排序后的数组arr中的最后一个元素
   })
   return {
   // 这个rowspan应该据 ext的default,pay,free的长度不同来定,取最大长度
   rowspan: maxLen,
   colspan: 1
   }
  } else {
   return {
   rowspan: 0,
   colspan: 0
   }
  }
  }
 }
 }
}
</script>
<style lang="scss">
.layout{

 .tab_header{
 color:#333;
 padding:0 5px 0 5px;
 height:45px;
 line-height:45px;
 border:1px solid #eee;display:flex;
 justify-content: space-between;
 background:rgb(233, 225, 225);
 }
 .operate{
 span{
  font-size: 14px;
  margin-right: 20px;
  margin-right:20px;
  color:#409EFF;
  cursor: pointer;
 }
 }
 /* 处理多个表格共用一个表头时,表头处出现多余空行的问题 (label置空后还是占据空间问题) */
 .tab-thead-style{
  thead{
   display: none;
  }
 }

}
</style>

Element实现表格嵌套、多个表格共用一个表头的方法

三、知识点总结:

为什么要采用这种方式解决(渲染)?
① . 项目用的UI组件是Element,它的Table表格组件,没有直接处理行的操作。
② . el-table,它是通过注入data对象数组,并在el-table-column 中用prop属性来对应对象中的键名来填入数据,从而渲染出渲染表格。其中el-table-column表示一个列,label属性来定义表格的列名,即对象的一个键名代表一列;
③ . 没想到更优的解决办法,O(∩_∩)O哈哈~

多个表格共用一个表头时,注意:
①.   需做判断,同时注意label的值。
②.  当el-table-column 的属性label无值的时候,还是会占用空间,故当前表格在页面上会出现一个代表表头的空行,需要手动更改(重写)Element表格的 thead样式

table表格嵌套的时候,注意:
① . Element的Table组件可 自定义列模板,主要是利用它实现表格嵌套部分,通过 Scoped slot 可以获取到 row, column, $index 和 store(table 内部的状态管理)的数据,更多用法参考官网。
②.  Element的Table组件可 合并行或列 ,多行或多列共用一个数据时,可以合并行或列;通过给table传入span-method方法可以实现合并行或列,参考上述代码的 **objectSpanMethod**方法(该表格的第一列需要合并多行——合并渲染表格的data数组的长度那么多行) 或者官网。

到此这篇关于Element实现表格嵌套、多个表格共用一个表头的方法的文章就介绍到这了,更多相关Element 表格嵌套内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
浏览器页面区域大小的js获取方法
Sep 21 Javascript
jquery实现图片滚动效果的简单实例
Nov 23 Javascript
JavaScript怎么判断图片是否加载完成以便获取其尺寸
May 08 Javascript
Iframe实现跨浏览器自适应高度解决方法
Sep 02 Javascript
详谈JavaScript 匿名函数及闭包
Nov 14 Javascript
七个不允许错过的jQuery小技巧
Dec 21 Javascript
基于JS实现一个随机生成验证码功能
May 29 Javascript
JS正则表达式常见函数与用法小结
Apr 13 Javascript
Vue-cli assets SubDirectory及PublicPath区别详解
Aug 18 Javascript
解决Can't find variable: SockJS vue项目的问题
Sep 22 Javascript
vue项目实现减少app.js和vender.js的体积操作
Nov 12 Javascript
Vue3实现简易音乐播放器组件
Aug 14 Vue.js
JS原形与原型链深入详解
May 09 #Javascript
JavaScript中的this妙用实例分析
May 09 #Javascript
JavaScript中继承原理与用法实例入门
May 09 #Javascript
jQuery三组基本动画与自定义动画操作实例总结
May 09 #jQuery
JavaScript进阶(四)原型与原型链用法实例分析
May 09 #Javascript
JavaScript进阶(三)闭包原理与用法详解
May 09 #Javascript
JavaScript进阶(二)词法作用域与作用域链实例分析
May 09 #Javascript
You might like
Php获取金书网的书名的实现代码
2010/06/11 PHP
总结PHP删除字符串最后一个字符的三种方法
2016/08/30 PHP
在Laravel中使用DataTables插件的方法
2018/05/29 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
PHP 实现缩略图
2021/03/09 PHP
javascript textarea光标定位方法(兼容IE和FF)
2011/03/12 Javascript
30个最佳jQuery Lightbox效果插件分享
2011/04/11 Javascript
jquery中获取元素里某一特定子元素的代码
2014/12/02 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
2015/06/23 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
2015/12/25 Javascript
flexslider.js实现移动端轮播
2017/02/05 Javascript
从零学习node.js之express入门(六)
2017/02/25 Javascript
JS排序之快速排序详解
2017/04/08 Javascript
微信小程序radio组件使用详解
2018/01/31 Javascript
JavaScript调用模式与this关键字绑定的关系
2018/04/21 Javascript
100行代码实现一个vue分页组功能
2018/11/06 Javascript
微信小程序日历插件代码实例
2019/12/04 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
2020/04/25 Javascript
在HTML中使用JavaScript的两种方法
2020/12/24 Javascript
[04:03]DOTA2肉山黑名单梦之声 风暴之灵中文配音鉴赏
2013/07/03 DOTA
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
[03:03]DOTA2 2017国际邀请赛开幕战队入场仪式
2017/08/09 DOTA
python调用新浪微博API项目实践
2014/07/28 Python
利用Python开发微信支付的注意事项
2016/08/19 Python
Python切换pip安装源的方法详解
2016/11/18 Python
Selenium 模拟浏览器动态加载页面的实现方法
2018/05/16 Python
PyGame贪吃蛇的实现代码示例
2018/11/21 Python
合伙协议书
2014/04/23 职场文书
片区教研活动总结
2014/07/02 职场文书
关于清明节的演讲稿
2014/09/13 职场文书
银行授权委托书格式
2014/10/10 职场文书
高中生逃课检讨书
2014/10/10 职场文书
小学班主任经验交流材料
2014/12/16 职场文书
婚礼答谢礼品
2015/01/20 职场文书
Vue实现下拉加载更多
2021/05/09 Vue.js