二次封装 element-plus的Table 表格组件,减少代码臃肿

news2024/11/18 19:54:04

为什么要二次封装element-plus的Table 表格组件,言简意赅:以后难免会在表格里面加一些统一的逻辑,可以在表格里面书写重复的方法或样式

封装后的使用方式

props

参数类型可选值默认值说明
tableDataArray表格数据
tableConfigArray表格配置数组,具体格式如下

element-plus Table API 的所有参数传入一样有效

tableConfig 数据格式如下


[
  {
    title: "标题",
    field: "fund_name",//__index和__checkbox 保留field 用于序号和选择框
    align: "left",
    width: 200,
    needTitle: true,
    setColor: true,
    format: 1,
    cellClass: "", //String||(rowData)=>{return String}
    headerClass: "", //String||(rowData)=>{return String}
  },
]

封装逻辑

  1. 首先我们需要一个表格的根组件去引用element-plus,然后根据数据循环
<template>
    <el-table :data="props.tableData" fit size="small" :border="true">
        <el-table-column v-for="item in computedTableConfig" :key="item.field" v-bind="item.tableProps">
            <template #default="scope">
                <slot :name="item.columnDynamicSlotName" :index="scope.$index" :data="scope.row[item.field]"
                    :rowData="scope.row" :config="scope.column">
                    <DataItem :val="scope.row[item.field]" :formatData="item.dataFormat"></DataItem>
                </slot>
            </template>
        </el-table-column>
    </el-table>
</template>

<script lang="ts" setup>
import DataItem from './common/data-item.tsx'
import { FormatData } from './common/data-item.tsx'

export interface TableConfigItem extends FormatData {
    show_name?: string
    field: string
    title?: string
    isFixed?: boolean
    width?: number
    minWidth?: number
    align?: 'left' | 'center' | 'right'
}

interface ElTableColumnPropsTypes {
    fixed?: boolean
    prop?: string
    label?: string
    width?: number
    minWidth?: number
    align?: 'left' | 'center' | 'right'
}

interface ComputedTableConfigItemTypes {
    field: string
    columnDynamicSlotName: string /*  对外暴露的插槽名称*/
    dataFormat: FormatData
    tableProps: ElTableColumnPropsTypes
}
const props = defineProps<{
    tableConfig: TableConfigItem[]
    tableData: any[]
}>()

const computedTableConfig = computed<ComputedTableConfigItemTypes[]>(() => {
    return props.tableConfig.map((item) => {
        const _item: ComputedTableConfigItemTypes = {
            field: item.field,
            columnDynamicSlotName: 'column_' + item.field,
            dataFormat: {},
            tableProps: {}
        }
        for (const key in item) {
            if (key == 'field') {
                _item.tableProps.prop = item[key]
            }
            if (key == 'isFixed') {
                _item.tableProps.fixed = item[key]
            }
            if (key == 'title') {
                _item.tableProps.label = item[key]
            }
            if (['align', 'width', 'minWidth'].includes(key)) {
                _item.tableProps[key] = item[key]
            }
            if (['setColor', 'needTitle', 'format', 'suffix', 'prefix'].includes(key)) {
                _item.dataFormat[key] = item[key]
            }
        }
        return _item
    })
})
</script>

  1. 然后封装处理每一个单元格DataItem的组件(此处我用的是TSX组件)
import { defineComponent } from 'vue'
export interface FormatData extends FormatDataType {
    setColor?: boolean /* 设置颜色 */
    needTitle?: boolean /* 是否需要标题 */
}

export default defineComponent({
    name: 'data-item',
    props: {
        formatData: {
            // 表格数据
            default: () => {},
            type: Object
        },
        val: {
            required: true
        }
    },
    render() {
        let { setColor = false, needTitle = false } = this.formatData
        let _color = {}
        if (setColor) {
            let _num = parseFloat(res)
            _num = isNaN(_num) ? 0 : _num
            _color = _num ? (_num > 0 ? {color:'red'} : {color:'#999999'}) : ''
        } // 条件判断可以加
        return (
            <div style={_color} title={needTitle ? res : ''}>
                {res}
            </div>
        )
    }
})

  1. 然后测试组件的实现
<template>
    <div>
        <h2 style="color: red;" :style="{ color: red }">表格1</h2>
        <Htable :tableConfig="tableConfig" :tableData="tableData"></Htable>
    </div>
</template>

<script setup lang='ts'>
import { ref } from 'vue'
import Htable from "./Htable/index.vue";

const value1 = ref(0)
const tableConfig = [
    {
        title: "标题",
        field: "tit",
        align: "left",
        width: 200,
        needTitle: true,
    },
    {
        title: "姓名",
        field: "name",
        align: "left",
        width: 200,
        needTitle: true,
    },
    {
        title: "身高",
        field: "height",
        align: "left",
        needTitle: true,
        setColor: true,
        format: 1,
    },
]
const tableData = [
    {
        tit: '撒旦发生',
        name: '撒打发',
        height: 12
    },
    {
        tit: '撒旦发qw生',
        name: '撒打发',
        height: 123
    },
    {
        tit: '撒旦发qwe生',
        name: '撒打发',
        height: 123
    },
    {
        tit: '撒旦发qw生',
        name: '撒打发',
        height: 31
    }
]
</script>

<style lang='less' scoped></style>

下面效果图
在这里插入图片描述

如果有帮助到你的话,点个赞吧!
在这里插入图片描述

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

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

相关文章

【MySQL | 第四篇】区分SQL语句的书写和执行顺序

文章目录 4.区分SQL语句的书写和执行顺序4.1书写顺序4.2执行顺序4.3总结4.4扩充&#xff1a;辨别having与where的异同&#xff1f;4.5聚合查询 4.区分SQL语句的书写和执行顺序 注意&#xff1a;SQL 语句的书写顺序与执行顺序不是一致的 4.1书写顺序 SELECT <字段名> …

小程序学习 1

pages/goods/search/home.wxml首页功能设定 1. loading入场 2. 下拉刷新 3. 搜索栏 4. 分类切换 5. 商品列表 6. 规格弹层 7. 加载更多 <view style"text-align: center; color: #b9b9b9" wx:if"{{pageLoading}}"><t-loading theme"circula…

springboot-整合mybatis

1.导入依赖 <!--整合mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency><!--mysql--><dependen…

如何在Windows中对硬盘进行分区?这里有详细步骤

本文介绍如何在Windows11、10、8、7、Vista和XP中对硬盘进行分区 如果这个过程听起来比你想象的要复杂一点,不要担心,因为事实并非如此。在Windows中对硬盘进行分区一点也不难,通常只需要几分钟。以下是操作方法。 注意:这些说明适用于Windows 11、Windows 10、Windows 8…

Linux文件系列: 深入理解缓冲区和C标准库的简单模拟实现

Linux文件系列: 深入理解缓冲区和C标准库的简易模拟实现 一.缓冲区的概念和作用二.一个样例三.理解样例1.样例解释2.什么是刷新? 四.简易模拟实现C标准库1.我们要实现的大致框架2.mylib.h的实现1.文件结构体的定义2.myfopen等等函数的声明3.完整mylib.h代码 3.myfopen函数的实…

JEECMS相关语法最近更新(大家等一等,我刚开始写,有问题就问因为我也在做,发的都是实现得了)

JEECMS相关语法 1.[cms_channel_list parentId217]显示栏目标题图片与标题2.[cms_content_list count4 orderBy4 typeId1,2,3,4 titLen10 channelOption1 channelId96]显示内容图片与标题3.[cms_channel pathxypj]、[cms_content_list typeId1,2,3 count6 orderBy4 channelId22…

uniapp列表进入动画

app列表入场动画 - DCloud 插件市场 列表入场动画https://ext.dcloud.net.cn/plugin?id16957

为什么智能制造离不开MES管理系统

在当今日新月异的智能制造领域&#xff0c;MES管理系统以其独特的优势&#xff0c;成为引领车间智能化的核心技术系统。它不仅仅是一个简单的软件工具&#xff0c;更是企业实现生产优化、流程简化、效率提升、成本降低以及质量优化的重要支撑。 在生产工厂中&#xff0c;MES管…

传统网络组网配置

锐捷实验 一、核心1 开局MLAG组网(厂商初始化工作)1.1 peerlink&#xff1a;1.2 keepalive:1.3 vap domain 1 2 开局基础配置&#xff08;厂商初始化工作&#xff09;2.1 关闭 telnet 服务、web服务2.2 时钟 NTP2.3 LLDP封装&#xff1a;2.4 snmp2.5 日志&#xff1a;2.6 trap …

【竞技宝】LOL:knight阿狸伤害爆炸 BLG2-0轻取RA

北京时间2024年3月11日,英雄联盟LPL2024春季常规赛继续进行,昨日共进行三场比赛,首场比赛由BLG对阵RA。本场比赛BLG选手个人实力碾压RA2-0轻松击败对手。以下是本场比赛的详细战报。 第一局: BLG:剑魔、千珏、妮蔻、卡牌、洛 RA:乌迪尔、蔚、阿卡丽、斯莫德、芮尔 首局比赛,B…

weiphp5.0存在远程代码执行漏洞

@[toc] 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. weiphp5.0简介 微信公众号搜索:南风漏洞复…

啤酒:精酿啤酒与三明治的快捷搭配

在快节奏的现代生活中&#xff0c;人们总是追求简单、快捷的美食。而Fendi Club啤酒与三明治的搭配&#xff0c;正是满足了这一需求。它们以其方便的制作方式和美味的口感&#xff0c;成为了无数人的心头好。 Fendi Club啤酒&#xff0c;以其醇厚的口感和细腻的泡沫&#xff0c…

存内计算技术工具链——量化篇

本篇文章将重点讲述存内计算技术工具链之“量化”&#xff0c;我们将从面向存内计算芯片的深度学习编译工具链、神经网络中的量化&#xff08;包括训练后量化与量化感知训练&#xff09;、基于存内计算芯片硬件特性的量化工具这三个方面来对存内计算技术工具链的量化进行阐述。…

颜色检测python项目

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 什么是颜色检测&#xff1f; 颜色检测是检测任何颜色名称的过程。很简单不是吗&#xff1f;嗯&#xff0c;对于人类来说&#xff0c;这是一项极…

nvm下载及管理NodeJs版本,可随意切换,安装,卸载

nvm下载及管理NodeJs版本 nvm下载及管理NodeJs版本&#xff0c;可随意切换&#xff0c;安装&#xff0c;卸载

c++ primer plus笔记 第十八章 探讨c++新标准

复习前面的内容&#xff1a; 1.auto&#xff0c;可以自动识别auto本身在这种语境下是什么类型 2.decltype,让一个变量的类型和另外一个变量的类型相同 decltype(x) y;//让y的类型和x的类型相同 如何理解&#xff1f; decltype是一个关键词&#xff0c;其作用是检查括号内的…

【教程】APP备案全攻略:确保你的应用合规上线

【教程】APP备案全攻略&#xff1a;确保你的应用合规上线 摘要 本文详细介绍了中国大陆地区互联网信息服务提供者&#xff08;AP&#xff09;进行APP备案的流程、要求和注意事项。包括备案对象、备案方式、备案内容、备案流程等方面的详细说明&#xff0c;帮助开发者顺利完成…

微软模拟飞行器回放功能

参考b站up主&#xff0c;欢迎大家去关注&#xff1a;https://www.bilibili.com/video/BV1Z34y1P7zz/?spm_id_from333.880.my_history.page.click&vd_source4e0b40493e2382633fab2ddc1bb1d9cc 下载网址&#xff1a;https://flightsim.to/file/8163/flight-recorder 坠毁检…

微信公众号调用沙箱支付

沙箱支付 登录支付宝开放平台&#xff0c;选择底部沙箱支付 下载密钥生成工具 生成应用私钥与公钥&#xff0c;上传沙箱支付&#xff0c;获得支付宝公钥 配置支付通知与支付回调地址 SpringBoot配置 yml文件 这里的地址必须与沙箱配置的一样 controller package com.zq…

如何利用Python进行自动化测试和性能测试

在Python中&#xff0c;我们可以使用多种库和工具来执行自动化测试和性能测试。下面是一些示例代码&#xff0c;用于展示如何使用Python进行这两种类型的测试。 自动化测试 自动化测试通常使用诸如unittest或pytest这样的Python测试框架来执行。下面是一个使用unittest进行自…