您好,登錄后才能下訂單哦!
本篇內容主要講解“el-tree節點過濾不顯示下級問題怎么解決”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“el-tree節點過濾不顯示下級問題怎么解決”吧!
elementui的節點過濾默認是不顯示下級的
代碼在 :filter-node-method="filterNode" 中添加
let parentNode = node.parent // 父級node let labels = [node.label] // 當前node的名字 let level = 1 // 層級 while (level < node.level) { labels = [...labels, parentNode.label] // 當前node名字,父級node的名字 parentNode = parentNode.parent level++ } return labels.some(d => d.indexOf(value) !== -1)
這樣就可以完美解決了子節點可以展開的問題:
當搜索 “春天” 的時候,父子級都能匹配到,這個時候子級的支線節點 “桃子” 也會顯示出來:
當搜索 “苦” 的時候,父子級都能匹配到,這個時候子級的其它無關苦的節點需要隱藏
代碼仍然在el-tree官方原生的 :filter-node-method="filterNode" 方法里面加
一、(當前是支線節點,也就是說兄弟有匹配到的)并且 (支線節點所有下級都匹配不到關鍵字)的情況
二、隱藏支線節點,包括所有下級的子節點才行,光隱藏支線節點沒有用
nodesParentId:[] 方法外的變量默認空數組
if (node.level > 1) { // 把我和兄弟name整合到數組中 const info = findTreeIdObjFn(this.dataTree, 'id', data.parentId).children.map(d => d.name) // 判斷兄弟有沒有 if (info.some(d => d.indexOf(value) !== -1)) { // 兄弟能匹配到,自己沒有匹配到 if (data.name.indexOf(value) === -1) { // 所有下級的 name 集合 const names = findCurNodeDescendantsFn(this.dataTree, 'id', data.id).map( d => findTreeIdObjFn(this.dataTree, 'id', d).name ) // 判斷都沒匹配到的情況 if (!names.some(d => d.indexOf(value) !== -1)) { // 把我和我下級所有id push到變量中,將當前支線節點隱藏 this.nodesParentId.push(...findCurNodeDescendantsFn(this.dataTree, 'id', data.id)) return false } } } } // 如果當前節點在支線節點名單中,則隱藏當前節點 if (this.nodesParentId.indexOf(data.id) !== -1) { return false }
全部代碼:
filterNode(value, data, node) { // 校驗沒有數據情況 if (!value) { this.nodesParentId = [] this.$nextTick(() => { node.expanded = false }) return true } // 控制展開和收起 this.$nextTick(() => { node.expanded = false }) // 當前名字是否包含在上級父親里 if (data.name.indexOf(value) !== -1) { this.$nextTick(() => { this.openSuperior(node) // 如果是第一級,直接打開當前級 if (!data.parentId) { node.expanded = true } }) } // 隱藏所有支線節點下面的所有子節點 // 思路: // (當前是支線節點,兄弟有匹配到的情況)并且 (支線節點所有下級都匹配不到)的情況 // 隱藏支線節點,包括所有下級的子節點才行,光隱藏支線節點沒有用 if (node.level > 1) { // 把我和兄弟name整合到數組中 const info = findTreeIdObjFn(this.dataTree, 'id', data.parentId).children.map(d => d.name) // 判斷兄弟有沒有 if (info.some(d => d.indexOf(value) !== -1)) { // 兄弟能匹配到,自己沒有匹配到 if (data.name.indexOf(value) === -1) { // 下級的 name 集合 const names = findCurNodeDescendantsFn(this.dataTree, 'id', data.id).map( d => findTreeIdObjFn(this.dataTree, 'id', d).name ) // 判斷都沒匹配到的情況 if (!names.some(d => d.indexOf(value) !== -1)) { // 把我和我下級所有id push到變量中,將當前支線節點隱藏 this.nodesParentId.push(...findCurNodeDescendantsFn(this.dataTree, 'id', data.id)) return false } } } } // 當前節點在支線節點名單中,則隱藏當前節點 if (this.nodesParentId.indexOf(data.id) !== -1) { return false } // 子級可被篩選到 let parentNode = node.parent // 父級node let labels = [node.label] // 當前node的名字 let level = 1 // 層級 while (level < node.level) { labels = [...labels, parentNode.label] // 當前node名字,父級node的名字 parentNode = parentNode.parent level++ } return labels.some(d => d.indexOf(value) !== -1) // 總結:之前沒解決的是因為 只隱藏支線父節點是隱藏不掉的,隱藏父節點包括下面的所有子節點才能隱藏 }
openSuperior 方法
// 展開所有父級 openSuperior(node) { if (node.parent) { node.parent.expanded = true this.openSuperior(node.parent) } },
findTreeIdObjFn方法:
// 傳入id(key)返回當前所在對象 /** * @param {*} data 樹形結構全部數據 * @param {*} key 查找的key * @param {*} value 傳入的key對應的value * @returns */ export const findTreeIdObjFn = (data, key, value) => { let temp = null ;(function fn(data, value) { data.forEach(item => { if (item[key] === value) { temp = item } if (item.children && item.children.length > 0) { fn(item.children, value) } }) })(data, value) return temp }
findCurNodeDescendantsFn方法:
// 找到傳入tree數據當前節點的id及所有子孫的id(key)集合 /** * @param {*} data tree數據 * @param {*} key 要查找的key * @param {*} value key對應的value * @returns */ export const findCurNodeDescendantsFn = (data, key, value) => { const obj = findTreeIdObjFn(data, key, value) const ids = [] ;(function selfRunFn(obj) { ids.push(obj[key]) if (obj.children && obj.children.length > 0) { obj.children.forEach(x => { selfRunFn(x) }) } })(obj) return ids }
到此,相信大家對“el-tree節點過濾不顯示下級問題怎么解決”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。