vue3 el-table控制列显示隐藏

news/2025/2/27 1:38:41/文章来源:https://www.cnblogs.com/guxingzhe/p/18564469

TableControl.vue

<!-- 表格列显示隐藏控制*** 根节点为el-table,会穿透接收组件所有属性1、通过slots接收表格列,生成勾选项2、从缓存中读取数据,匹配勾选项;3、双向绑定,勾选项。表格列使用v-if判断显示隐藏;
-->
<template><el-table><template v-for="(item, index) in slotList" :key="index"><component v-if="onShowColumn(item)" :is="item" :column-key="item.columnKey"></component></template></el-table>
</template><script setup lang="ts">
const slots = useSlots();
// 表格列
const fields = defineModel('fields', { type: Array, default: [] });
const slotList = ref<any[]>([]);/*** 初始化勾选列表*/
const initSlotList = () => {if (slots.default) {// el-table-column 使用时不传name 所以属于默认插槽const _slotList = slots.default() || [];_slotList.forEach((d: any, index: number) => {// 生成列的keyd.columnKey = d.props ? d.props.label : window.btoa(index.toString());// 生成列的propif (d.props) {d.props.prop = d.props.prop ? d.props.prop : d.props.label;}});fields.value = _slotList// 注释代码也会被当节点读取进来.filter((d: any) => d && d.props).map((d: any) => {return {label: d.props.label,propName: d.props.prop,checked: true,};});slotList.value = _slotList;}
};function onShowColumn(col: any) {if (col && !col.props) {return true;}const field: any = fields.value.find((d: any) => d && d.propName === col.props.prop);return field && field.checked;
}onMounted(() => {initSlotList(); // 关键, 初始化插槽
});
</script><style lang="scss" scoped>
.column {&-all {border-bottom: 1px solid #dcdfe6;}&-list {max-height: 300px;overflow: auto;}
}
</style>

ColumnControl.vue

<!-- 表格列显示隐藏控制
-->
<template><div class="table-toolbar"><el-button @click="showDialog = true" icon="Grid">表格列</el-button></div><el-dialog v-model="showDialog" title="表格列筛选" width="800"><div class="column-all"><el-checkbox v-model="checkedAll" :indeterminate="isIndeterminate" @change="onAllChange">全选</el-checkbox></div><div class="column-wrap"><div class="column-checkbox-group" v-if="fields.length > 0"><div class="column-checkbox" :class="{ active: item.checked }" v-for="(item, index) in fields" :key="index" @click="onItemClick(item)"><el-tooltip effect="dark" :content="item.label" placement="top" :show-after="300">{{ item.label }}</el-tooltip></div></div><div class="column-checkbox-group" v-else><el-empty description="暂无数据" /></div></div></el-dialog>
</template><script setup lang="ts">
interface Field {label: string;propName: string;checked: boolean;
}
const emit = defineEmits(['update:modelValue', 'change']);
// 定义父组件传过来的值
const props = defineProps({modelValue: {type: Array<Field>,default: () => [],},
});// 表格列
const fields = ref<Field[]>(props.modelValue);
// 全选
const checkedAll = ref(true);
// checkbox 的不确定状态
const isIndeterminate = ref(false);
// 是否显示对话框
const showDialog = ref(false);/*** 全选*/
function onAllChange(val: boolean) {fields.value.forEach((item: any) => {item.checked = val;});isIndeterminate.value = false;emit('update:modelValue', fields.value);
}
function onItemClick(item: any) {item.checked = !item.checked;const checkedCount = fields.value.filter((d: any) => d.checked).length;checkedAll.value = checkedCount === fields.value.length;isIndeterminate.value = checkedCount > 0 && checkedCount < fields.value.length;emit('update:modelValue', fields.value);
}// 监听路由的变化,设置网站标题
watch(() => props.modelValue,(newVal) => {fields.value = newVal || [];}
);
</script><style lang="scss" scoped>
.table-toolbar {padding-bottom: 8px;display: flex;justify-content: flex-end;
}
.column {&-wrap {border: 1px solid #d2d2d2;display: flex;min-height: 350px;}&-checkbox {width: 161px;padding: 10px;text-align: center;border-radius: 4px;border: 1px solid #9b9b9b;flex-shrink: 0;margin: 8px;float: left;cursor: pointer;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;box-sizing: border-box;&.active {background-image: url(/@/assets/images/sharedManage/plan/checkbox_selected.png);background-repeat: no-repeat;background-position: right top;border-color: #ff9302;color: #ff9302;}&-group {display: table;flex-wrap: wrap;padding: 4px 8px;}}
}
</style>

  被改造页面

<template><div class="user-pages"><div class="user-pages-content"><ColumnControl v-model="fields"></ColumnControl><TableControlstyle="width: 100%"v-model:fields="fields"ref="tableRef"v-loading="state.loading":data="state.dataList":height="tableHeight":header-cell-style="tableStyle.headerCellStyle"show-summary:summary-method="getSummaries"><el-table-column prop="orderDate" label="月份" align="center" width="" /><el-table-column prop="companyName" label="所属公司" align="center" width="" /><el-table-column prop="regionName" label="大区" align="center" width="90" /><el-table-column prop="" label="区域" align="center" width="" /><el-table-column prop="province" label="省" align="center" width="" /><el-table-column prop="city" label="市" align="center" width="" /><el-table-column prop="area" label="区" align="center" width="" /></TableControl><pagination v-bind="state.pagination" @size-change="sizeChangeHandle" @current-change="currentChangeHandle" /></div></div>
</template><script setup lang="ts">
// ....
import ColumnControl from '/@/components/ColumnControl.vue';
import TableControl from '/@/components/TableControl.vue';
const fields = ref<any[]>([]);
// ....
</script><style scoped lang="scss"></style>

  效果图

 

 

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

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

相关文章

台电固态硬盘维修数据恢复

针对台电固态硬盘的维修与数据恢复问题,以下是一些建议和方法: 数据恢复 回收站恢复:如果是在电脑操作时不慎将固态硬盘里面的文件误删,且文件被删除后未进行大量写入操作(以免数据被覆盖),可以尝试通过电脑的“回收站”进行文件还原。打开桌面上的“回收站”,在里面找…

VMware 安装ubuntu 挂载共享目录

开机界面点击虚拟机“重新安装vmtools” 修改root密码sudo passwd root关闭防火墙ufw disable安装ssh sudo apt-get install openssh-server创建目录sudo mkdir /mnt/hgfs输入以下命令,如果输出了我们一开始创建的共享文件夹,那就代表你上面的设置正确了vmware-hgfsclient挂载…

js逆向实战之某二手平台请求参数加密逻辑

声明:本篇文章仅用于知识分享,不得用于其他用途 网址:https://www.goofish.com/ 加密逻辑随便点击一个模块,看触发的数据包。再选择一个模块,看哪些参数会变化。比较一下得知t和sign的值会变化。请求数据中的machId是根据所选模块变化的。 主要关注sign的加密逻辑,搜索请…

六步取消win11开机密码

0.前言 新买的电脑打开后首先要进行一系列的操作激活操作系统。在这些操作中最令人讨厌的是设置开机密码(pin)。 也许有很多人的电脑需要保密,限制别人登录,这时使用登录pin是很有必要的。而还有很多人跟我的情况差不多,台式电脑在家里使用,没有什么保密的内容。设置了开…

服务器搭建latex(overleaf)

1.领取免费服务器,推荐免费服务器(SanFengYun)见下图。2.安装宝塔面板,配置内网为127.0.0.1,访问外网地址。 3.可以在宝塔面板一键部署网站,输入自己的域名即可。 4.关键:安装docker,安装yum,设置github可以访问。 5.更换docker镜像,自带镜像无法访问 6.按照overleaf…

基于Java+SpringBoot+Mysql在线简单拍卖竞价拍卖竞拍系统功能设计与实现三

超级管理员:系统管理、用户管理、拍卖者管理、拍卖商品管理等。 普通用户:注册登录、个人信息管理(个人资料、密码修改等)、竞价管理、评价等。 企业用户:注册登录、发布竞拍、竞拍管理等。 运行环境:windows/Linux均可、jdk1.8、mysql5.7、redis3.0、idea/eclipse均可。…

hhdb数据库介绍(8-3)

部署 自动部署 实现免密登录说明 免密登录需要在两台服务器之间建立免密通道,具体操作如下: 以192.168.190.186与192.168.190.187实现免密连接为例 1.在192.168.190.186的服务器上执行ssh-keygen,连续按3次回车,完成生成公钥和私钥,其中id_rsa为私钥,id_rsa_pub为公钥,到/…

AO3401A-ASEMI中低压P沟道MOS管AO3401A

AO3401A-ASEMI中低压P沟道MOS管AO3401A编辑:ll AO3401A-ASEMI中低压P沟道MOS管AO3401A 型号:AO3401A 品牌:ASEMI 封装:SOT-23 最大漏源电流:-4.2A 漏源击穿电压:-30V 批号:最新 RDS(ON)Max:0.06Ω 引脚数量:3 沟道类型:P沟道MOS管 芯片尺寸:MIL 漏电流: 恢复时间…

前端技术中对JavaScript的学习

JavaScript简历目录JavaScript简历JavaScript 是脚本语言ECMAScript 版本作用:JavaScript:直接写入 HTML 输出流JavaScript:对事件的反应JavaScript:改变 HTML 内容JavaScript:改变 HTML 图像 JavaScript 是脚本语言 JavaScript 是一种轻量级的编程语言。 JavaScript 是可…

PbootCMS后台使用编辑器的过程中,经常遇到工具栏消失的情况

后台使用编辑器的过程中,经常遇到工具栏消失的情况问题描述:后台编辑器工具栏消失。 解决方案:编辑器工具栏实际上是与后台顶部导航重叠了。修改 coreextendueditorueditor.config.js 文件,大概在 292 行,去掉 topOffset 的注释,并设置为 50。topOffset: 50备注:新版 Pb…

PbootCMS网站使用编辑器多图上传提示“后端配置项没有正常加载,上传插件不能正常使用!”

问题:PbootCMS 使用 UEditor 编辑器时,单图片上传按钮没有反应,多图片上传提示“后台配置项返回格式出错,上传功能将不能正常使用!” 解决方案:修改时间区域配置:将 controller.php 文件中的 date_default_timezone_set("Asia/chongqing"); 修改为 date_defau…

PbootCMS网站怎么添加新的模板文件

添加新的模板文件连接FTP服务器:使用FTP客户端连接到你的服务器。定位模板文件夹:导航到 /template/你的模板名称/ 目录。上传新文件:将新的模板文件(如HTML、CSS、JavaScript文件)上传到相应的文件夹中。修改引用:如果新文件需要在现有模板中引用,编辑相关HTML文件,添…