vue 原生table组件封装

代码逐风鹤
• 阅读 853

vue 原生table组件封装

<template>
  <div class="zz-dynamic-table">
    <table class="customTable" border cellpadding="0" cellspacing="0">
      <thead>
        <tr v-for="(aitem, i) in newTheadData" :key="'a' + i">
          <th
            :width="bitem.width ? bitem.width : 'auto'"
            :style="{ width: bitem.width ? bitem.width : 'auto', 'text-align': bitem.align ? bitem.align : 'center' }"
            v-for="(bitem, j) in aitem"
            :key="'b' + j"
            :rowspan="bitem.rowspan"
            :colspan="bitem.colspan"
            v-html="bitem.label"
          ></th>
        </tr>
      </thead>
      <tr v-for="(item, index) in tableData" :key="index">
        <td
          v-for="(item1, key, index1) in item"
          :key="index1"
          :align="thArr[index1].align && key === thArr[index1].key ? thArr[index1].align : 'center'"
        >
          {{ item1 }}
        </td>
      </tr>
    </table>
  </div>
</template>
<script>
export default {
  name: 'zz-dynamic-table',
  props: {
    theadData: {
      type: Array,
      default: () => [
        { key: 'date', label: '日期', align: 'left' },
        {
          label: '配送信息',
          children: [
            { key: 'name', label: '姓名' },
            {
              label: '地址',
              children: [
                { key: 'province', label: '省份' },
                { key: 'city', label: '市区' },
                { key: 'address', label: '详细<br/>地址' }
              ]
            }
          ]
        },
        { key: 'zip', label: '编码' }
      ]
    }
  },
  data() {
    return {
      thArr: [],
      rows: 1,
      tableData: [
        {
          date: '323232',
          name: 'wang',
          province: 'province',
          city: 'city',
          address: 'address',
          zip: 333
        },
        {
          date: '32323221',
          name: 'wang1',
          province: 'province1',
          city: 'city11',
          address: 'address1',
          zip: 555
        }
      ],
      newTheadData: []
    }
  },
  created() {
    this.newTheadData = this.getTheadData(this.theadData)
    // console.log('newTheadData=', this.newTheadData, this.rows)
    this.thArr = this.treeToFlat(this.theadData, [])
    console.log('thArr=', this.thArr)
  },
  methods: {
    treeToFlat(arr, res) {
      let result = res
      arr.forEach(item => {
        if (item.children?.length) {
          this.treeToFlat(item.children, result)
        } else {
          result.push(item)
        }
      })
      return result
    },
    //获取最终结果返出去
    getTableData() {
      this.$nextTick(() => {
        let result = ''
        if (this.tableData && this.tableData.length) {
          result = JSON.stringify(this.tableData)
        }
        this.$emit('input', result)
      })
    },
    addRow() {
      this.tableData.push({})
    },
    //数组中是否有children字段
    isHaveChildren(arr) {
      if (!arr) {
        return false
      }
      for (let i = 0; i < arr.length; i++) {
        let item = arr[i]
        if (item.children && item.children.length) {
          return true
        }
      }
      return false
    },
    //获取该列合并的总数
    getColCount(data) {
      let sum = 0
      if (!data) {
        return sum
      }
      if (!data.children) {
        return sum
      }
      let _this = this
      let fn = function(arr) {
        if (!arr) {
          return sum
        }
        arr.forEach(item => {
          if (item.children) {
            fn(item.children)
          } else {
            sum++
          }
        })
      }
      fn(data.children)
      return sum
    },
    //重组thead数据
    getTheadData(p) {
      let params = JSON.parse(JSON.stringify(p))
      if (!params) {
        return []
      }
      let data = [],
        _this = this
      var fn = function(arr) {
        if (!arr) {
          return []
        }
        // 是否拥有多级表头
        let rowData = []
        if (_this.isHaveChildren(arr)) {
          arr.forEach(item => {
            if (item.children) {
              item.rowspan = 1
              item.colspan = _this.getColCount(item)
              fn(item.children)
            } else {
              item.rowspan = arr.length
              item.colspan = 1
            }
            rowData.push(item)
          })
        } else {
          arr.forEach(item => {
            item.rowspan = 1
            item.colspan = 1
            rowData.push(item)
          })
        }
        data.unshift(rowData)
      }
      if (this.isHaveChildren(params)) {
        //重组
        this.rows = params.length
        fn(params)
      } else {
        //不重组
        data.push(params)
      }
      return data
    }
  },
  watch: {
    theadData(value) {
      this.newTheadData = this.getTheadData(value)
    }
  }
}
</script>
<style lang="less" scoped>
.zz-dynamic-table {
  width: 100%;
}
table {
  width: 100%;
  border-color: #777;
  // border-color: red;
}
thead {
  background: #eee;
}
tr {
  width: 100%;
}
th {
  padding: 3px 2px;
  min-width: 10%;
}
td {
  padding: 3px 2px;
}
</style>
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
梦
4年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
Stella981 Stella981
3年前
Redis 6.0 正式版终于发布了!除了多线程还有什么新功能?
!(https://oscimg.oschina.net/oscnet/b8c8b22b9f44bd806c26b486e1893a263a4.jpg)这是我的第56篇原创文章!(https://oscimg.oschina.net/oscnet/8bf00bc92f6a1cd46596ee44bac64a801ae.pn
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
代码逐风鹤
代码逐风鹤
Lv1
白日放歌须纵酒,青春作伴好还乡。
文章
4
粉丝
0
获赞
0