table自定义表格的封装

2023-11-06

前言:

        对原生的table进行封装,让他满足我们一行显示不同个的需求。

实现效果:如图所示,一行显示不同数量的内容

 实现代码:

1、封装的组件:custom_table.vue,源码看下面

(1)一行显示几个td 

(2)表头数据,表格数据 

(3)js封装核心方法 

2、调用方法:有form是为了必填的*效果,可根据实际情况增删

<Form :model="orderDetail" label-position="left" :label-width="120">
      <!--<Card style="margin-bottom: 20px;">-->
      <custom_table :tableObj="tableObj1" :orderList="orderDetail"></custom_table>
</Form>

3、data里面定义的参数

        //订单编号自定义列表
        tableObj1:[
          {
            title:'订单编号', //表头名称
            key:'orderSn',    //表头对应取数据的字段
          },{
            title:'外部订单编号',
            key:'sourceOrderSn',
          },{
            title:'订单类型',
            key:'type', 
            enumFilter:'OrderTypeEnum' //全局的filter过滤方法
          },{
            title:'订单状态',
            key:'status',
            enumFilter:'OrderStatusEnum'
          },{
            title:'所属组织',
            key:'merchantName',
          },{
            title:'所属店铺',
            key:'shopName',
          },{
            title:'销售渠道',
            key:'platform',
          },{
            title:'订单来源',
            key:'source',
          },{
            title:'配送方式',
            key:'deliveryType',
          },{
            title:'逻辑仓',
            key:'logicName',
          },{
            title:'物理仓',
            key:'physicName',
          },{
            title:'期望到货时间',
            key:'expectedDeliveryTime',
          },{
            title:'创建人',
            key:'createUser',
          },{
            title:'销售员',
            key:'saleUser',
          },{
            title:'快递',
            key:'expressName',
            col:'2' //合并
          }
        ],

        //所有的数据
        orderDetail: {
            orderSn:'111'
        },

封装组件源码:custom_table.vue

<template>
  <!--类型一:-->
  <table class="comTable" v-if="uploadCustomTable">
    <tr v-for="(trItem,trIndex) in tableColumn" :key="'custom_tr_'+trIndex">
      <td v-for="(tdItem,tdIndex) in trItem" :colspan="tdItem.col?tdItem.col:1" :key="'custom_td_'+tdIndex" >
        <FormItem :label="tdItem.title + ':'">
          <p v-if="orderDetail[tdItem.key] && tdItem.enumFilter">{{ orderDetail[tdItem.key] | enumFilter(tdItem.enumFilter) }}</p>
          <p v-if="orderDetail[tdItem.key] && !tdItem.enumFilter">{{ orderDetail[tdItem.key] }}</p>
          <p v-if="!orderDetail[tdItem.key] && orderDetail[tdItem.key] === 0">{{orderDetail[tdItem.key]}}</p>
          <p v-if="!orderDetail[tdItem.key] && orderDetail[tdItem.key] !== 0"> -- </p>
        </FormItem>
      </td>
    </tr>
  </table>

</template>

<script>
  export default {
    props: {
      //表头一行展示多少个
      custom_table_col_num:{
        type: String,
        default:'4'
      },
      /**
       * 自定义表格-表头数据
       [
          {
            title:'订单编号', //表头数据
            key:'orderSn',   //表头字段
            col:'2'         //合并数量
          }
       ]
       * */
      tableObj:{
        type:Array,
        default:()=>{
          return []
        }
      },
      //列表数据
      orderList:{
        type:Object,
        default:()=>{
          return {}
        }
      }
    },
    watch: {
      //自定义表头数据
      tableObj: {
        handler: "setTableCol",
        immediate: true,
      },
      //自定义表格数据
      orderList: {
        handler: "setTableList",
        immediate: true,
      },
    },
    data() {
      return {
        uploadCustomTable:true,
        orderDetail: {},
        tableColumn:[], //表头数据
      }
    },
    methods: {
      //处理表头数据
      setTableCol(arr){
        let all_arr = [] //总数据
        arr.forEach((item,index)=>{
          item.index = index
          if(item.col){
            //合并内容
            for(let i=0; i< +item.col;i++){
              all_arr.push(item)
            }
          }else{
            all_arr.push(item)
          }
        })
        let allData = []; //用来装处理完的数组
        let currData = []; //子数组用来存分割完的数据
        let now_num = this.custom_table_col_num
        for(var i = 0; i < all_arr.length; i++) {
          currData.push(all_arr[i]);
          if((i != 0 && (i + 1) % now_num == 0) || i == all_arr.length - 1) {
            allData.push(currData);
            currData = [];
          }
        }
        //去重更新数据
        allData.forEach(item=>{
          let oldArr = item
          let newArr = this.unique(oldArr,'index')
          this.tableColumn.push(newArr)
        })
      },
      //更新表格数据
      setTableList(obj){
        this.orderDetail = obj
        this.uploadCustomTable = false
        this.$nextTick(()=>{
          this.uploadCustomTable = true
        })
      },
      /**
       * 根据数组对象的某个字段去重
       * item.name  是[{name:1}] 根据每条数据的name值来去重
       * */
      unique(arr,val) {
        const res = new Map();
        return arr.filter(item => !res.has(item[val]) && res.set(item[val], 1))
      },
    }

  }
</script>

<style lang='less' scoped>
  .comTable {
    width: 100%;
    border-collapse: collapse;
    margin: 15px 0;

    td, th {
      border: 1px solid #ccc;
    }

    tr {
      width: 100%;
      p {
        padding-left: 3px;
        background: #F7F7FB;
        height: 34px;
      }
    }
  }
</style>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

table自定义表格的封装 的相关文章

随机推荐

  • Hive和Hbase的对接

    引言 我们都知道hive数据存储在hdfs上 元数据可以存储在mysql中 计算框架采用mapreduce hive实际上只做分析工具 那么hive的数据是不是也可以存储在hbase呢 文章目录 一 配置hive 二 hive中数据与hba
  • C语言——创建文件

    创建文件 include
  • 俄罗斯方块(C++)

    目录 一 俄罗斯方块简易版的实现 1 图形的存储 2 图形的显示 3 图形的操作 4 碰撞检测 1 碰撞检测 移动 2 碰撞检测 旋转 5 消除整行 6 游戏结束 7 完整代码 二 俄罗斯方块简易版的升级 1 新增属性 2 更改初始化函数
  • CSS 定位(position) (三)

    叠放次序 z index 当对多个元素同时设置定位时 定位元素之间有可能会发生重叠 在CSS中 要想调整重叠定位元素的堆叠顺序 可以对定位元素应用z index层叠等级属性 其取值可为正整数 负整数和0 比如 z index 2 注意 z
  • 阿里云磁盘异常爆满的原因排查及解决方法

    阿里云磁盘异常爆满的原因排查及解决方法 网上搜了好多没有找到解决方法 第一步登录服务器 使用 df h 命令查看磁盘使用率 接下来逐步排查占用内存的文件 输入 du h 显示没有异常大文件 输入 du h max depth 1 后查到异常
  • 论文笔记之ST-GCN

    通过将图卷积网络扩展到时空图模型 设计了一种 用于动作识别的骨架序列 的通用表示 AAAI 2018 录用 论文地址 https arxiv org abs 1801 07455 1 摘要 动态人体骨架模型带有进行动作识别的重要信息 传统的
  • git clone项目报错,The requested URL returned error: 500

    git clone项目报错 The requested URL returned error 500 如何解决 试试修改电脑中存储的账号密码 有项目权限 至少在网页上能通过链接访问当前Git内容 曾在当前电脑登录过git账号 满足以上两种情
  • flutter 保存列表状态和控制列表状态

    class DiscoverActivePageState extends State
  • vue中列表渲染相关知识(v-for)

    普通的列表使用ul包含多个li实现 这样往往不够灵活 在原生js中能够动态渲染列表具体实现如下 ul ul 我们再看看vue中如何实现列表渲染的 b b
  • 微信小程序获取当前位置 地图定位导航-详细代码

    小程序获取当前位置 回到当前位置 地图定位 导航 效果 因为小程序更新了获取地理位置API接口 需要先在app json中配置一下permission字段 不然会报微信小程序getLocation 需要在app json中声明permiss
  • 扩展欧几里得算法

    扩展欧几里得算法是啥 那就要先知道什么是欧几里得算法 欧几里得算法 扩展欧几里得算法是欧几里得算法的推广 利用欧几里得算法的思想和递归求得贝祖等式a x b y gcd a b 不定方程中的一组x和y的解 原理如下 设a gt b 当b 0
  • Coqui TTS 安装与测试

    前言 本篇记录一下 Coqui TTS 的安装 Coqui TTS 的主要作者是德国人 这个库似乎之前和 Mozilla 的 TTS https github com mozilla TTS 有千丝万缕的关系 但是现在后者的 TTS 已经停
  • 2021年江苏省职业院校技能大赛中职 “网络信息安全”赛项(超详细)

    2021年中职组 网络空间安全 赛项 一 江苏省竞赛任务书 二 任务书解析 三 不懂的可以私信博主 一 江苏省竞赛任务书 一 竞赛时间 8 00 11 00 共计3小时 二 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第 阶段
  • [附源码]计算机毕业设计Python课程在线测评系统(程序+源码+LW文档)

    该项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 项目运行 环境配置 Pychram社区版 python3 7 7 Mysql5 7 HBuilderX list pip Navicat11 Django nodejs 项目技
  • 一文理解pytorch张量概念和tensor的三种创建方式!

    1 张量是什么 张量是一个多维数组 它是标量 向量 矩阵的高维拓展 1 1 Variable Variable是 torch autograd中的数据类型 主要用于封装 Tensor 进行自动求导 data 被包装的Tensor grad
  • 超实用的IDEA插件推荐,百万级下载量

    超实用的30多款idea插件 有百万级下载量的优秀插件 你值得拥有 好的工具助你事半功倍 快速协助敲出更漂亮更有效率的代码 搬运工这里收集了很不错的IDEA插件 相信你一定会喜欢的 必备插件列表 Grep Console 自定义控制台输出格
  • C#常用代码

    最近学习用C 写了几个程序 记录一下常用的几个操作 方便以后Copy 文件操作 FileStream fs null try byte buf FileStream fs new FileStream strSampleFileName F
  • Ubuntu16.04下opencv2与ROSkinetic中自带opencv3不兼容问题总结

    1 背景 从ROSindigo换到ROSkinetic ROSkinetic中自带的opencv3 与原来indigo中opencv2不一样 所以原来的涉及opencv的程序都出了问题 最近这两天就一直在改兼容性 清明节最后一天了 总结一下
  • WebStorm2016.2 注册码及激活,2018.6.14亲测有效

    License server激活 这可能是最简单的了 在激活框 选择 License server 输入 http idea iteblog com key php 2018 6 14可用
  • table自定义表格的封装

    前言 对原生的table进行封装 让他满足我们一行显示不同个的需求 实现效果 如图所示 一行显示不同数量的内容 实现代码 1 封装的组件 custom table vue 源码看下面 1 一行显示几个td 2 表头数据 表格数据 3 js封