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

vue3+elementplus+虚拟树el-tree-v2+多条件筛选过滤filter-method

筛选条件

<el-inputv-model="searchForm.searchTreeValue"@input="searchTreeData"style="flex: 1; margin-right: 0.0694rem"placeholder="请输入要搜索的设备"clearable/><imgclass="refresh-img"src="com_refresh.png"alt="refresh"@click="refreshTree"/>     <el-selectv-model="searchForm.deviceType"placeholder="请选择"size="small"style="flex: 1"@change="searchTreeData"><el-optionv-for="item in data":key="item.value":label="item.label":value="item.value"/></el-select><el-selectv-model="searchForm.deviceSource"placeholder="请选择"size="small"style="flex: 1"@change="searchTreeData"><el-optionv-for="item in data":key="item.value":label="item.label":value="item.value"/></el-select>

el-tree-v2

 <el-tree-v2class="treev2-t"ref="treeRef"style="width: 100%":height="treeHeight":data="treeData":filter-method="filterNode":default-expanded-keys="expandedKeys"node-key="hightlightKey":expand-on-click-node="true":show-checkbox="true"empty-text="暂无组织数据"></tree>

script-初始化

const treeData = reactive([]) // 后端接口树形数据
const treeRef = ref(null)
const searchForm = reactive({searchTreeValue: '',deviceType: '',deviceSource: '',deviceTag: '',
})
watch(searchForm,(newValue, oldValue) => {closeDialog()treeRef.value?.filter()},{ immediate: true, deep: true }
)

script-过滤

/*** 树搜索*/
function filterNode(value, data) {if ((!value &&!searchForm.deviceType &&!searchForm.deviceSource &&!searchForm.deviceTag) ||data.toiName == undefined ||data.mac == undefined ||data.channelCode == undefined)return truereturn checkNodeMatch(data)
}
// 检查节点是否匹配所有条件
const checkNodeMatch = (node) => {let idsArr = []if (node.infos && node.infos.length > 0) {cliIds = node.infos.map((item) => item.id)}const conditions = [{value: searchForm.searchTreeValue,match: () =>node.name?.toLowerCase().includes(searchForm.searchTreeValue.toLowerCase()) },{value: searchForm.deviceType,match: () =>!searchForm.deviceType ||node.channelType == searchForm.deviceType,},{value: searchForm.deviceSource,match: () =>!searchForm.deviceSource ||idsArr.includes(searchForm.deviceSource),},]return conditions.every((condition) => !condition.value || condition.match())
}const treeFilterData = computed(() => {if (!hasSearchConditions()) {return treeData}return filterTree(treeData)
})
// 检查是否有搜索条件
const hasSearchConditions = () => {return Object.values(searchForm).some((value) => value !== '')
}// 递归过滤树数据
const filterTree = (data) => {if (!data) return []return data.reduce((acc, node) => {// 创建节点副本const newNode = { ...node }// 检查节点是否匹配const isMatch = checkNodeMatch(newNode)// 处理子节点if (node.children?.length) {const filteredChildren = filterTree(node.children)if (filteredChildren.length) {newNode.children = filteredChildrenacc.push(newNode)return acc}}// 如果当前节点匹配,添加到结果中if (isMatch) {if (!newNode.children?.length) {delete newNode.children}acc.push(newNode)}return acc}, [])
}const searchTreeData = useDebounce(handleSearchTreeData, 300) // 300ms 的防抖延迟
// 定义你想要执行的配套函数
function handleSearchTreeData() {//  ???// 触发重新渲染treeRef.value?.setData(treeFilterData.value)
}
// 使用 useDebounce 创建一个防抖版本的函数
const refreshTree = useDebounce(handleRefreshTree, 300) // 300ms 的防抖延迟
function handleRefreshTree(){searchForm.deviceSource = ''searchForm.deviceTag = ''searchForm.deviceType = ''searchForm.searchTreeValue = ''treeRef.value?.setCheckedKeys([], false)
}
// 防抖
export const useDebounce = (fn, delay = 300) => {let timer = nullreturn (...args) => {clearTimeout(timer)timer = setTimeout(() => {fn(...args)}, delay)}
}
http://www.lryc.cn/news/482068.html

相关文章:

  • 【C#设计模式(4)——构建者模式(Builder Pattern)】
  • LabVIEW实验室液压制动系统
  • 解决:Loading class `com.mysql.jdbc.Driver‘. This is deprecated
  • 【寻找重复数字】——脑筋急转弯...
  • AI基础知识
  • ubuntu 22.04 硬件配置 查看 显卡
  • 【计算机网络】网络框架
  • linux nvidia/cuda安装
  • 硬件设备网络安全问题与潜在漏洞分析及渗透测试应用
  • #渗透测试#SRC漏洞挖掘#CSRF漏洞的防御
  • C++ | Leetcode C++题解之第542题01矩阵
  • RabbitMQ 不公平分发介绍
  • 测试实项中的偶必现难测bug--一键登录失败
  • 危!这些高危端口再不知道问题就大了
  • Redis集群模式之Redis Sentinel vs. Redis Cluster
  • Leetcode 罗马数字转整数
  • 东方通TongWeb替换Tomcat的踩坑记录
  • ceph介绍和搭建
  • 树莓派安装FreeSWITCH
  • OpenSSL 生成根证书、中间证书和网站证书
  • MySQL核心业务大表归档过程
  • dapp获取钱包地址,及签名
  • 探索Dijkstra算法的普遍最优性:从经典算法到最新学术突破
  • ‍️代码的华尔兹:在 Makefile 的指尖上舞动自动化的诗篇
  • 函数式编程Stream流(通俗易懂!!!)
  • 数据分析:转录组差异fgsea富集分析
  • 在Django中安装、配置、使用CKEditor5,并将CKEditor5录入的文章展现出来,实现一个简单博客网站的功能
  • AI笔筒操作说明及应用场景
  • Android自启动管控
  • 把握鸿蒙生态崛起的机遇:开发者视角的探讨