vue 自定义的通用的表格组件(使用div)

news2024/11/24 10:55:02

vue 自定义的通用的表格组件(使用div)

做项目的时候由于传统的table及elementUI的el-table的tr和td没办法设置间距,满足不了UI提供的设计稿,为了还原,自己封装了该组件

该表格组件的特点

  1. 表头排序功能:支持点击表头进行升序、降序排序,并显示相应的排序图标。
  2. 复选框功能:可以在表格中为每一行数据添加复选框,并支持全选和取消全选操作。
  3. 图表展示:支持在表格中展示图表数据,提供相应的图表显示和交互功能。
  4. 文件上传功能:对于特定的列,支持文件上传和编辑操作,并可以显示上传进度和状态。
  5. 按钮操作:支持在表格中添加按钮并绑定相应的点击事件,实现自定义的操作功能(可以动态控制按钮的显示和禁用状态)。
  6. 支持单元格内容的格式化显示
  7. 行点击事件:支持点击表格某一行触发相应的事件处理。
  8. 包含了滚动条联动的功能,右侧侧固定列和表格内容的联动滚动

该表格组件的介绍

封装组件具体用了vue哪些指令

  1. 条件渲染

    • 使用了 v-if 指令来根据条件判断是否渲染整个表格容器。
      样式类绑定:
  2. 样式类绑定

    • 使用了 :class 绑定动态的样式类。。
  3. 表头渲染:

    • 使用了 v-for 指令循环渲染表头的每一列。
    • 对每一列进行了样式设定,并且设置了点击事件处理函数。
  4. 表格内容渲染:

    • 使用了 v-for 指令循环渲染表格的每一行和每一列。
    • 对每个单元格进行了样式设定,并且设置了点击事件处理函数。
  5. 固定列:

    • 在表格右侧实现了固定列的功能,并根据条件判断是否渲染固定列的内容。
  6. 事件处理:

    • 使用了 @click 绑定点击事件处理函数。
    • 使用了 @change 监听复选框的变化事件。
  7. 插槽:

    • 使用了 slot 标签定义插槽,用于插入其他组件或内容。

表头部分

这部分代码负责渲染表格的表头结构,包括表头的各个列以及相关的操作按钮、排序功能等

<div class="common-table-header">
   ......
</div>

表格内容

这部分代码负责根据数据 data 动态渲染表格的行和列内容,包括每一行中的单元格内容、操作按钮、上传编辑功能等。

<div v-for="(row, index) in data">
   ......
</div>
类名介绍
  • common-table-body — 表格内容的盒子(除表头外)高度需固定(固定原因:表格滚动条)
  • common-table-body-wrapper — 表格内容的盒子(除表头外)高度自适应
  • common-table-row — 每一行的类名

固定列部分

<div class="common-table-box-fixed">
    ......
</div>

传参介绍

  • data — 表格显示的数据
  • columns — 表格列字段
    • 传参格式
      1. label对应value
      2. label2对应value1 — 这块后加的,value2被占用所以没对上可自行更改
      3. label3对应value3
[{
    label: '表头名称',
    value: "对应列内容的字段名",
    width: '表格列的宽度 --- 此处都是转化为vw以便自适应',
    paddingLeft: '每一列的左内边距默认都为20',
    paddingRight: '每一列的右内边距默认都为20',
    isSort: '是否是索引',
    position: "文字是位置-- center:居中;center-left:居左",
    valueFormatter: "单元格内容的格式化显示---方法 --- 解析value",
    valueFormatter1: "单元格内容的格式化显示---方法--- 解析value1",
    valueFormatter3: "单元格内容的格式化显示---方法 --- 解析value3 ",
    isHidden: '隐藏列',
    isDate: '日期格式 --- 日期有特殊样式显示',
    label2: '表头名称 --- 表格显示过多时一列支持显示1-3个字段,举例:表头名为姓名/性别/电话',
    value1: '对应列内容的字段名 --- 表格显示过多时一列支持显示1-3个字段,举例:姓名/性别/电话竖着展示',
    label3: '表头名称 --- 表格显示过多时一列支持显示1-3个字段,举例:表头名为姓名/性别/电话',
    value3: '对应列内容的字段名 --- 表格显示过多时一列支持显示1-3个字段,举例:姓名/性别/电话竖着展示',
    isTooltip: 是否超出显示提示框 --- value内容,
    isTooltip1: 是否超出显示提示框 --- value1内容,
    isTooltip2: 是否超出显示提示框 --- value3内容,
    value2: '表格值显示。一般显示名称后value2用来拼接到value后的',
    wordColor: '表格内容样色,默认为黑色,当该值为true则为灰色',
    isCommonProgress: '显示进度条',
    wrap: '通常用在操作列,按钮是否可以换行',
    isButton: '代表渲染按钮',
    buttonList: '按钮集合',
    fontColorIsBlue: '文字颜色变为蓝色',
    isbadge: '内容右上角显示的标记此处为数量',
    isProgressVal: '进度,这块显示两行,上边为具体值,下册为百分比进度',
    unit: '表格内容如果需要单位且不用valueFormatter,可直接使用该值进行传递',
    isEcharts: '需要绘制echarts',
    isImg: '代表需要展示图片',
    question: '表头显示提示框解释该字段表格含义',
    isClick: '表格可以点击需结合callback进行使用,只有点击每一列生效',
    callback: '方法,点击表格某行后执行',
    bgFormatter: '方法,根据某个值给表格行添加背景'


}]
  • 举例
tableColumns = [
          {
   
            label: "序号",
            value: "sort",
            width: this.windowWidth <= 1024 ? 70 * 2 : 78 * 2,
            paddingLeft: this.windowWidth <= 1024 ? 10 * 2 : 20 * 2,
            paddingRight: this.windowWidth <= 1024 ? 10 * 2 : 20 * 2,
            isSort: true,
            position: "center"
          },
          {
   
            label: "创建日期",
            value: "createTime",
            isDate: true,
            width: this.windowWidth <= 1024 ? 140 * 2 : 148 * 2,
            position1: "center-left",
            valueFormatter: this.valueDateFormat,
            paddingLeft: 0,
            paddingRight: 0,
            isHidden: this.windowWidth <= 1024
          },
          {
   
            label: "类型",
            value: "type",
            width: this.windowWidth <= 1024 ? 85 * 2 : 107 * 2,
            position: "center",
            valueFormatter: this.valueSourceFormat,
            paddingLeft: this.windowWidth <= 1024 ? 10 * 2 : 20 * 2,
            paddingRight: this.windowWidth <= 1024 ? 10 * 2 : 20 * 2
          },
        ];
  • isJump
    • 点击表格任意行及任意位置都能触发
  • isChoose
    • 支持选中某一行
  • needJudgeChooseStatus
    • false-任意选;true-需要满足某些条件才能被选
  • buttonList
    • 固定操作列按钮集合
  • fixedWidth
    • 固定操作列宽
  • fixedLabel
    • 固定操作表头的label
  • rowId
    • 选中某一行时判断是否重复选择的属性key
  • isScroll
    • 是否支持滚动表格后才加载某些内容
  • checkDisabledLabel
    • 表格多选框是否禁用要判断的属性key
  • titleCheck
    • 表格表头多选框的绑定值
  • titleChekcDisabled
    • 表格表头多选框是否禁用
  • chooseNumber
    • 选中表格行最多支持的数量
  • chooseTooltip
    • 选中表格行等于支持的数量后再选的提示

方法介绍

  • handleClickSort(handleSortDown,handleSortUp)
    • 表格的列头点击时触发排序操作,调用 $emit 方法来触发排序事件,并将排序方式和排序字段作为参数传递给父组件,供其进行相应的处理。
  • handleChangeCheck
    • 调用 $emit 方法触发勾选事件,将当前行的row作为参数传递给父组件
  • handleChangeCheckAll
    • 代表全选当前页 - 调用 $emit 方法触发勾选事件传递给父组件
  • progressoFormat
    • 用于格式化进度条的显示文本。该方法接收两个参数:percentage 表示进度百分比,status 表示进度状态
  • handleAvatarSuccess

    上传文件调用的方法

    • res-表示上传成功的响应对象
    • index-表示索引值
    • row 表示行信息。
  • beforeAvatarUpload

    上传文件判断文件类型和大小,根据条件决定是否压缩文件,并将结果返回给上传组件。同时,也会触发上传事件,并将索引值传递给父组件。

  • getFontColorIsBlue(getFontColorIsBlue1,getFontColorIsBlue2)
    • 判断是否给表格某列的添加类名,对文字颜色进行改变
  • getColumnValue(getColumnValue1,getColumnValue3)
    • 用来格式化内容
  • getColumnBg
    • 判断是否给该行添加背景类名
  • getColumnClass(getColumnClass1,getColumnClass2)
    • 判断是否给该行添加文字类名
  • getWidth
    • 设置每一列宽度
  • getPadding
    • 设置每一列内间距
  • getButtonDisabled
    • 判断按钮是否禁用
  • getButtonDisplay
    • 判断按钮是否隐藏显示
  • handleJudgeOperate
    • 判断该列是否隐藏显示
  • handleListenerScroll
    • 表格滚动事件
  • combinedScroll
    • 右侧侧固定列和表格内容的联动滚动
  • handleClickRow
    • 点击某一行
  • clearChooseData
    • 清除选中的内容

完整代码

commonTable.vue

<template>
  <div
    class="h-common-table-container"
    v-if="data.length > 0"
  >
    <div
      class="common-table-box"
    >
      <div class="common-table-box-wrapper">
        <div class="common-table-header">
          <div
            v-for="(column, index) in columns"
            :key="index"
            :style="[
              { width: getWidth(column.width, column) },
              { textAlign: column.position || 'left' },
              {
                paddingLeft:
                  column.position != 'center' && getPadding(column.paddingLeft)
              },
              {
                paddingRight:
                  column.position == 'right' && getPadding(column.paddingRight)
              },
              {
                display: column.isCheckBox ? 'flex' : '',
                justifyContent: column.isCheckBox ? 'center' : '',
                alignItems: column.isCheckBox ? 'center' : ''
              }
            ]"
            :class="[
              { 'no-padding': column.position == 'center' },
              {
                'padding-right': column.isButton && column.position == 'right'
              },
              { 'column-flex': column.sort },
              { 'column-date': column.isDate }
            ]"
            v-show="handelJudgeFixed(column) && !column.isHidden"
            @click.stop="handleClickSort(column)"
          >
            <el-checkbox
              v-if="column.isCheckBox"
              :disabled="titleChekcDisabled"
              v-model="titleCheck"
              @change="handleChangeCheckAll($event, columns)"
            ></el-checkbox>
            <span class="column-label" v-if="!column.isCheckBox">{
  {
              column.label
            }}</span>
            <span class="column-label-another" v-if="column.label2">{
  {
              column.label2
            }}</span>
            <div class="sort-box" v-if="column.sort">
              <span @click.stop="handleSortUp(column)"
                ><img
                  src="@/assets/img/up.png"
                  alt=""
                  v-if="sortValue != 1"/><img
                  src="@/assets/img/upChoose.png"
                  alt=""
                  v-if="sortValue == 1"
              /></span>
              <span @click.stop="handleSortDown(column)"
                ><img
                  src="@/assets/img/down.png"
                  alt=""
                  v-if="sortValue != 2"/><img
                  src="

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1333162.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【unity】关于unity3D摄像机视角移动的几种方式详解

目录 一、前言 二、Transform基础 1、几种坐标系 2、position和localPosition属性 3、rotation属性 三、摄像机的平移 1、键盘控制平移 2、鼠标控制平移 3、整合 四、摄像机的旋转 1、绕自身旋转 2、绕目标物体旋转 3、整合 五、优化功能 1、调整速率 2、切换…

【数据结构】布隆过滤器原理详解及其代码实现

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐--…

差生文具多之(二): perf

栈回溯和符号解析是使用 perf 的两大阻力&#xff0c;本文以应用程序 fio 的观测为例子&#xff0c;提供一些处理它们的经验法则&#xff0c;希望帮助大家无痛使用 perf。 前言 系统级性能优化通常包括两个阶段&#xff1a;性能剖析和代码优化&#xff1a; 性能剖析的目标是寻…

【期末考试】计算机网络、网络及其计算 考试重点

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 计算机网络及其计算 期末考点 &#x1f680;数…

Netty Review - 深入理解Netty: ChannelHandler的生命周期与事件处理机制

文章目录 概述CodeLifeCycleInBoundHandler 验证 概述 Netty的ChannelHandler是处理网络事件&#xff08;如数据读取、数据写入、连接建立、连接关闭等&#xff09;的核心组件。 在Netty中&#xff0c;ChannelHandler的生命周期与Channel的状态紧密相关&#xff0c;主要涉及到…

从mice到missForest:常用数据插值方法优缺点

一、引言 数据插值方法在数据处理和分析中扮演着至关重要的角色。它们可以帮助我们处理缺失数据&#xff0c;使得数据分析更加准确和可靠。数据插值方法被广泛应用于金融、医疗、社会科学等领域&#xff0c;以及工程和环境监测等实际应用中。 在本文中&#xff0c;我们将探讨三…

制作小米导航实验

一、实验题目 制作一个小米"手机"的标签&#xff0c;当鼠标移动到"手机"上后&#xff0c;显示右边的白色菜单&#xff0c;当鼠标离开"手机"时&#xff0c;菜单消失。 二、实验代码 <!DOCTYPE html> <html lang"en"> <…

高级人工智能之群体智能:蚁群算法

群体智能 鸟群&#xff1a; 鱼群&#xff1a; 1.基本介绍 蚁群算法&#xff08;Ant Colony Optimization, ACO&#xff09;是一种模拟自然界蚂蚁觅食行为的优化算法。它通常用于解决路径优化问题&#xff0c;如旅行商问题&#xff08;TSP&#xff09;。 蚁群算法的基本步骤…

python分割字符串 split函数

split函数用于字符串的分割&#xff0c;可以完成基于特定字符将字符串分割成若干部分并存于列表中 url "http://localhost:5000/static/images/DICOMDIR 5.26-6.1/10283674_GOUT_5_0_2.png" # 获取最后一个_的前一个数字 parts url.split(/) print(parts)在这里讲…

Kali Linux—借助 SET+MSF 进行网络钓鱼、生成木马、获主机shell、权限提升、远程监控、钓鱼邮件等完整渗透测试(二)

远控木马 SET 同时集成了木马生成工具&#xff0c;可以生成木马并调用MSF框架对远程主机进行控制。直接使用MSF生成木马并控制主机的可参考之前另一篇博文&#xff1a;渗透测试-Kali入侵Win7主机。 控制主机 1、运行 SET&#xff0c;选择创建攻击载荷和监听器&#xff1a; 2…

Tomcat日志乱码了怎么处理?

【前言】 tomacat日志有三个地方&#xff0c;分别是Output(控制台)、Tomcat Localhost Log(tomcat本地日志)、Tomcat Catalina Log。 启动日志和大部分报错日志、普通日志都在output打印;有些错误日志&#xff0c;在Tomcat Localhost Log。 三个日志显示区&#xff0c;都可能…

ETN21与CJ2M-CPU33通讯

实验设备:CJ2M-CPU33,CJ1W-EIP21,交叉网线 实验目的:手动建立数据链接表,建立TAG通讯。 实验步骤: IP地址设置:①usb线连上电脑,打开I/O表,将ETN21模块的ip地址与CJ2M-CPU33设置为同一个网段不同节点,节点号跟硬件上的node number一样,下载重启模块,如下: 配置n…

百分百能遇到的接口自动化测试面试题,看完的现在已经在办理入职了...

1. 什么是接口自动化测试&#xff1f; 答&#xff1a;接口自动化测试是指使用自动化工具对接口进行测试&#xff0c;验证接口的正确性、稳定性和性能等方面的指标。 2. 为什么要进行接口自动化测试&#xff1f; 答&#xff1a;接口自动化测试可以提高测试效率&#xff0c;减…

Redis源码精读:准备工作

文章目录 前言拉取源码项目结构源码阅读技巧最后 前言 我是醉墨居士&#xff0c;未来的一段时间里面我准备写一些关于Redis源码的文章&#xff0c;来帮助大家深入浅出Redis&#xff0c;希望大家多多支持&#x1fae0; 拉取源码 git clone https://github.com/redis/redis项目…

Spring5底层原理之BeanFactory与ApplicationContext

目录 BeanFactory与ApplicationContext BeanFactory ApplicationContext 容器实现 BeanFactory实现 ApplicationContext实现 ClassPathXmlApplicationContext的实现 AnnotationConfigApplicationContext的实现 AnnotationConfigServletWebServerApplicationContext的实…

驱动开发-1

一、驱动课程大纲 内核模块字符设备驱动中断 二、ARM裸机代码和驱动有什么区别&#xff1f; 1、共同点&#xff1a; 都能够操作硬件 2、不同点&#xff1a; 1&#xff09;裸机就是用C语言给对应的寄存器里面写值&#xff0c;驱动是按照一定的套路往寄存器里面写值 2&#xff09…

为什么有的开关电源需要加自举电容?

一、什么是自举电路&#xff1f; 1.1 自举的概念 首先&#xff0c;自举电路也叫升压电路&#xff0c;是利用自举升压二极管&#xff0c;自举升压电容等电子元件&#xff0c;使电容放电电压和电源电压叠加&#xff0c;从而使电压升高。有的电路升高的电压能达到数倍电源电压。…

阶段十-物业项目

可能遇到的错误&#xff1a; 解决jdk17javax.xml.bind.DatatypeConverter错误 <!--解决jdk17javax.xml.bind.DatatypeConverter错误--><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>…

git 使用方法自用(勿进)本地开发分支推上线上开发分支

一、//查看状态 1.git status 二、//查看改了哪个文件夹 1.git diff 2.//会出现改了哪个文件夹src/components/partials/Slider.js 三、//查看改了的文件夹里面具体改了啥内容 1.git diff src/components/partials/Slider.js 四、提交所有 1. git add . 五、写备注…

连锁便利店管理系统有什么用

连锁便利店管理系统对于连锁便利店的运营和管理非常有用。以下是一些常见的用途&#xff1a; 1. 库存管理&#xff1a;连锁便利店通常需要管理多个门店的库存&#xff0c;管理系统可以帮助实时掌握各个门店的库存情况&#xff0c;包括商品数量、进货记录、库存调拨等。这样可以…