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 相关文章推荐
javascript json 新手入门文档
Dec 03 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
Jun 03 Javascript
Bootstrap Metronic完全响应式管理模板学习笔记
Jul 08 Javascript
原生JS实现图片轮播切换效果
Dec 15 Javascript
详解js中Number()、parseInt()和parseFloat()的区别
Dec 20 Javascript
js微信支付实现代码
Dec 22 Javascript
AngularJS Toaster使用详解
Feb 24 Javascript
原生JS实现DOM加载完成马上执行JS代码的方法
Sep 07 Javascript
微信小程序实现比较功能的方法汇总(五种方法)
Mar 07 Javascript
Vue数据双向绑定原理实例解析
May 15 Javascript
原生JavaScript实现贪吃蛇游戏
Nov 04 Javascript
js canvas实现五子棋小游戏
Jan 22 Javascript
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
通达OA公共代码 php常用检测函数
2011/12/14 PHP
php cookie中点号(句号)自动转为下划线问题
2014/10/21 PHP
PHP生成加减算法方式的验证码实例
2018/03/12 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
javascript document.compatMode兼容性
2010/02/23 Javascript
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
2011/08/28 Javascript
漂亮的jquery提示效果(仿腾讯弹出层)
2013/02/05 Javascript
JS常用正则表达式总结
2013/11/12 Javascript
JavaScript格式化日期时间的方法和自定义格式化函数示例
2014/04/04 Javascript
jQuery数据缓存用法分析
2015/02/20 Javascript
javascript中undefined与null的区别
2015/08/16 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
2021/01/20 Javascript
jQuery层次选择器用法示例
2016/09/09 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
2016/11/16 Javascript
详解Vue 匿名、具名和作用域插槽的使用方法
2019/04/22 Javascript
vue实现密码显示与隐藏按钮的自定义组件功能
2019/04/23 Javascript
原生js实现弹幕效果
2020/11/29 Javascript
[36:09]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
Python实现的简单发送邮件脚本分享
2014/11/07 Python
Python多线程爬虫简单示例
2016/03/04 Python
使用tensorflow实现AlexNet
2017/11/20 Python
flask中的wtforms使用方法
2018/07/21 Python
利用python实现在微信群刷屏的方法
2019/02/21 Python
python输出pdf文档的实例
2020/02/13 Python
python 实现多维数组(array)排序
2020/02/28 Python
Python抓包程序mitmproxy安装和使用过程图解
2020/03/02 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
加拿大最大的相机店:Henry’s
2017/05/17 全球购物
德国综合购物网站:OTTO
2018/11/13 全球购物
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
员工薪酬福利制度
2014/01/17 职场文书
陕西导游词
2015/02/04 职场文书
win10下go mod配置方式
2021/04/25 Golang
canvas实现贪食蛇的实践
2022/02/15 Javascript
Java 数组的使用
2022/05/11 Java/Android