Vue3 + TS + Element-Plus 封装的 Table 表格组件

代码中主要增加了3个插槽,operationsStart 从操作栏开头增加按钮,operationsStart 从操作栏结尾增加按钮,还有一个插槽用来自定义列的内容,就是 TableModel里面的Key

<template><el-tableborderstripe:data="data":height="tableHeight"table-layout="fixed":row-key="rowKey":highlight-current-row="highlightCurrentRow":tree-props="treeProps":header-cell-style="{background: '#f5f7fa',color: '#606266',fontSize: '13px',}"@selection-change="handleSelectionChange":v-loading="loading":row-class-name="tableRowClassName":expand-row-keys="expandRowKeys"class="absolute"><el-table-columnv-if="showSelection"align="center"fixedtype="selection"width="55"/><el-table-columnv-for="tableModel in tableModels":key="tableModel.key":prop="tableModel.key":label="tableModel.label":width="tableModel.width":min-width="tableModel.minWidth":align="tableModel.align":header-align="tableModel.headerAlign"><template #default="{ row }"><slotv-if="slots[tableModel.key]":name="tableModel.key"v-bind="row"></slot><span v-else>{{ row[tableModel.key] }}</span></template></el-table-column><el-table-columnfixed="right"label="操作":width="operationsWidth":min-width="minWidth":align="operationsAlign":header-align="operationsHeaderAlign"v-if="shoeOperations"><template #default="{ row, $index }"><slot name="operationsStart" v-bind="row"></slot><el-buttonlinktype="primary":icon="Edit"@click="handleEdit(row, $index)":v-hasPerm="editHasPerm"v-if="showEditBtn">编辑</el-button><el-button@click="handleDelete(row, $index)"linktype="danger":icon="Delete"v-if="showDeleteBtn":v-hasPerm="deleteHasPerm">删除</el-button><slot name="operationsEnd" v-bind="row"></slot></template></el-table-column></el-table>
</template>
<script setup lang="ts">
/** @slot default 插槽* operationsStart 从操作栏开头增加按钮* operationsStart 从操作栏结尾增加按钮* Key TableModel里面的Key,用来自定义列的内容* */import { Delete, Edit } from "@element-plus/icons-vue";// 【接口】table表格模型
interface ITableModel {// 表头显示文字label: string;// 表格列Keukey: string;// 表格列宽width?: number | string;// 表格列显示文字value?: string;// 表格内容位置align?: string;// 表格表头位置headerAlign?: string;// 列最小宽度minWidth?: number | string;
}// 【接口】接受传参字段
interface IProps {// 生成表格参数tableModels?: ITableModel[];// 表格数据data: object[];// 是否为树形表格treeProps?: Object;// 加载状态loading?: boolean;// 表格行KeurowKey?: any;// 表格高度height?: any;// 表格自适应减去的高度// eslint-disable-next-line vue/prop-name-casingdynamic?: number;// 表格单选highlightCurrentRow?: boolean;// 是否显示编辑按钮showEditBtn?: boolean;// 是否显示多选框showSelection?: boolean;// 是否显示删除按钮showDeleteBtn?: boolean;// 删除权限deleteHasPerm?: any;// 编辑权限editHasPerm?: any;// 操作栏宽度operationsWidth?: number;// 是否显示操作栏shoeOperations?: boolean;// 操作栏内容位置operationsAlign?: string;// 操作栏头部位置operationsHeaderAlign?: string;// 操作栏最小宽度minWidth?: number | string;// 树表格时默认展开参数expandRowKeys?: any;
}// 【接口】分页
interface IPage {// 当前页pageNum: number;// 每页显示条数pageSize: number;
}// 初始化默认参数
const props = withDefaults(defineProps<IProps>(), {loading: false,rowKey: "id",dynamic: 0,showEditBtn: true,highlightCurrentRow: false,showSelection: false,showDeleteBtn: true,deleteHasPerm: [],editHasPerm: [],shoeOperations: true,operationsWidth: 150,operationsAlign: "center",operationsHeaderAlign: "center",expandRowKeys: [],
});// 插槽对象
const slots = useSlots();// 定义组件发出的事件
const emit = defineEmits(["handleEdit","handleDelete","handlePagination","handleSelectionChange","handlePage",
]);const tableHeight = ref<any>();// watch监听动态计算table的高度,根据dynamic是否大于0,dynamic层级大于height
watch([() => props.height, () => props.dynamic],([height, dynamic]) => {if (height && !dynamic) {tableHeight.value = height;} else if ((!height && dynamic) || (height && dynamic)) {// 获取浏览器窗口高度const windowHeight = window.innerHeight;tableHeight.value = windowHeight - dynamic;} else {tableHeight.value = "auto";}},{deep: true,immediate: true,}
);// 增加样式Class
const tableRowClassName = ({row,rowIndex,
}: {row: Object;rowIndex: number;
}) => {if (rowIndex % 2 === 1) {return "warning-row";}return "";
};// 点了多选
const handleSelectionChange = (val: ITableModel[]) => {emit("handleSelectionChange", val);
};// 点击了编辑
const handleEdit = (data: object, index: number) => {emit("handleEdit", data, index);
};// 点击了删除
const handleDelete = (data: object, index: number) => {emit("handleDelete", data, index);
};
</script>

使用案例

<Table:dynamic="dynamicHeight":tableModels="table.tableModels":data="table.data":loading="table.loading":showSelection="table.showSelection":operationsWidth="table.operationsWidth"@handle-edit="openDialog"@handle-delete="handleDelete"@handle-selection-change="handleSelectionChange"><!-- 自定义列【status】字段 --><template #status="scope"><el-tag size="small" v-if="scope.status === 1" type="success">正常</el-tag><el-tag size="small" v-else type="info">禁用</el-tag></template><!-- 操作栏从开头增加按钮 --><template #operationsStart="scope"><el-buttontype="primary"size="small"link:icon="Position"@click="openMenuDialog(scope)">分配权限</el-button></template></Table>

渲染表格的数据

const table = reactive({tableModels: [{label: "角色名称",key: "name",align: "left",headerAlign: "center",value: "name",minWidth: 200,},{label: "角色编码",key: "code",width: 200,align: "center",headerAlign: "center",value: "code",},{label: "数据权限",key: "dataScope",width: 200,align: "center",headerAlign: "center",value: "dataScope",},{label: "状态",key: "status",width: 200,align: "center",headerAlign: "center",value: "status",},{label: "排序",key: "sort",width: 200,align: "center",headerAlign: "center",value: "sort",},],data: [] as any[],showSelection: true,operationsWidth: 250,loading: false,
});

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

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

相关文章

sgg_ssm学习--前端搭建遇到的问题

目录 问题1&#xff1a;由于我是解压缩软件nodejs&#xff0c;没有添加系统路径 解决&#xff1a;添加nodejs的路径 到系统 path中 问题2&#xff1a;vscode 终端输入npm命令 报错 解决(如图所示在vscode打开前端工程&#xff0c;终端修改如下配置)&#xff1a; 问题1&…

如何在iPhone上恢复出厂设置后恢复数据

你不想让这种情况发生&#xff0c;但它确实发生了。您必须将iPhone恢复出厂设置。当您的 iPhone 上出现软件问题且无法修复时&#xff0c;可能会发生这种情况。相反&#xff0c;在更新期间&#xff0c;或者您的iPhone遇到问题时&#xff0c;iPhone上的数据不再存在。 不过不用…

Spark SQL编程初级实践

参考链接 Spark编程: Spark SQL基本操作 2020.11.01_df.agg("age"->"avg")-CSDN博客 RDD编程初级实践-CSDN博客 Spark和Hadoop的安装-CSDN博客 1. Spark SQL基本操作 { "id":1 , "name":" Ella" , "age":…

使用多网络和Kubernetes转变您的通讯应用程序

传统的 Kubernetes 网络在基本的 Pod 到 Pod 连接方面表现出色&#xff0c;但在满足通讯工作负载的安全性、性能和合规性要求时可能存在不足。这限制了通讯提供商充分利用 Kubernetes 的可扩展性和敏捷性优势的能力。 Google Cloud 的多网络方法使通讯提供商能够克服这些限制&a…

笔记-PPT绘图导出高清无失真图片

问题描述&#xff1a;PPT绘图已经用了高清图&#xff08;jpg、tif格式&#xff09;&#xff0c;但论文图片还是不清晰&#xff0c;打印出来还是有点糊 以下是PPT导出高清不失真图片&#xff08;emf格式&#xff09;的具体描述。 目录 一、绘图工具二、操作步骤 一、绘图工具 …

数据挖掘之基于Lightgbm等多模型消融实验的信用欺诈检测实现

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 在当前的金融环境中&#xff0c;信用欺诈行为日益增多&#xff0c;给金融机构和消费者带来了巨大的损…

【已解决】pandas读excel中长数字变成科学计数法的问题

pandas 读excel中的长数字时&#xff0c;即使excel中已经设置为文本&#xff0c;读进df后也会自动变成科学计数法。 在日常的数据分析和处理工作中&#xff0c;Excel和pandas是数据分析师们不可或缺的得力助手。然而&#xff0c;在使用pandas读取Excel文件时&#xff0c;我们有…

Spring Boot的热部署工具“AND”Swagger测试工具

Spring Boot的热部署&Swagger测试页面的使用 热部署指的是在项目无需重启的情况下&#xff0c;只需要刷新页面&#xff0c;即可获得已经修改的样式或功能。要注意该工具一般用于开发环境&#xff0c;在生产环境中最好不要添加这个工具。 对于无需重启便可刷新这么方便的工…

【linux-1-Ubuntu常用命令-vim编辑器-Vscode链接ubuntu远程开发】

目录 1. 安装虚拟机Vmare和在虚拟机上安装Ubuntu系统&#xff1a;2. 常用的Ubuntu常识和常用命令2.1 文件系统结构2.2 常用命令2.3 vim编辑器 3. Ubuntu能联网但是ping不通电脑&#xff1a;4. Windows上安装VScode链接ubuntu系统&#xff0c;进行远程开发&#xff1a; 1. 安装虚…

理解sourcemap:调试和部署的利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

根据顶层的id递归查询出全部子节点

效果图 根据输入的id为2查询出所有的红色框起来的节点 mapper接口 TSystemOrg getOrgByorgId(String orgId); List<TSystemOrg> getOrgListByParentId(String parentId);mapper.xml <!--根据id查询org--> <select id"getOrgByorgId" resultType&…

【JVM】简述类加载器及双亲委派机制

双亲委派模型&#xff0c;是加载class文件的一种机制。在介绍双亲委派模型之前&#xff0c;我需要先介绍几种类加载器&#xff08;Class Loader&#xff09;。 1&#xff0c;类加载器 Bootstrap&#xff0c;加载lib/rt.jar&#xff0c;charset.jar等中的核心类&#xff0c;由…

【算法】【贪心算法】【leetcode】870. 优势洗牌

题目地址&#xff1a;https://leetcode.cn/problems/advantage-shuffle/description/ 题目描述&#xff1a; 给定两个长度相等的数组 nums1 和 nums2&#xff0c;nums1 相对于 nums2 的优势可以用满足 nums1[i] > nums2[i] 的索引 i 的数目来描述。 返回 nums1 的任意排列&…

界面组件DevExpress中文教程 - 如何在Node.js应用中创建报表?

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 获取DevExpress Reporting最新正式版下载(Q技术…

【SQL Server】入门教程-基础篇(三)

目录 前言 SQL 常用函数学习 AVG – 平均值 COUNT – 汇总函数 ​编辑MAX – 最大值 ​编辑MIN – 最小值 ​编辑SUM – 求和 UCASE/UPPER – 大写 LCASE/LOWER – 小写 ROUND – 数值取舍 NOW/SYSDATE – 当前时间 前言 这一篇博客&#xff0c;是Sql Server函数学…

本地构建编译Apache-Seatunnel2.3.5适配Web1.0.0运行实现Mysql-CDC示例

本地构建编译Apache-Seatunnel2.3.5适配Web1.0.0运行实现Mysql-CDC示例 文章目录 1.前言2.编译2.1版本说明2.2 seatunnel2.3.4-release分支配置2.3maven调优配置 3.web1.0.0适配3.1配置文件修改和新增文件3.2手动拷贝jar修改依赖3.3修改web不兼容的代码3.4 web编译打包 4.运行m…

什么是 Web3 的生成式 AI?

从 Web 1.0 的静态、单向通信到 Web 2.0 的动态、用户驱动的格局&#xff0c;互联网在二十年的时间里经历了一场显着的转变。现在&#xff0c;当我们站在 Web 3.0 时代的边缘时&#xff0c;我们正在见证更具颠覆性的事物的曙光&#xff1a;生成式人工智能 (AI) 融入我们的数字世…

DB-GPT部署验证

一、DB-GPT简介 DB-GPT是一个开源的数据库领域大模型框架。目的是构建大模型领域的基础设施&#xff0c;通过开发多模型管理、Text2SQL效果优化、RAG框架以及优化、Multi-Agents框架协作等多种技术能力&#xff0c;让围绕数据库构建大模型应用更简单&#xff0c;更方便。 GITHU…

找不到msvcr120.dll怎么办,msvcr120.dll丢失的5种修复方法分享

计算机系统在运行某应用程序时无法正常启动&#xff0c;具体表现为缺少了一个至关重要的动态链接库文件——msvcr120.dll。这个DLL文件是微软Visual C Redistributable Package的一部分&#xff0c;对于确保许多基于Windows平台的软件能够顺利运作起着不可或缺的作用。msvcr120…

C、Minimizing the Sum(线性dp)

思路&#xff1a; 用dp[i][j] 来表示前i个数操作了j次的最小和&#xff0c;然后对于每个a[i]&#xff0c;我们分别枚举i前面操作了x次以及后面操作了j次&#xff0c;对于每次操作&#xff0c;都是将一段区间全换位区间最小值. 代码&#xff1a; void solve(){int n, k;cin &…