vue3中基于element-plus封装一个表格弹框组件,要求可以单选和多选table数据

单选:
在这里插入图片描述

<template><SelectMaterialref="selectMaterialRef"check="checkbox"@select="selectMaterial"></SelectMaterial><el-button type="primary" size="small" icon="el-icon-plus" @click="handleAddMaterial">添加备件</el-button>
</template>
<script setup>
import { ref } from 'vue';const selectMaterialRef = ref('');
// 选择事件
const selectMaterial = data => {console.log('选择的表格数据', data);
};
// 打开添加备件弹框
const handleAddMaterial = () => {selectMaterialRef.value.openDialog();
};
</script>

在这里插入图片描述

多选:
在这里插入图片描述

<template><SelectMaterialref="selectMaterialRef"check="checkbox"@select="selectMaterial"></SelectMaterial><el-button type="primary" size="small" icon="el-icon-plus" @click="handleAddMaterial">添加备件</el-button>
</template>
<script setup>
import { ref } from 'vue';const selectMaterialRef = ref('');
// 选择事件
const selectMaterial = data => {console.log('选择的表格数据', data);
};
// 打开添加备件弹框
const handleAddMaterial = () => {selectMaterialRef.value.openDialog();
};
</script>

在这里插入图片描述

弹框表格组件代码

<template><el-dialog v-model="dialogShow" @close="handleClose" width="50%" title="选择备件"><el-tableborderref="tableRef":data="tableData":row-key="row => row.id":header-cell-style="{ textAlign: 'center', backgroundColor: '#f3f3f3' }":cell-style="{ textAlign: 'center' }"@selection-change="handleSelectionChange"style="height: 352px; overflow: auto; margin: 10px 0"size="small"><el-table-column v-if="check === 'checkbox'" type="selection"></el-table-column><el-table-column v-else-if="check === 'radio'" width="50"><template #default="scope"><el-radio v-model="selectedRow" :value="scope.row.id"></el-radio></template></el-table-column><el-table-column type="index" width="80" label="序号"><template #default="{ $index }">{{ (currentPage - 1) * pageSize + $index + 1 }}</template></el-table-column><el-table-column prop="partNumber" label="备件编号"></el-table-column><el-table-column prop="partName" label="备件名称"></el-table-column><el-table-column prop="specification" label="规格型号"></el-table-column><el-table-column prop="manufacturer" label="生产厂家"></el-table-column><el-table-column prop="unit" label="单位"></el-table-column></el-table><div style="display: flex; justify-content: flex-end; margin-top: 10px"><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="currentPage":page-sizes="[10, 20, 30, 40]":page-size="pageSize"layout="total, sizes, prev, pager, next, jumper":total="total"small></el-pagination></div><div style="text-align: center; margin-top: 20px"><el-button size="small" @click="handleClose" style="margin-right: 30px;">取消</el-button><el-button size="small" type="primary" @click="handleSelect">选择</el-button></div></el-dialog>
</template><script name="select-material-dialog" setup>
import { ref } from 'vue';// 对话框是否可见
const dialogShow = ref(false);
// 多选选中的行
const selectedRows = ref([]);
// 单选选中的行
const selectedRow = ref(null);
// 当前页码
const currentPage = ref(1);
// 每页显示的条数
const pageSize = ref(10);
// 总条数
const total = ref(0);
// 表格数据
const tableData = ref([]);
// 表格ref
const tableRef = ref(null);// 定义属性
const props = defineProps({// 选择模式,可以是 'radio' 或 'checkbox'check: {type: String,default: 'checkbox',},
});// 定义事件
const $emit = defineEmits(['select']);// 获取数据的方法
const fetchData = async () => {// 模拟接口请求,这里使用 setTimeout 来模拟异步操作await new Promise(resolve => setTimeout(resolve, 1000));// 更新数据const data = Array.from({ length: pageSize.value }, (_, i) => ({id: (currentPage.value - 1) * pageSize.value + i + 1, // 注意这里的 +1,因为 id 应该从 1 开始,而不是从 0 开始partNumber: `编号${(currentPage.value - 1) * pageSize.value + i + 1}`, // 同样,编号也应该从 1 开始partName: `名称${i}`,specification: `规格${i}`,manufacturer: `厂家${i}`,unit: `单位${i}`,}));tableData.value = data;total.value = 100; // 假设总条数为 100
};// 切换对话框的可见状态
const openDialog = () => {dialogShow.value = true;
};// 关闭对话框
const handleClose = () => {dialogShow.value = false;
};// 处理分页器当前页改变
const handleCurrentChange = async val => {console.log('current', val);currentPage.value = val;await fetchData();
};// 处理选项变化
const handleSelectionChange = val => {selectedRows.value = val;
};// 处理每页显示的条数改变
const handleSizeChange = async val => {pageSize.value = val;await fetchData();
};// 处理选择按钮点击
const handleSelect = () => {if (props.check === 'radio') {const selectedData = tableData.value.find(row => row.id === selectedRow.value);$emit('select', selectedData);} else {$emit('select', selectedRows.value);}handleClose();
};// 暴露方法和属性
defineExpose({ openDialog });
// 初始获取数据
fetchData();
</script>

这里多啰嗦一句单选,我这里是自定义列,使用单选框的方式实现的

<el-table-column v-else-if="check === 'radio'" width="50"><template #default="scope"><el-radio v-model="selectedRow" :label="scope.row.id"></el-radio></template>
</el-table-column>
<script>
// 选中的行的数据
const selectedRow = ref(null);
// 处理选择按钮点击
const handleSelect = () => {if (props.check === 'radio') {const selectedData = tableData.value.find(row => row.id === selectedRow.value);$emit('select', selectedData);} 
};
</script>

为什么要这样呢,因为我开始是使用多选加反选的方式实现单选,但这样存在一个bug,就是多选框的表头有个全选按钮,点击那个全选的时候会出现反选的问题。

<template><el-tableref="tableRef":data="tableData"@selection-change="handleSelectionChange"><el-table-column  type="selection"></el-table-column>......</el-table>
</template>
<script>
const selectedRow = ref(null);
const handleSelectionChange = (val: []) => {console.log(val);if (val.length > 1) {// 单选tableRef.value!.toggleRowSelection(val[0], val[val.length - 1]);selectedRow .value = [val[val.length - 1]];} else {// 多选selectedRow .value = val;}
}
</script>

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

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

相关文章

Web API——获取DOM元素

目录 1、根据选择器来获取DOM元素 2.、根据选择器来获取DOM元素伪数组 3、根据id获取一个元素 4、通过标签类型名获取所有该标签的元素 5、通过类名获取元素 目标&#xff1a;能查找/获取DOM对象 1、根据选择器来获取DOM元素 语法&#xff1a; document.querySelector(css选择…

RedisTemplate操作Redis, 看这一篇文章就够了

文章目录 1. String 命令1.1 添加缓存1.2 设置过期时间(单独设置)1.3 获取缓存值1.4 删除key1.5 顺序递增1.6 顺序递减1.7 常用的 2. Hash命令2.1 添加缓存2.2 设置过期时间(单独设置)2.3 添加一个Map集合2.4 提取所有的小key2.5 提取所有的value值2.6 根据key提取value值2.7 获…

C语言-牛客-实现四舍五入

欢迎来到Harper.Lee的学习小世界&#xff01; 博主主页传送门&#xff1a;Harper.Lee的博客主页 想要一起进步的uu欢迎来后台找我哦&#xff01; 本篇博客总结C语言刷题的相关笔记~~~~ #牛客–实现四舍五入 题目描述&#xff1a;随机输入浮点数&#xff0c;输出四舍五入后的整数…

vue中数据已经改变了,但是table里面内容没更新渲染!

解决方案&#xff1a; 给table或者el-table标签上添加一个动态key值&#xff0c;只要数据发生改变&#xff0c;key值变动一下即可 标签上&#xff1a; :key“timeStamp” 初始data&#xff1a;timeStamp:0, 更新数据&#xff1a;this.timeStamp 这样每次更新数据&#xff…

【B站 heima】小兔鲜Vue3 项目学习笔记Day03

文章目录 Home1.Home整体结构搭建和分类实现2. banner轮播图功能3. Home 面板组件封装4.新鲜好物和人气推荐实现5. 图片懒加载指令实现6. Home- product产品列表实现7. Home-GoodsItem 组件封装 一级路由1. 整体认识和路由配置2. 面包屑导航3. 一级分类 - 轮播图的实现4. 激活状…

2024年5月天润融通JAVA二面15-20K

二面 1、聊项目 2、举例说明你在上家公司职级晋升的原因 3、开发者和管理者的区别&#xff0c;你怎么做管理者 4、对sass的理解&#xff0c;包括流程&#xff0c;技术选型 5、springboot如何把bean加载到ioc容器中&#xff0c;ioc容器的理解 6、一万个任务同时执行&#…

内网安全之搭建ADCS证书服务

在域控上安装ADCS服务时&#xff0c;默认会自动配置完LDAPS&#xff0c;如果不是在域控上安装ADCS服务&#xff0c;需要手动配置LDAPS 安装证书服务ADCS 打开服务器管理器——>添加角色和功能 选择“基于角色或基于功能的安装”选项&#xff0c;然后点击下一步 选择“从…

网络协议——Modbus-RTU

目录 1、简介 2、消息格式 3、Modbus寄存器种类说明 4、功能码01H 5、功能码02H 6、功能码03H 7、功能码04H 8、功能码05H 9、功能码06H 10、功能码0FH 11、功能码10H 1、简介 Modbus-RTU&#xff08;Remote Terminal Unit&#xff09;是一种串行通信协议&#xff0…

云和恩墨海外首秀在吉隆坡召开的2024中国智能科技与文化展览会

作为中马建交50周年官方重点推荐的活动之一&#xff0c;2024中国智能科技与文化展览会&#xff08;第四届&#xff09;于5月20至21日在毗邻吉隆坡双子塔的吉隆坡国际会展中心举办。本次展览会获得马来西亚科学技术创新部、马来西亚通讯部、中国驻马来西亚大使馆和马来西亚中华总…

使用Unsloth微调Llama3-Chinese-8B-Instruct中文开源大模型

使用Unsloth微调Llama3-Chinese-8B-Instruct中文开源大模型 微调Llama3-Chinese-8B-InstructLlama-3-Chinese-8B-InstructUnsloth环境设置下载预训练模型加载model、tokenizer设置LoRA训练参数准备数据集数据处理训练超参数配置开始训练模型推理保存LoRA模型加载模型保存完整模…

OpsManage基于docker的部署与使用

前言 自动化运维管理工具OpsManagerhttp://mp.weixin.qq.com/s?__bizMzk0NTQ3OTk3MQ&mid2247487736&idx1&snefef3a930b88649033f61942a77f42d2&chksmc31598b4f46211a240ffc5360ae238b27d0f495fcbe8dc18abdbd79bc25c00726f74a7312dd0&scene21#wechat_redi…

[IMX6ULL驱动开发]-Linux对中断的处理(一)

目录 中断概念的引入 ARM架构中断的流程 异常向量表 Linux系统对中断的处理 ARM对程序和中断的处理 Linux进程中断处理 中断概念的引入 如何理解中断&#xff0c;我们可以进行如下抽象。把CPU看做一个母亲&#xff0c;当它正在执行任务的时候&#xff0c;可以看为是一个母…

【css】引入背景图时候,路径写入@会报错

看报错信息 我的写法 解决办法 在前面加个~

ThreadLocal原理及使用

一、引言 在Java多线程编程中&#xff0c;ThreadLocal是一个非常有用的工具&#xff0c;它提供了一种将对象与线程关联起来的机制&#xff0c;使得每个线程都可以拥有自己独立的对象副本&#xff0c;从而避免了线程安全问题。然而&#xff0c;使用不当会导致内存泄漏问题。 二…

【VTKExamples::Texture】第六期 TextureThreshold

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例TextureThreshold,并解析接口vtkTexture,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~Y…

python使用base加密解密

原理 base编码是一种加密解密措施&#xff0c;目前常用的有base16、base32和base64。其大致原理比较简单。 以base64为例&#xff0c;base64加密后共有64中字符。其加密过程是编码后将每3个字节作为一组&#xff0c;这样每组就有3*824位。将每6位作为一个单位进行编码&#xf…

MySQL主从复制+读写分离(ShardingJDBC)

MySQL主从复制读写分离 MySQL主从复制介绍二进制日志&#xff1a; MySQL的主从复制原理如下搭建主从复制准备工作主库配置从库配置 测试 读写分离案例ShardingJDBC介绍数据库环境初始工程导入读写分离配置测试1). 保存数据2). 修改数据3). 查询数据4). 删除数据 MySQL主从复制 …

vue3结合element-plus之如何优雅的使用表格

背景 表格组件的使用在后台管理系统中是非常常见的,但是如果每次使用表格我们都去一次一次地从 element-plus 官网去 复制、粘贴和修改成自己想要的表格。 这样一来也说得过去,但是如果我们静下来细想不难发现,表格的使用都是大同小异的,每次都去复制粘贴,对于有很多表格…

【日记】跟奇安信斗智斗勇,败下阵来(416 字)

正文 今天一个客户都没有&#xff0c;让我快怀疑我们银行是不是要倒闭了…… 因为内外网 u 盘不知所踪&#xff0c;所以重新制了一个。深刻体会到了奇安信有多烂。有两个 u 盘&#xff0c;奇安信似乎把主控写坏了&#xff0c;插上电脑有反应&#xff0c;但是看不见盘符&#xf…

Linux中vim的基本使用

目录 vim中的三种模式以及基本操作命令模式(默认模式)插入模式底行模式 命令模式下的命令底行模式下的命令 vim是Linux和Unix环境下最基本的文本编辑器&#xff0c;类似于windows上的记事本 vim和Visual studio相比&#xff0c;vim并不集成&#xff0c;vim只能用来写代码 VS把写…