element-plus的el-table自定义表头筛选查询

文章目录

  • 一、效果
  • 二、代码
    • 1.代码可直接复制使用
  • 三、问题
    • 1.使用el-popover完成筛选框


一、效果

在这里插入图片描述

二、代码

1.代码可直接复制使用

<template><div class="page-view" @click="handleClickOutside"><el-button @click="resetFilters">Reset Filters</el-button><el-table ref="tableRef" row-key="date" :data="filteredData" style="width: 100%"><el-table-column prop="date" label="Date" sortable width="180" column-key="date" /><el-table-column prop="name" label="Name" sortable width="180"><template #header><div style="display: inline-block; align-items: center;"><span>Name</span><el-icon ref="buttonRef" @click.stop="toggleNameFilter(buttonRef, 'nameFilter')"style="cursor: pointer; margin-left: 10px;":style="{ color: searchDate.nameFilter ? '#007d7b' : '#85888e' }"><Filter /></el-icon></div></template><template #default="scope"><span>{{ scope.row.name }}---</span></template></el-table-column><el-table-column prop="address" label="Address" width="300" /><el-table-column prop="tag" label="Tag"><template #header><div style="display: inline-block; align-items: center;"><span>Tag</span><el-icon ref="buttonRef2" @click.stop="toggleNameFilter(buttonRef2, 'tagFilter')"style="cursor: pointer; margin-left: 10px;":style="{ color: searchDate.tagFilter ? '#007d7b' : '#85888e' }"><Filter /></el-icon></div></template><template #default="scope"><el-tag :type="scope.row.tag === 'Home' ? 'primary' : 'success'">{{ scope.row.tag }}</el-tag></template></el-table-column></el-table>{{ visible }}<pre>{{ searchDate }}</pre><el-popover :visible="visible" :virtual-ref="refName" placement="bottom" :width="'fit-content'"><div><el-input v-if="showKey === 'nameFilter'" v-model="searchDate.nameFilter" placeholder="输入框"@input="applyNameFilter" clearable style="margin-top: 10px; width: 150px;" /><el-select v-if="showKey === 'tagFilter'" v-model="searchDate.tagFilter" placeholder="Select Tag"@change="applyTagFilter" clearable style="margin-top: 10px; width: 150px;"><el-option label="Home" value="Home" /><el-option label="Office" value="Office" /></el-select><div class="mt" style="text-align: right;"><el-button type="info" link @click="cancelFilter">重置</el-button><el-button type="primary" link @click="searchFilter">筛选</el-button></div></div></el-popover></div>
</template><script setup>
import { ref, computed, unref } from 'vue'
// import { ElIconSearch, ElIconSArrowDown } from '@element-plus/icons-vue'
import { Filter } from '@element-plus/icons-vue'import { ClickOutside as vClickOutside } from 'element-plus'
const buttonRef = ref()
const buttonRef2 = ref()
const popoverRef = ref()
const onClickOutside = () => {console.log(123);if (unref(popoverRef) && unref(popoverRef).popperRef) {unref(popoverRef).popperRef?.delayHide?.()}
}const showKey = ref(undefined) // 当前展示哪个筛选窗
const visible = ref(false) // 手动控制筛选窗显隐
const refName = ref(null) // 动态绑定在哪个表头图标下const tableRef = ref() // 表格ref
const searchDate = ref({nameFilter: undefined,tagFilter: undefined,
}) // 查询参数// 全局重置
const resetFilters = () => {searchDate.value.nameFilter = undefinedsearchDate.value.tagFilter = undefinedapplyNameFilter()applyTagFilter()getData()
}// 触发筛选
const toggleNameFilter = (ref, key) => {if (showKey.value !== key) {visible.value = falsegetData()}refName.value = refshowKey.value = keyvisible.value = !visible.value
}// 点击其他元素
const handleClickOutside = () => {// visible.value = false;
};// 重置
const cancelFilter = () => {searchDate.value[showKey.value] = undefinedvisible.value = false;getData()
}
// 筛选
const searchFilter = () => {visible.value = false;getData()
}// 单独过滤
const applyNameFilter = () => {// Filtering logic can be customized if needed
}
const applyTagFilter = () => {// Filtering logic can be customized if needed
}// 原数据
const tableData = [{date: '2016-05-03',name: 'Tom',address: 'No. 189, Grove St, Los Angeles',tag: 'Home',},{date: '2016-05-02',name: 'Tom',address: 'No. 189, Grove St, Los Angeles',tag: 'Office',},{date: '2016-05-04',name: 'Tom',address: 'No. 189, Grove St, Los Angeles',tag: 'Home',},{date: '2016-05-01',name: 'Jack',address: 'No. 189, Grove St, Los Angeles',tag: 'Office',},
]// 列表显示的数据
// const filteredData = computed(() => {
//   return tableData.filter((item) => {
//     const nameMatch = searchDate.value.nameFilter ? item.name.toLowerCase().includes(searchDate.value.nameFilter.toLowerCase()) : true
//     const tagMatch = searchDate.value.tagFilter ? item.tag === searchDate.value.tagFilter : true
//     return nameMatch && tagMatch
//   })
// })
const filteredData = ref(JSON.parse(JSON.stringify(tableData)))
// 获取数据
const getData = () => {filteredData.value = tableData.filter((item) => {const nameMatch = searchDate.value.nameFilter ? item.name.toLowerCase().includes(searchDate.value.nameFilter.toLowerCase()) : trueconst tagMatch = searchDate.value.tagFilter ? item.tag === searchDate.value.tagFilter : truereturn nameMatch && tagMatch})
}
</script><style lang="scss" scoped>
:deep(.el-popover) {width: fit-content !important;
}:deep(.el-popover.el-popper) {width: fit-content !important;
}
</style>

三、问题

1.使用el-popover完成筛选框

同时通过:visible="visible"来控制筛选框显隐,但是在el-popover下就不能使用<template #reference>子元素 (如使用子元素,就没法将筛选框其定位到每个表头;除非你给每一个表头的el-icon图表外都写一个el-popover来包裹,那样10个表头需要写10个el-popover)。所以控制台会报警告提示:

ElementPlusError: [ElOnlyChild] no valid child node found at debugWarn (chunk-32EVVALS.js?v=a0ab03ed:9136:37)
在这里插入图片描述

暂无好的解决办法,大家有方案可提供下。

——————————————————————————————————————————————————
更新: 我直接把el-table也给进行了封装,动态遍历渲染表格(也就动态渲染了表头,也就可以给表头el-icon图标外包裹一个el-popover来实现各个表头的筛选,且不会报告警报错)

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

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

相关文章

云服务器2核2G配置可以干嘛?2C2G用来做什么合适?

最便宜的服务器2核2G配置可以做什么&#xff1f;可用来搭建Web网站服务器、小程序服务器、APP后端服务器、图床、开发测试环境、小型电子商务网站及文件存储等使用场景。服务器百科网fwqbk.com举例说明&#xff1a; 搭建个人博客&#xff1a;使用开源WordPress等博客程序系统&…

git使用、git与idea结合、gitee、gitlab

本文章基于黑马程序javase模块中的"git"部分 先言:git在集成idea中,不同版本的idea中页面显示不同,操作时更注重基于选项的文字;git基于命令操作参考文档实现即可,idea工具继承使用重点掌握 1.git概述 git是目前世界上最先进的分布式文件版本控制系统 分布式:将…

照片怎么改大小kb?分享5个改小图片的工具

夏日炎炎&#xff0c;正是出游拍照的大好时节&#xff0c;然而随之而来的问题也让人头疼——手机里的美照越来越多&#xff0c;存储空间却越来越紧张。 不仅如此&#xff0c;上传至社交媒体时&#xff0c;大尺寸的照片常常让加载速度慢如蜗牛&#xff0c;影响了分享的乐趣。 …

[Spring Boot]Protobuf解析MQTT消息体

简述 本文主要针对在MQTT场景下&#xff0c;使用Protobuf协议解析MQTT的消息体 Protobuf下载 官方下载 https://github.com/protocolbuffers/protobuf/releases网盘下载 链接&#xff1a;https://pan.baidu.com/s/1Uz7CZuOSwa8VCDl-6r2xzw?pwdanan 提取码&#xff1a;an…

【毕业论文】| 基于Unity3D引擎的冒险游戏的设计与实现

&#x1f4e2;博客主页&#xff1a;肩匣与橘 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由肩匣与橘编写&#xff0c;首发于CSDN&#x1f649; &#x1f4e2;生活依旧是美好而又温柔的&#xff0c;你也…

mysql + Oracle

eg627. 变更性别 Salary 表&#xff1a; ----------------------- | Column Name | Type | ----------------------- | id | int | | name | varchar | | sex | ENUM | | salary | int | ----------------------- id 是这个表…

小程序-4(自定义组件:数据、属性、数据监听器、生命周期函数、插槽、父子通信、behaviors)

目录 1.组件的创建和引用 局部引用组件 全局引用组件 组件和页面的区别 组件样式隔离 ​编辑 组件样式隔离的注意点 修改组件的样式隔离选项 data数据 methods方法 properties属性 data和properties属性的区别 使用setData修改properties的值 2.数据监听器 什么…

昇思25天学习打卡营第19天|MindNLP ChatGLM-6B StreamChat

文章目录 昇思MindSpore应用实践ChatGML-6B简介基于MindNLP的ChatGLM-6B StreamChat Reference 昇思MindSpore应用实践 本系列文章主要用于记录昇思25天学习打卡营的学习心得。 ChatGML-6B简介 ChatGLM-6B 是由清华大学和智谱AI联合研发的产品&#xff0c;是一个开源的、支持…

数据结构——线性表(循环链表)

一、循环链表定义 将单链表中终端结点的指针端由空指针改为指向头结点&#xff0c;就使整个单链表形成一 个环&#xff0c;这种头尾相接的单链表称为单循环链表&#xff0c;简称循环链表(circular linked list)。 循环链表解决了一个很麻烦的问题。如何从当中一 个结点出发&am…

IO多路复用-poll的使用详解【C语言】

1.什么是poll poll 是一种用于监控多个文件描述符状态的系统调用&#xff0c;它可以等待多个文件描述符上的事件发生。它与 select 和 epoll 类似&#xff0c;但在某些场景下使用更为方便。 poll的机制与select类似&#xff0c;与select在本质上没有多大差别&#xff0c;使用…

xinput1-3.dll文件丢失找不到的修复方法

在电脑使用过程中&#xff0c;遇到“xinput1-3.dll丢失”或“找不到xinput1-3.dll”这类错误提示&#xff0c;可能会导致某些游戏或应用程序无法正常运行。以下是修复步骤&#xff0c;帮助您快速找回缺失的dll文件。 一、xinput1-3.dll的作用 xinput1-3.dll是Microsoft Direct…

Android APP 基于RecyclerView框架工程(知识体系积累)

说明&#xff1a;这个简单的基于RecyclerView的框架作用在于自己可以将平时积累的一些有效demo整合起来&#xff08;比如音视频编解码的、opengles的以及其他也去方向的、随着项目增多&#xff0c;工程量的增加&#xff0c;后期想高效的分析和查找并不容易&#xff09;&#xf…

1.Fabric框架

要了解Fabric&#xff0c;首先要知道Hyperledger开源项目。 2015年12月&#xff0c;由开源世界的旗舰组织Linux基金会牵头&#xff0c;30家初始企业成员共同宣布Hyperledger联合项目成立。Hyperledger 超级账本&#xff0c;是首个面向企业应用场景的分布式账本平台&#xff0c…

【每日一练】python编写一个简易计算器

程序代码: #循环语句&#xff0c;条件为真所以循环执行 while True: #定义两个数的变量和运算符号 num1 float(input("第一个数:")) num2 float(input("第一个数:")) syminput("选择运算符 - * /&#xff1a;") #判断运算符号 …

Camera Raw:评级和标签

在 Camera Raw 中&#xff0c;评级 Rating和标签 Label功能为摄影师和图像编辑者提供了一种高效的图像组织和管理方法。通过这些功能&#xff0c;用户可以轻松地对照片进行分类、标记和筛选&#xff0c;以便在大量图像中快速找到需要的照片。 ◆ ◆ ◆ 设置星级 Set Rating 星…

Inconsistent Query Results Based on Output Fields Selection in Milvus Dashboard

题意&#xff1a;在Milvus仪表盘中基于输出字段选择的不一致查询结果 问题背景&#xff1a; Im experiencing an issue with the Milvus dashboard where the search results change based on the selected output fields. Im working on a RAG project using text data conv…

【Java面向对象】二进制I/O

文章目录 1.二进制文件2.二进制 I/O 类2.1 FileInputStream 和 FileOutputStream2.2 FilterInputStream和 FilterOutputStream2.3 DatalnputStream 和 DataOutputStream2.4 BufferedInputStream 和 BufferedOutputStream2.5 ObjectInputStream 和 ObjectOutputStream 2.6 Seria…

防御保护课-防火墙接口配置实验

一、实验拓扑 &#xff08;我做实验用的图如下&#xff09; 二、实验要求 1.防火墙向下使用子接口分别对应生产区和办公区 2.所有分区设备可以ping通网关 三、实验思路 配IP&#xff1b; 划分vlan并配置vlan&#xff1b; 配置路由和安全策略。 四、实验配置 1、画图并…

开源模型应用落地-FastAPI-助力模型交互-进阶篇-RequestDataclasses(三)

一、前言 FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理&#xff0c;使应用程序能够处理各种不同的请求场景&#xff0c;提高应用程序的灵活性和可扩展性。 在数据验证和转换方面&#xff0c;高级用法提供了更精细和准确的控制&#…

【Linux】进程间通信之-- 共享内存与信号量的介绍(下)

前言 上一篇&#xff0c;我们由进程间通信&#xff0c;引入并讲述了管道、匿名管道和命名管道&#xff0c;本节&#xff0c;将继续学习进程间通信的另一种方式之&#xff0c;共享内存。还要学习几个系统调用接口&#xff0c;并演示两个进程通过共享内存来进行通信。。。 目录 1…