vue3-ElmentPlus封装通用表格-含单元格操作-多选-分页器

news2024/11/30 7:44:05

Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-JS学习,CSS学习,Vue-2领域博主

**🐱‍🐉🐱‍🐉恭喜你,若此文你认为写的不错,不要吝啬你的赞扬,求收藏,求评论,求一个大大的赞!👍**


已经有很久没有写文章了,贪玩,摆烂,不想动,低情绪。

下半年遇到的不如意的事情太多了,极为烦躁,陷入迷茫,所幸现在清醒一些了。

之前的封装组件的时候,就在意,什么是好的组件封装?

总想着把事情做的全面一点,可是自己有不具备那样的实力,到头来还是要回归的项目需求的本身上来

“满足实际需求就是好的”

至于可扩展,兼容的问题实在是不能在每个需求来到是都一一考虑,现在我的水平也不够

所以必须谨记“满足实际需求就是好的”

此文为 Vue3 + ElementPlus 封装 通用表格组件的记录,以便后用

  • 最终源码在最后
  • 本文仅为 封装组件的 源码
  • 如何使用 不在此文 之内,见资源(包含使用示例+组件源码)

vue3-ElmentPlus封装通用表格源码


vue3-ElmentPlus封装通用表格

效果

请添加图片描述

通用功能包含

  • 表头、表格数据渲染(将表头、表格数据单独抽离出来)
  • 单元格操作(如:详情、修改,删除等位于 单元格最后)
  • 多选
  • 分页器
  • 内容居中

实现过程

  • 表头、表格数据渲染 的是标准模板 组件
  • 依次往里面 进行 修改

表头、表格数据渲染 (标准组件源码:myTable.vue

  • 将表头单独提取出来
  • 接收 表格数据 控制渲染
    • tableData 控制表格内容数据
    • tableController 控制表格表头数据
  • 注意 表格数据与表头数据的对应关系
// 表格内容数据
let tableData = {
	title1:`content`,
	title2:`content`,
}

// 表格表头数据
let tableController:[
    {key: 'title1', value: 'title1'},
    {key: 'title2', value: 'title2'},
    // type: 'template' 用于识别该列 是否 为操作列
    {key: '操作', value: 'opt', type: 'template', width: '180'}
  ]

  • 封装组件(myTable.vue)实现如下:
<template>
  <!-- 此处 可以 拓展 (elplus table 的特殊 表格props属性 ) -->
  <!-- :data="tableData" 绑定表格数据 -->
  <el-table :data="tableData" border style="width: 100%">
    <!-- 接受 传值 渲染 表头 -->
    <!-- 表头数据的 单独控制tableController -->
    <!-- 可控制宽度 -->
    <el-table-column
        v-for="t in tableController"
        :label="t.key"
        :prop="t.value"
        :width="t.width ? t.width : ''"
    >
   </el-table>
</template>
<script setup>
	// 接收 所有 props 传值
	const props = defineProps({
	  // 表格数据
	  tableData: {
	    type: Array,
	    default: []
	  },
	  // 表头数据
	  tableController: {
	    type: Array,
	    default: []
	  },
	})
</script>

单元格操作(如:详情、修改,删除等位于 单元格最后)

  • 预留插槽 使用表头数据中 type: ‘template’ 用于识别该列 是否 为操作列
  • (替换上面 (标准组件源码:myTable.vue) 的 )
<el-table-column
	v-for="t in tableController"
	:prop="t.value"
	:label="t.key"
	:width="t.width ? t.width : ''"
	>
  <!-- 预留插槽 (可选)-->
  <!-- #default="scope" 作用域插槽 使用子组件内部数据 -->
  <template #default="scope" v-if="t.type === 'template'">
    <slot :name="t.value" :row="scope.row"></slot>
  </template>
</el-table-column>

多选

  • 需要的 type="selection" 控制
  • 在(标准组件源码:myTable.vue) 标签中新增 如下
<!-- 多选(可选) -->
<el-table-column type="selection" width="50" v-if="selected"/>
  • JS中新增 接受值
const props = defineProps({
  // 是否加载多选
  selected: {
    type: Boolean,
    default: true
  }
})

分页器

  • 需要 引入 el-pagination
  • 盒 同级别引入
<!-- 分页器 (可选) -->
  <div v-if="pager">
    <el-pagination
        v-model:current-page="queryParams.pageNum"
        v-model:page-size="queryParams.pageSize"
        background
        :page-sizes="[10, 20, 50, 100]"
        layout="total, sizes, prev, pager, next, jumper"
        :total="total"
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
    />
  </div>
  • JS中新增
const props = defineProps({
  // 是否加载分页器
  pager: {
    type: Boolean,
    default: true
  },
})
// 分页器 默认数据
let queryParams = ref({pageNum: 1, pageSize: 10})

// 分页器处理函数
// 单页数据条数改变
function handleSizeChange(ev) {
  queryParams.value.pageSize = ev;
  emit('pagerFresh', JSON.parse(JSON.stringify(queryParams.value)))
}
// 页数改变
function handleCurrentChange(ev) {
  queryParams.value.pageNum = ev;
  emit('pagerFresh', JSON.parse(JSON.stringify(queryParams.value)))
}

内容局中

  • 在 所有的 的中加入 :align="center?'center':''"
<el-table-column :align="center?'center':''"/>

最终源码:

<template>
  <!-- 
    此处 可以 拓展 (elplus table 的特殊 表格props属性 ) 
    比如:树状表格、内容居中、表尾内容、固定行列等
    :header-cell-style="{'text-align':`${true}?'center':'auto'`}"
    :cell-style="{'text-align':`${true}?'center':'auto'`}"
  -->
  <!-- :data="tableData" 绑定表格数据 -->
  <el-table 
    :data="tableData" 
    border 
    style="width: 100%"
    >
    <!-- 多选(可选) -->
    <el-table-column :align="center?'center':''" type="selection" width="50" v-if="selected"/>
    <!-- 序号(应该可选才对-目前没有) -->
    <el-table-column :align="center?'center':''" type="index" label="序号" width="55"/>
    <!-- 接受 传值 渲染 表头 -->
    <!-- 表头数据的 单独控制tableController -->
    <!-- 可控制宽度 -->
    <el-table-column :align="center?'center':''"
        v-for="t in tableController"
        :prop="t.value"
        :label="t.key"
        :width="t.width ? t.width : ''"
    >
      <!-- 预留插槽 (可选)-->
      <!-- #default="scope" 作用域插槽 使用子组件内部数据 -->
      <template #default="scope" v-if="t.type === 'template'">
        <slot :name="t.value" :row="scope.row"></slot>
      </template>
    </el-table-column>
  </el-table>
  <!-- 分页器 (可选) -->
  <div class="pager-box" v-if="pager">
    <el-pagination
        v-model:current-page="queryParams.pageNum"
        v-model:page-size="queryParams.pageSize"
        background
        :page-sizes="[10, 20, 50, 100]"
        layout="total, sizes, prev, pager, next, jumper"
        :total="total"
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
    />
  </div>

</template>

<script setup>
import {ref} from "vue";

// 接收 分页器的分页操作处理函数
const emit = defineEmits(['pagerFresh'])
// 接收 所有 props 传值
const props = defineProps({
  // 表格数据
  tableData: {
    type: Array,
    default: []
  },
  // 表头数据
  tableController: {
    type: Array,
    default: []
  },
  // 分页所属--总数据条数
  total: {
    type: Number,
    default: 10
  },
  // 是否加载分页器
  pager: {
    type: Boolean,
    default: true
  },
  // 是否加载多选
  selected: {
    type: Boolean,
    default: true
  },
  // 内容居中
  center: {
    type: Boolean,
    default: true
  },
})
// 分页器 默认数据
let queryParams = ref({pageNum: 1, pageSize: 10})

// 分页器处理函数
// 单页数据条数改变
function handleSizeChange(ev) {
  queryParams.value.pageSize = ev;
  emit('pagerFresh', JSON.parse(JSON.stringify(queryParams.value)))
}
// 页数改变
function handleCurrentChange(ev) {
  queryParams.value.pageNum = ev;
  emit('pagerFresh', JSON.parse(JSON.stringify(queryParams.value)))
}
</script>

<style lang="scss" scoped>
// 内容居中
.text-center{
  text-align:center;
}

// 分页器位置
.pager-box {
  display: flex;
  justify-content: flex-end;
  margin-top: 50px;
}
</style>


🦖我是Sam9029,一个前端

文章若有错误,敬请指正🙏

**🐱‍🐉🐱‍🐉恭喜你,都看到这了,求收藏,求评论,求一个大大的赞👍!不过分吧**

Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-JS学习,CSS学习,Vue-2领域博主

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

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

相关文章

【测试】测试分类

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录测试分类&#xff08;大框架&#xff09;一、按照测试对象划分一&#xff09;可靠性测试二&#xff09;容错性测试三&#xff09;安装卸载测试&#xff08;万能公式中可以加上&#xff09;四&#xff09;内存泄漏测试…

合芯科技携手新享科技联合打造国产化项目管理系统解决方案

北京新享科技有限公司 北京新享科技有限公司&#xff0c;是上海合见工业软件集团控股的子公司。上海合见工业软件集团有限公司是自主创新的高性能工业软件及解决方案提供商&#xff0c;以EDA&#xff08;电子设计自动化&#xff0c;Electronic Design Automation&#xff09;领…

【实际开发03】- dto + vo - 先处理 dto , 后处理 vo ( 通常少一注解 )

目录 0. 建议 : 多用组合 , 少用继承 1. EqualsAndHashCode(callSuper true) - 解决允许调用父类 2. 序列化 ID : private static final long serialVersionUID 1L; 1. serialVersionUID 作用 : 序列化时为了保持版本的兼容性 3. 数据概览 ( 统计 ) : XxxxProfileVO 1.…

CAD常用命令:对象选择过滤器(FILTER)

CAD软件中为了方便绘图&#xff0c;有效地提升绘图效率&#xff0c;提供了很多CAD命令快捷键&#xff0c;而CAD对象选择过滤器作为CAD常见命令之一&#xff0c;在日常的CAD绘图过程中经常能用到&#xff0c;你知道CAD对象选择过滤器怎么用吗&#xff1f;本文小编就来给大家分享…

Qt解析Json数据

目录前言1.下载 jsoncpp 源码2.编译3.JSON数据读写示例4.jsoncpp核心类详解前言 本文主要介绍了使用Qt框架编程时如何解析JSON数据的一种方法。JSON是英文JavaScript Object Notation 的缩写&#xff0c;它是一种轻量级的数据交换格式&#xff0c;具有方便阅读和编写的优点&am…

Jenkins 项目的 gpg: signing failed: Bad passphrase 错误

因为我们项目需要使用 Jenkins 对文件进行签名。但是我们遇到了gpg: signing failed: Bad passphrase错误。原因和解决通常这个问题的原因是 Key 已经配置成功并且已经被命令行找到了。主要原因是你的秘钥密码配置的问题。这个配置有 2 个地方&#xff0c;第一个地方是项目的 P…

2022年度牛奶乳品行业数据:十大热门品牌销量排行榜

当前&#xff0c;随着经济的发展及人民生活水平的提高&#xff0c;牛奶乳品已经日趋成为人们在日常饮食中不可缺少的食物之一&#xff0c;市面上的产品种类也越来越多。并且&#xff0c;随着人们消费习惯的转变&#xff0c;牛奶乳品的消费场景也日益多元化。未来&#xff0c;预…

jdk1.8之函数式接口

l[TOC] 函数式接口概述 jdk1.8 引入了一个核心概念&#xff1a;函数式接口&#xff08;Functional Interface&#xff09;。如果一个接口有且只有一个未实现的方法&#xff0c;那这个接口就称为函数式接口。并且引入了一个新的注解&#xff1a;FunctionalInterface &#xff0…

一、Gradle入门

文章目录一、Gradle入门1.1 Gradle 简介1.2 常见的项目构建工具1.3 Gradle 安装1.3.1 Gradle 安装说明1.3.2 安装 JDK1.3.3 下载并解压到指定目录1.3.4 配置环境变量1.3.5 检测是否安装成功1.4 Gradle 项目目录结构1.5 Gradle 创建第一个项目1.5.1 Gradle 中的常用命令1.5.2 修…

【MySQL进阶教程】视图/存储过程/触发器

前言 本文为 【MySQL进阶教程】视图/存储过程/触发器 相关知识&#xff0c;下边将对视图&#xff0c;存储过程&#xff0c;存储函数&#xff0c;触发器等进行详尽介绍~ &#x1f4cc;博主主页&#xff1a;小新要变强 的主页 &#x1f449;Java全栈学习路线可参考&#xff1a;【…

MySQL高级【存储函数触发器】

1&#xff1a;存储函数1.1&#xff1a;介绍存储函数是有返回值的存储过程&#xff0c;存储函数的参数只能是IN类型的。具体语法如下&#xff1a; CREATE FUNCTION 存储函数名称 ([ 参数列表 ]) RETURNS type [characteristic ...] BEGIN -- SQL语句 RETURN ...; END ;character…

如何管理存量用户?

存量市场的老客户对于企业来说如同一座金矿&#xff0c;好好运营老客户&#xff0c;可以给企业带来源源不断的新客户&#xff0c;企业所获得的收益远比拉新所获收益要高的多。 前言 存量客户是指某个时间段里原先已有的客户&#xff0c;与新增客户相对应&#xff0c;通俗点说&…

Python开发Web扫描器实战

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是Python开发Web扫描器实战。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未…

机器学习--模型评估、过拟合和欠拟合、模型验证

目录 一、模型评估 模型指标 常见关于分类的指标 准确率 精确率(精确度) 召回率 F1 score PR曲线&#xff1a; ROC AUC 二、过拟合和欠拟合 训练与泛化误差的区别 什么样的情况会导致欠拟合与过拟合&#xff1f; 模型的复杂度&#xff08;能够拟合各种各样函…

分组加密模式 ECB CBC OFB CFB

多个分组加密互相之间如何关联 ECB模式 每个分组之间单独加密&#xff0c;互不关联 2个分组明文一样&#xff0c;结果也一样&#xff0c;那么只需爆破其中1个就可以了 每个分组互不关联&#xff0c;可以分段同时来爆破&#xff0c;不安全 可以通过替换某段密文来达到替换明…

11.Isaac教程--在docker中模拟训练姿势估计模型

在docker中模拟训练姿势估计模型 文章目录在docker中模拟训练姿势估计模型怎么运行的主机设置硬件要求软件要求NGC Docker 注册表设置第一次运行数据集生成配置您的工作区Jupyter 变量设置开始训练添加您自己的 3D 模型故障排除接下来物体检测和 3D 姿态估计在机器人技术中起着…

『精』EditorConfig 小老鼠 跨编辑器 | IDE 保持一致的编码风格

『精』EditorConfig 小老鼠 跨编辑器 | IDE 保持一致的编码风格 文章目录『精』EditorConfig 小老鼠 跨编辑器 | IDE 保持一致的编码风格一、什么是EditorConfig二、文件识别符三、风格属性控制四、不同规则参考1)、简洁通用2)、前端Vue项目3)、前端React项目4)、前端Angular项…

Linux常用命令——nm命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) nm 显示二进制目标文件的符号表 补充说明 nm命令被用于显示二进制目标文件的符号表。 语法 nm(选项)(参数)选项 -A&#xff1a;每个符号前显示文件名&#xff1b; -D&#xff1a;显示动态符号&#xff1b; …

成员变量-java循环机构

1.概念所谓的成员变量&#xff0c;是指在类中(不是方法或其他代码块)直接定义的变量。根据是否带有static关键字&#xff0c;成员变量又分为静态变量(类变量)、实例变量(对象变量)。成员变量在整个类的内部都有效&#xff0c;可以在当前类的任何方法中使用。另外如果成员变量不…

NFS介绍及服务器搭建

一、NFS 简介 NFS&#xff0c;英文全称 Network File System&#xff0c;主要功能&#xff1a;通过网络&#xff0c;让不同的机器、不同的操作系统可以共享文件。类似windows的共享文件夹 ​ NFS服务器共享本机目录&#xff0c;客户端机器挂载该目录后&#xff0c;就可以像自…