如何二次封装一个el-table组件并二次复用

*注:示例使用的是vue3和element+进行二次封装的

首先我们来看效果图(总共可以分为以下几个模块):

  1. 表格数据操作按钮区域
  2. 表格信息提示区域
  3. 表格主体内容展示区域
  4. 表格分页区域

表单搜索没有封装在这里是为了降低代码的耦合性(有兴趣的可以查看我之前写的搜索框封装如何封装一个后管的输入框按钮组件基础版(可多次复用)_小羊集事笨的博客-CSDN博客)

以下是代码:

<script setup>
import { computed, ref } from "vue"
const props = defineProps({
  // 表格按钮个数
  btnArray: {
    type: Array,
    default: () => []
  },
  // 是否显示右侧提示
  showTip: {
    type: Boolean,
    default: false
  },
  // 表格数据
  tableData: {
    type: Array,
    default: () => []
  },
  //数据的条数
  total: {
    type: Number,
    default: 0
  },
  // 头部字段
  fields: {
    type: Array,
    default: () => []
  },
  // 字典(状态值,例如:0开始,1进行中,2结束)
  dict: {
    type: Object,
    default: () => {}
  },
  // 是否可选
  tableSelect: {
    type: Boolean,
    default: false
  },
  // 是否显示序号
  tableIndex: {
    type: Boolean,
    default: false
  },
  // 是否需要加载层
  loading: {
    type: Boolean,
    default: false
  },
  page: Number,
  pageSize: Number
})

const operation = ref(null)
// 动态计算操作列宽度
const winth = computed(() => {
  const length = operation.value?.$el.children.length
  const btnsWidth = length * 15 + length * 50
  return btnsWidth
})
// 车位总数
const sum = ref(666)
//动态计算占比
const Proportion = computed(() =>  props.total / sum.value )
const emit = defineEmits(["btnHandle", "selectionChange", "sizeChange", "currentChange"])

// 切换条数
const sizeChange = (ev) => {
  emit("sizeChange", ev)
}
// 切换页数
const currentChange = (ev) => {
  emit("currentChange", ev)
}

// 获取按钮颜色
const getColor = (name) => {
  if (name == "批量删除") {
    return ""
  }
  return "primary"
}

// 点击头部按钮
const btnHandle = (name) => {
  emit("btnHandle", name)
}

// 点击选择框
const selectionChange = (ev) => {
  emit("selectionChange", ev)
}

// 字典,处理数字对应的映射字段
const filterDictType = (value, array, code = "value", name = "label") => {
  if (!value && value !== 0) {
    // 要把0摘出来,一般0都是正常的数据,所以不能只用  !value
    return ""
  }
  const findObj = array.find((item) => item[code] === value.toString() || item[code] === +value) // 字符型数值型都得匹配

  if (find) {
    return findObj[name]
  } else {
    // 没有匹配的就原样返回
    return value
  }
}
</script>

<template>
  <el-card>
    <!-- 头部按钮 -->
    <div class="table-header">
      <div class="header-button">
        <el-button v-for="item in btnArray" :key="item" :type="getColor(item)" @click="btnHandle(item)">{{
          item
        }}</el-button>
      </div>

      <el-alert
        v-if="showTip"
        :title="`本园区共计 ${sum} 个车位,月卡用户 ${total}人,车位占有率 ${Proportion}%`" 
        show-icon
        :closable="false"
      />
    </div>
    <!-- 表格 -->
    <el-table :data="tableData" v-loading="loading" style="width: 100%" @selection-change="selectionChange">
      <el-table-column v-if="tableSelect" type="selection" width="55" />
      <el-table-column v-if="tableIndex" label="序号" type="index" width="55" />
      <template v-for="(item, index) in fields" :key="index">
        <el-table-column
          show-overflow-tooltip
          :prop="item.prop"
          :label="item.label"
          :width="item.label.indexOf('时间') >= 0 ? 220 : ''"
          min-width="140"
        >
          <template v-slot="{ row }">
            <!-- 处理根据不同的值显示不同的内容 -->
            <div v-if="item.dictType">
              {{ tableData.length && filterDictType(row[item.prop], dict[item.dictType]) }}
            </div>
            <!-- 可点击td -->
            <el-link v-else-if="item.isHandle" @click="tdHandle(row.id, item.label, row)">{{ row[item.prop] }}</el-link>
            <!-- 可解析html -->
            <span v-else-if="item.isHtml" v-html="row[item.prop]" />
            <span v-else>{{ row[item.prop] }}</span>
          </template>
        </el-table-column>
      </template>
      <!-- 操作列 -->
      <el-table-column ref="operation" :width="winth + 'px'" fixed="right" label="操作">
        <template v-slot="{ row }">
          <slot :row="row" />
        </template>
      </el-table-column>
    </el-table>
    <!-- 分页 -->
    <el-row justify="end">
      <el-pagination
        layout="total, sizes, prev, pager, next, jumper"
        :page-sizes="[10, 20, 30, 40, 50]"
        :total="total"
        :page-size="pageSize"
        :currentPage="page"
        @size-change="sizeChange"
        @current-change="currentChange"
      />
    </el-row>
  </el-card>
</template>

<style lang="scss" scoped>
.table-header {
  display: flex;
  justify-content: space-between;
  margin-bottom: 20px;
  .el-alert--info.is-light {
    height: 40px;
    font-size: 14px;
    border: 1px solid #91d5ff;
    background-color: #e6f7ff;
    :deep(.el-alert__title) {
      color: #000000d9;
    }
  }
}

.el-alert {
  width: auto;
}

.el-pagination {
  margin: 16px 0;
}

:deep(.el-card__body) {
  padding-bottom: 0;
}

.el-card.is-always-shadow {
  box-shadow: none;
  border: none;
}
</style>

这段代码是一个Vue组件,它定义了一个可重用的表格组件,具有以下功能:

  1. <script setup>标签中,使用Vue 3的definePropsdefineEmits函数定义了组件的属性(props)和事件(emits)。

    • btnArray:表格按钮的数组,默认为空数组。
    • showTip:是否显示右侧提示,默认为false。
    • tableData:表格数据的数组,默认为空数组。
    • total:数据的条数,默认为0。
    • fields:头部字段的数组,默认为空数组。
    • dict:字典,用于处理数字对应的映射字段,默认为空对象。
    • tableSelect:是否可选,布尔值,默认为false。
    • tableIndex:是否显示序号,布尔值,默认为false。
    • loading:是否需要加载层,布尔值,默认为false。
    • page:当前页数,数字类型。
    • pageSize:每页显示的条数,数字类型。
  2. 使用ref函数创建了operationsum的引用,以及计算属性winthProportion

    • operation:操作列的引用。
    • sum:车位总数,默认为666。
    • winth:动态计算操作列的宽度。
    • Proportion:动态计算数据条数占总数的比例。
  3. 使用defineEmits函数定义了四个事件:btnHandleselectionChangesizeChangecurrentChange

  4. 定义了一些辅助函数:

    • sizeChange:切换条数的函数,当条数发生变化时触发sizeChange事件。
    • currentChange:切换页数的函数,当页数发生变化时触发currentChange事件。
    • getColor:根据按钮名称返回按钮颜色的函数。
    • btnHandle:点击头部按钮的函数,当按钮被点击时触发btnHandle事件。
    • selectionChange:点击选择框的函数,当选择框的状态发生变化时触发selectionChange事件。
    • filterDictType:根据字典处理数字对应的映射字段的函数。
  5. <template>标签中,使用Element UI的组件构建了一个表格和分页器的布局。

    • <el-card>:卡片容器。
    • <div class="table-header">:表格头部,包含按钮和提示信息。
    • <el-button>:头部按钮,根据btnArray中的按钮数组动态生成。
    • <el-alert>:右侧提示信息,显示车位总数、总人数和占有率。
    • <el-table>:表格组件,用于显示表格数据。
    • <el-table-column>:表格列组件,根据fields数组动态生成表格列。
    • <el-link>:可点击的表格单元格。
    • <span>:普通的表格单元格。
    • <slot>:插槽内容,用于显示操作列的自定义按钮或组件。
    • <el-pagination>:分页器组件,根据数据条数、当前页数和每页条数进行分页。

这个表格组件可以根据传入的属性和事件进行配置,生成一个带有按钮、提示信息、可选、序号、加载层、分页等功能的表格,并支持自定义操作列的按钮或组件。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

rt-thread构建含c++源码的工程

RT-Thread Components > C/C and POSIX layerscons构建项目会出错&#xff1a; vim libraries/SConscript &#xff0c;删除 pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp&#xff08;切记不要注释&#xff0c;要删除&#xff09; 再次scons构建项目&#…

【FPGA】基于C5的第一个SoC工程

文章目录 前言SoC的Linux系统搭建 前言 本文是在毕业实习期间学习FPGA的SoC开发板运行全连接神经网络实例手写体的总结。 声明&#xff1a;本文仅作记录和操作指南&#xff0c;涉及到的操作会尽量细致&#xff0c;但是由于文件过大不会分享文件&#xff0c;具体软件可以自行搜…

手机定屏死机问题操作指南

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、定屏死机问题抓取 Log 要求二、 复现定屏死机问题后做什么三、检查adb是否可连的方法四、连接adb 抓取以下Log五、如果adb不可连&#xff0c;执行下…

多个信贷范围时客户主数据界面的定制(套头和信用缴纳范围=信贷范围)

客户主数据-销售范围-开票的界面有信贷范围&#xff0c;叫贷方控制范围。 但是默认是看不到的。需要进行配置。 但是SAP的配置里面的名字很奇怪&#xff0c;在客户账户组里面的销售数据中(OVT0)定制 双击后处理的这个界面&#xff0c;和界面的“”开票凭证“”对不上&#x…

SaleSmartly,客户满意度调查的绝对好助手

企业使用客户满意度调查来收集反馈并评估客户满意度水平&#xff0c;包括有关产品质量、服务、支持和整体满意度的问题。客户满意度调查的主要目标是直接从客户那里收集有价值的见解&#xff0c;以了解他们的需求、偏好和期望。这种反馈可以帮助企业确定需要改进的领域&#xf…

Fiddler抓包app(方便后端定位app调用的是那个接口?参数为何?)

一、抓http请求的包 1、设置Fiddler允许远程连接 选择Tools->Options 选择Connections选项卡&#xff0c;选中允许远程连接&#xff0c;如图所示 2、手机与电脑连接相同的wlan网络 3、手机wlan设置手动代理&#xff0c; 1&#xff09;手动代理的主机名设为电脑ip&…

5分钟给你破解这套10万赞的生产教程,访谈乔布斯的AI对话数字人视频是怎么做的

本期是赤辰第16期AI项目拆解栏目&#xff1b; 底部准备了7月粉丝福利&#xff0c;看完可以领取&#xff1b; 上周给粉丝们讲解AI动图说话月涨粉20万的案例并给出保姆式教程&#xff0c;粉丝反馈很热烈&#xff0c;都觉得AI强大&#xff0c;有些学员给自己账号做视频&#xff…

PID算法

PID&#xff0c;就是“比例&#xff08;proportional&#xff09;、积分&#xff08;integral&#xff09;、微分&#xff08;derivative&#xff09;”&#xff0c;是一种很常见的控制算法。 需要将一个物理量保持在稳定状态&#xff08;比如维持平衡&#xff0c;温度、转速的…

安全开发-PHP应用留言板功能超全局变量数据库操作第三方插件引用后台模块SessionCookieToken身份验证唯一性

文章目录 开发环境数据导入-mysql架构&库表列数据库操作-mysqli函数&增删改查数据接收输出-html混编&超全局变量第三方插件引用-js传参&函数对象调用身份验证-Cookie使用身份验证-Session使用唯一性判断-Token使用具体安全知识点&#xff1a;Cookie和Session都…

数据库应用:CentOS 7离线安装MySQL与Nginx

目录 一、理论 1.安装依赖 二、实验 1.离线安装MySQL与Nginx 2.离线安装Nginx 三、问题 1.执行nginx -v命令报错 四、总结 一、理论 1.安装依赖 &#xff08;1&#xff09;概念 安装依赖是指在软件开发中&#xff0c;为了运行或者编译一个程序或者库&#xff0c;在计…

基于小波哈尔法(WHM)的一维非线性IVP测试问题的求解(Matlab代码实现)

&#x1f4a5;1 概述 小波哈尔法&#xff08;WHM&#xff09;是一种求解一维非线性初值问题&#xff08;IVP&#xff09;的数值方法。它基于小波分析的思想&#xff0c;通过将原始问题转化为小波空间中的线性问题&#xff0c;然后进行求解。以下是一维非线性IVP测试问题的求解…

Android性能优化——启动优化

App 的启动速度是用户的第一体验&#xff0c;互联网中有一个八秒定律&#xff0c;如果用户等待八秒App 还没打开&#xff0c;70%的用户都会停止等待 一、启动分类 官方 App startup time 冷启动 耗时最多&#xff0c;衡量标准 热启动 最快。 后台&#xff5e;前台 温启动…

数据中心水浸事件,该如何找回安全?

数据中心是现代企业和组织中不可或缺的基础设施&#xff0c;承载着大量的敏感数据和关键业务运作。然而&#xff0c;水浸事件可能成为数据中心的巨大威胁&#xff0c;可能导致设备故障、数据丢失以及业务中断&#xff0c;给组织带来严重的损失和风险。 因此&#xff0c;为了保护…

linux之Ubuntu系列(八)用户管理 修改文件权限

修改文件权限 chown 修改拥有者 -R&#xff1a;递归更改文件属组&#xff0c;就是在更改某个目录文件的属组时&#xff0c;如果加上-R的参数&#xff0c;那么该目录下的所有文件的属组都会更改。 修改 文件|目录 的拥有者 sudo chown [-R] 用户名 文件名|目录 更改文件属主&…

pytest 参数化进阶

目录 前言&#xff1a; 语法 参数化误区 实践 简要回顾 前言&#xff1a; pytest是一个功能强大的Python测试框架&#xff0c;它提供了参数化功能&#xff0c;可以帮助简化测试用例的编写和管理。 语法 本文就赶紧聊一聊 pytest 的参数化是怎么玩的。 pytest.mark.par…

⛳ Java数组

Java数组的目录 ⛳ Java数组&#x1f3a8; 一&#xff0c;一维数组&#x1f463; 1.1&#xff0c;概念&#x1f4e2; 1.2&#xff0c;基本用法1&#xff0c;语法格式2&#xff0c;代码 &#x1f4bb; 1.3&#xff0c;内存结构&#x1f4dd; 1.4&#xff0c;练习 &#x1f381; …

DB-Engines排名公布 GBASE南大通用入围国产数据库TOP 3

什么是DB-Engines排名&#xff1f; DB-Engines排名是数据库领域的流行度榜单&#xff0c;它对全球范围内的419款数据库&#xff08;截至2023年7月&#xff09;进行排名&#xff0c;每月更新一次&#xff0c;排名越靠前&#xff0c;则表示越流行。在很多技术选型的场合&#xf…

亚信科技荣任「DBL电信行业工作组」副组长单位,AntDB数据库连年入选《中国数据库产品图谱》

日前&#xff0c;“2023可信数据库发展大会”在京圆满召开。亚信科技凭借自研的电信级核心交易数据库AntDB在通信行业15年的技术积累和行业贡献&#xff0c;成功当选为数据库应用创新实验室&#xff08;DBL&#xff09;电信行业工作组副组长单位。AntDB数据库连续两年入选《全球…

Stable Diffusion - 编辑生成 (OpenPose Editor) 相同人物姿势的图像

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131818943 OpenPose Editor 是 Stable Diffusion 的扩展插件&#xff0c;可以自定义人物的姿势和表情&#xff0c;以及生成深度、法线和边缘图等信…

学会在重装系统前如何备份软件,再也不怕失去珍贵的应用!

​Windows系统是电脑的重要组成部分&#xff0c;它不仅提供了友好的用户界面&#xff0c;还承担着许多关键的功能和任务&#xff0c;为我们提供了一个稳定、安全和效率的工作环境&#xff0c;使我们能够充分发挥电脑的潜力&#xff0c;优化工作效率和生活品质。 随着系统使…