91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

el-tree節點過濾不顯示下級問題怎么解決

發布時間:2023-05-05 16:40:18 來源:億速云 閱讀:258 作者:iii 欄目:開發技術

本篇內容主要講解“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節點過濾不顯示下級問題怎么解決

我們需求方覺得還可以再優化

當搜索 “春天” 的時候,父子級都能匹配到,這個時候子級的支線節點 “桃子” 也會顯示出來:

el-tree節點過濾不顯示下級問題怎么解決

當搜索 “苦” 的時候,父子級都能匹配到,這個時候子級的其它無關苦的節點需要隱藏

el-tree節點過濾不顯示下級問題怎么解決

代碼仍然在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節點過濾不顯示下級問題怎么解決”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

色达县| 廉江市| 汉源县| 怀集县| 姚安县| 绥芬河市| 鸡西市| 奉化市| 沂水县| 界首市| 龙岩市| 富川| 沙雅县| 上饶市| 平罗县| 江永县| 肥乡县| 普定县| 南雄市| 凤山市| 上饶市| 乐业县| 彰化市| 陈巴尔虎旗| 小金县| 墨脱县| 墨玉县| 台南市| 石景山区| 清水河县| 潞城市| 明光市| 霍山县| 河西区| 赫章县| 泸西县| 花垣县| 南通市| 祁连县| 镇巴县| 湘乡市|