当前位置: 首页 > news >正文

vue 封装Table组件

基于element-plus UI 框架封装一个table组件

在项目目录下的components新建一个Table.vue

<template><section class="wrap"><el-tableref="table":data="tableData" v-loading="loading" style="width: 100%":stripe="stripe":border="border":row-key="(row) => { return row.id }"@selection-change="handleSelectionChange":height="tableHeight">// 复选框列 type="selection"<el-table-columnv-if="selection"type="selection"width="56"align="center":fixed="fixed"></el-table-column>// 序号列 type="index"<el-table-columnv-if="index"type="index"width="56"label="序号":fixed="fixed"></el-table-column><template v-for="(item, index) in tableProps" :key="index"><el-table-column :prop="item.prop" :label="item.label" :width="item.width" :type="item.type":show-overflow-tooltip="item.showOverflowTooltip" :align="item.align":fixed="item.fixed":sortable="item.sort":formatter="item.formatter"><template v-if="item.prop === 'operation'" #default="scope"><el-button size="small" type="success" @click="handleEdit(scope.row)">编辑</el-button><el-button size="small" type="danger" @click="handleDelete(scope.$index, scope.row)">删除</el-button><el-button size="small" type="warning" @click="handleAdd(scope.$index, scope.row)">新增</el-button></template></el-table-column></template></el-table></section>
</template><script setup>
import { ref, watch } from 'vue'const tableData = ref([])
const loading = ref(true)// 监听父组件传递过来的数据
watch(() => props.data, (val) => {tableData.value = valloading.value = false
})// 声明要触发的emits
const emits = defineEmits(['selectionChange','deleteItem', 'editItem', 'addItem'])// 父组件传递过来的props
const props = defineProps({data: {type: Array,default: () => [],},tableProps: {type: Array,},tableHeight: {type: String,default: '500'},selection: Boolean,index: Boolean,border: Boolean,stripe: Boolean,
})// 定义表格的列属性
const tableProps = ref([{type: 'selection',label: '',width: '55',align: 'center'},{type: 'index',label: 'No.',width: '55',align: 'center'},{prop: 'name',label: '姓名',width: '',showOverflowTooltip: true,align: 'center'},{prop: 'username',label: '用户名',width: 120,showOverflowTooltip: true,align: 'center'},{prop: 'email',label: '邮箱',width: '',showOverflowTooltip: true,align: 'center'},{prop: 'phone',label: '联系电话',width: '',showOverflowTooltip: true,align: 'center',// 单元格格式化函数,参考element-plus formatterformatter: (row) => {return `+86 ${ row.phone }`;},},{prop: 'website',label: '网址',width: '',showOverflowTooltip: true,align: 'center',},{prop: 'operation',label: '操作',align: 'center',formatter: (row,column) => {}}
])const handleAdd = (row) => {emits('addItem', row)
}const handleEdit = (rowData) => {emits('editItem', rowData)
}const handleDelete = (index, rowData) => {emits('deleteItem', index)
}const handleSelectionChange = (row) => {console.log('row data are: ', row[0].name)
}</script>

在具体的父组件中使用:

<template><section class="container"><section class="table-wrap"><Table :data="tableData" ref="table" borderstripe @selectionChange="handleSelectionChange" @editItem="handleEdit"@addItem="handleAdd"@deleteItem="handleDelete"></Table></section>// <span v-pre>{{ this will not be compiled }}</span></section>
</template><script setup>
import { ref, reactive, toRefs, onMounted } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import Table from '@/components/Table.vue'onMounted(() => {queryData()
})
const table = ref(null)const data = reactive({/*  materialForm: {materailName: '',materialCode: '',snCode: '',productCode: '',productName: '',result: '',workOrder: [],productLine: [],},loading: false,lineList: [],orderList: [],*/tableData: [],
})const { materialForm, lineList, orderList, tableData, loading } = toRefs(data)const title = ref("")const addData = (param) => {param.id = Math.random()// const data = Object.assign({}, param) // 拷贝一个对象const data = { ...param }// const data = JSON.parse(JSON.stringify(param)) // 深拷贝tableData.value.push(data)
}const handleAdd = () => {editRef.value.openDialog()title.value = '新增'formData.value = {}
}
const handleDelete = (index, row) => {ElMessageBox.confirm('此操作将会删除本条数据,请确定是否继续执行?','提示',{confirmButtonText: '确定',cancelButtonText: '取消',closeOnClickModal: false,type: 'warning',}).then(() => {ElMessage({type: 'success',message: '删除成功',})tableData.value.splice(index, 1)}).catch(() => {ElMessage({type: 'info',message: '取消操作',})})
}const handleSelectionChange = () => {table.value.handleSelectionChange()
}provide('formObj', { title, formData, addData })const handleEdit = (rowData) => {title.value = '编辑'const param = {...rowData}formData.value = param// formData.value = Object.assign({}, rowData)// 避免引用传递,做一次数据拷贝// formData.value = JSON.parse(JSON.stringify(row))editRef.value.openDialog()
}const query = () => {queryData()
}const reset = (formEl) => {if (!formEl) returnformEl.resetFields()queryData()
}const queryData = () => {loading.value = true// const param = { ...materialForm.value, ...{ name: 'zhangsan', age: 20 } }fetch("https://jsonplaceholder.typicode.com/users").then((resposne) => resposne.json()).then((json) => {loading.value = falsetableData.value = json})
}</script>

相关文章:

vue 封装Table组件

基于element-plus UI 框架封装一个table组件 在项目目录下的components新建一个Table.vue <template><section class"wrap"><el-tableref"table":data"tableData" v-loading"loading" style"width: 100%":…...

MySQL主从复制错误

当在MySQL的多线程复制中遇到错误时&#xff0c;你可能会看到上述的错误信息。错误的核心在于从服务器上的工作线程在尝试执行一个特定的事务时遇到了问题。 为了解决这个问题&#xff0c;你可以采取以下步骤&#xff1a; 查看MySQL的错误日志&#xff1a;错误日志可能会提供更…...

Redis群集

目录 1、redis群集三种模式 2、Redis 主从复制 2.1 主从复制的作用 2.2 主从复制流程 2.3 搭建Redis 主从复制 3、Redis 哨兵模式 3.1 哨兵模式的作用 3.2 故障转移机制 3.3 主节点的选举 4、Redis 群集模式 4.1 集群的作用 4.2 Redis集群的数据分片 4.3 搭建Redis…...

Spring AOP以及统一处理

一.Spring AOP 1.什么是Spring AOP AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff1a;面向切面编程&#xff0c;它是一种思想&#xff0c;它是对某一类事情的集中处理。 2.AOP的作用 想象一个场景&#xff0c;我们在做后台系统时&#xff0c;除了登录…...

vue2markdown转思维导图

官网 http://markmap.js.org 按照官网安装markmap-lib,markmap-view两个依赖外&#xff0c;还需要安装markmap-common 如果报错提示vuePdfNoSss相关问题&#xff0c;需要安装vue-pdf 如果报错can’t import the named export ‘xxx’ from non EcmaScript module&#xff0c;需…...

docker下redis备份文件dump.rdb获取

1.查看镜像 docker ps -a 2.进入redis客户端 docker exec -it redis redis-cli 3.保存备份文件 save 4.查看文件存放位置 CONFIG GET dir 5.将docker中文件拷出 docker cp id或name:容器中文件的路径 目标目录地址...

二十一、MySQL(多表)内连接、外连接、自连接实现

1、多表查询 &#xff08;1&#xff09;基础概念&#xff1a; &#xff08;2&#xff09;多表查询的分类&#xff1a; 2、内连接 &#xff08;1&#xff09;基础概念&#xff1a; &#xff08;2&#xff09;隐式内连接&#xff1a; 基础语法&#xff1a; select 表1.name,…...

Zookeeper运维

我是一个目录 1. 参数说明2. Zookeeper优化建议3. Zookeeper性能查看4. 建议 1. 参数说明 工作节点瞬间压力大&#xff0c;导致和集群通信出现延迟&#xff0c;被踢出节点&#xff0c;瞬间释放的连接立即又连接到另外节点&#xff0c;最终集群挂掉。加了一些延迟配置后&#xf…...

uniapp 点击事件-防重复点击

uniapp 点击事件-防重复点击 1、common文件并创建anti-shake.js文件 // 防止处理多次点击 function noMoreClicks(methods, info) {// methods是需要点击后需要执行的函数&#xff0c; info是点击需要传的参数let that this;if (that.noClick) {// 第一次点击that.noClick f…...

推进“数智+数治”,中期科技智慧公厕驱动城市公厕更新升级发展

随着城市化的快速发展和人口的不断增加&#xff0c;公共厕所这一基础设施的更新升级成为了亟待解决的问题。过去的传统公厕往往存在着环境脏乱差、无法保证使用者的舒适度等诸多问题。而智慧公厕则能够通过互联网和物联网的技术手段&#xff0c;实现智能化的运行管理&#xff0…...

4、模板(二叉树,红黑树,STL的实现)

1. 泛型编程 2. 模板&#xff1a;参数类型化 3. 模板分类 3.1 函数模板 概念 实例化&#xff1a;隐式实例化&#xff0c;显式实例化 3.2 类模板 4. 在模板参数列表中&#xff1a;class和typename 5.模板参数列表:template <class T , size_t N> 类型参数&#x…...

了解JVM

一.了解JVM 1.1什么是JVM JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟计算机功能来实现的&#xff0c;JVM屏蔽了与具体操作系统平台相关的信息&#xff0c;Java程序只…...

vue2实现组织机构树

参考大佬文章&#xff1a;https://www.cnblogs.com/10ve/p/12573772.html 【vue——实现组织架构图(vue-org-tree)——技能提升 - CSDN App】http://t.csdn.cn/Mpe4B...

JS中BigInt的使用

JS中BigInt的使用 BigInt是一种内置对象&#xff0c;它提供了一种方法来表示大于2^53 - 1的整数&#xff0c;通俗来讲就是提供了一种可以表示任意大整数的方法&#xff0c;当我们使用Number来表示一个超过了2 ^53 - 1的整数的时候&#xff0c;会出错。所以此时我们需要使用Big…...

你的第1个 Unity 游戏!!!

简介 首先新建一个方块添加重力!!!总结首先 首先,你要先打开 U n i t y Unity Unity...

炫云云渲染3ds max效果图渲染教程

很多人在第一次使用炫云云渲染渲染效果图的时候不知道怎么使用&#xff0c;其实现在使用炫云渲染效果图真的很简单&#xff0c;我们一起来看看。 一客户端安装 1、打开炫云云渲染官网&#xff0c;点击右上角的客户端下载&#xff0c;选择炫云客户端&#xff08;NEXT版&#xf…...

Java中数组array和列表list相互转换

在Java中&#xff0c;可以将数组&#xff08;array&#xff09;和列表&#xff08;list&#xff09;相互转换&#xff0c;但需要注意一些细节和限制。以下是一些示例和说明&#xff1a; 从数组到列表&#xff1a; 使用Arrays.asList()方法&#xff1a;可以使用Arrays.asList()…...

【JavaSE笔记】数据类型与变量

一、前言 在Java这门“啰嗦”的编程语言中,我们必须弄清楚每种数据类型的性质和用途,才能让程序“说人话”。要成为Java高手&#xff0c;就必须与各种数据类型打成一片。 本文则将带你认识Java中常见的两位“角色”—数据类型与变量。 二、数据类型 在Java中数据类型主要分…...

VR全景智慧文旅解决方案,助力文旅产业转型升级

引言&#xff1a; 随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术正逐渐展露其影响力&#xff0c;改变着旅游业。VR全景智慧文旅解决方案也应运而生&#xff0c;将传统旅游的体验形式从线下扩展到了线上&#xff0c;带来了不一般的文旅体验。 一.VR全…...

采用cv2和默认的人脸识别分类器实现人脸检测功能

人脸识别分类器 haarcascade_frontalface_default 提示&#xff1a;分类器文件地址在这里&#xff1a;https://github.com/opencv/opencv/blob/687fc11626901cff09d2b3b5f331fd59190ad4c7/data/haarcascades/haarcascade_frontalface_default.xml 文章目录 人脸识别分类器 haar…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...