最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決el-tree節(jié)點(diǎn)過(guò)濾不顯示下級(jí)的問(wèn)題

 更新時(shí)間:2023年04月23日 14:22:28   作者:桃子Jerry  
這篇文章主要介紹了解決el-tree節(jié)點(diǎn)過(guò)濾不顯示下級(jí)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

顯示下級(jí)的方法

elementui的節(jié)點(diǎn)過(guò)濾默認(rèn)是不顯示下級(jí)的

代碼在 :filter-node-method="filterNode" 中添加

let parentNode = node.parent // 父級(jí)node
let labels = [node.label] // 當(dāng)前node的名字
let level = 1 // 層級(jí)
while (level < node.level) {
    labels = [...labels, parentNode.label] // 當(dāng)前node名字,父級(jí)node的名字
    parentNode = parentNode.parent
    level++
}
return labels.some(d => d.indexOf(value) !== -1)

這樣就可以完美解決了子節(jié)點(diǎn)可以展開(kāi)的問(wèn)題:

我們需求方覺(jué)得還可以再優(yōu)化

當(dāng)搜索 “春天” 的時(shí)候,父子級(jí)都能匹配到,這個(gè)時(shí)候子級(jí)的支線節(jié)點(diǎn) “桃子” 也會(huì)顯示出來(lái):

當(dāng)搜索 “苦” 的時(shí)候,父子級(jí)都能匹配到,這個(gè)時(shí)候子級(jí)的其它無(wú)關(guān)苦的節(jié)點(diǎn)需要隱藏

代碼仍然在el-tree官方原生的 :filter-node-method="filterNode" 方法里面加

思路

  • 一、(當(dāng)前是支線節(jié)點(diǎn),也就是說(shuō)兄弟有匹配到的)并且 (支線節(jié)點(diǎn)所有下級(jí)都匹配不到關(guān)鍵字)的情況
  • 二、隱藏支線節(jié)點(diǎn),包括所有下級(jí)的子節(jié)點(diǎn)才行,光隱藏支線節(jié)點(diǎn)沒(méi)有用

nodesParentId:[] 方法外的變量默認(rèn)空數(shù)組

      if (node.level > 1) {
        // 把我和兄弟name整合到數(shù)組中
        const info = findTreeIdObjFn(this.dataTree, 'id', data.parentId).children.map(d => d.name)
        //  判斷兄弟有沒(méi)有
        if (info.some(d => d.indexOf(value) !== -1)) {
          // 兄弟能匹配到,自己沒(méi)有匹配到
          if (data.name.indexOf(value) === -1) {
            // 所有下級(jí)的 name 集合
            const names = findCurNodeDescendantsFn(this.dataTree, 'id', data.id).map(
              d => findTreeIdObjFn(this.dataTree, 'id', d).name
            )
            // 判斷都沒(méi)匹配到的情況
            if (!names.some(d => d.indexOf(value) !== -1)) {
              // 把我和我下級(jí)所有id push到變量中,將當(dāng)前支線節(jié)點(diǎn)隱藏
              this.nodesParentId.push(...findCurNodeDescendantsFn(this.dataTree, 'id', data.id))
              return false
            }
          }
        }
      }
      // 如果當(dāng)前節(jié)點(diǎn)在支線節(jié)點(diǎn)名單中,則隱藏當(dāng)前節(jié)點(diǎn)
      if (this.nodesParentId.indexOf(data.id) !== -1) {
        return false
      }

全部代碼:

   filterNode(value, data, node) {
      // 校驗(yàn)沒(méi)有數(shù)據(jù)情況
      if (!value) {
        this.nodesParentId = []
        this.$nextTick(() => {
          node.expanded = false
        })
        return true
      }
 
      // 控制展開(kāi)和收起
      this.$nextTick(() => {
        node.expanded = false
      })
      // 當(dāng)前名字是否包含在上級(jí)父親里
      if (data.name.indexOf(value) !== -1) {
        this.$nextTick(() => {
          this.openSuperior(node)
          // 如果是第一級(jí),直接打開(kāi)當(dāng)前級(jí)
          if (!data.parentId) {
            node.expanded = true
          }
        })
      }
 
      // 隱藏所有支線節(jié)點(diǎn)下面的所有子節(jié)點(diǎn)
      // 思路:
      // (當(dāng)前是支線節(jié)點(diǎn),兄弟有匹配到的情況)并且 (支線節(jié)點(diǎn)所有下級(jí)都匹配不到)的情況
      //  隱藏支線節(jié)點(diǎn),包括所有下級(jí)的子節(jié)點(diǎn)才行,光隱藏支線節(jié)點(diǎn)沒(méi)有用
      if (node.level > 1) {
        // 把我和兄弟name整合到數(shù)組中
        const info = findTreeIdObjFn(this.dataTree, 'id', data.parentId).children.map(d => d.name)
        //  判斷兄弟有沒(méi)有
        if (info.some(d => d.indexOf(value) !== -1)) {
          // 兄弟能匹配到,自己沒(méi)有匹配到
          if (data.name.indexOf(value) === -1) {
            // 下級(jí)的 name 集合
            const names = findCurNodeDescendantsFn(this.dataTree, 'id', data.id).map(
              d => findTreeIdObjFn(this.dataTree, 'id', d).name
            )
            // 判斷都沒(méi)匹配到的情況
            if (!names.some(d => d.indexOf(value) !== -1)) {
              // 把我和我下級(jí)所有id push到變量中,將當(dāng)前支線節(jié)點(diǎn)隱藏
              this.nodesParentId.push(...findCurNodeDescendantsFn(this.dataTree, 'id', data.id))
              return false
            }
          }
        }
      }
      // 當(dāng)前節(jié)點(diǎn)在支線節(jié)點(diǎn)名單中,則隱藏當(dāng)前節(jié)點(diǎn)
      if (this.nodesParentId.indexOf(data.id) !== -1) {
        return false
      }
 
      // 子級(jí)可被篩選到
      let parentNode = node.parent // 父級(jí)node
      let labels = [node.label] // 當(dāng)前node的名字
      let level = 1 // 層級(jí)
      while (level < node.level) {
        labels = [...labels, parentNode.label] // 當(dāng)前node名字,父級(jí)node的名字
        parentNode = parentNode.parent
        level++
      }
      return labels.some(d => d.indexOf(value) !== -1)
      // 總結(jié):之前沒(méi)解決的是因?yàn)?只隱藏支線父節(jié)點(diǎn)是隱藏不掉的,隱藏父節(jié)點(diǎn)包括下面的所有子節(jié)點(diǎn)才能隱藏
    }

openSuperior 方法

 
    // 展開(kāi)所有父級(jí)
    openSuperior(node) {
      if (node.parent) {
        node.parent.expanded = true
        this.openSuperior(node.parent)
      }
    },

findTreeIdObjFn方法:

// 傳入id(key)返回當(dāng)前所在對(duì)象
/**
 * @param {*} data  樹(shù)形結(jié)構(gòu)全部數(shù)據(jù)
 * @param {*} key   查找的key
 * @param {*} value 傳入的key對(duì)應(yīng)的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數(shù)據(jù)當(dāng)前節(jié)點(diǎn)的id及所有子孫的id(key)集合
/**
 * @param {*} data  tree數(shù)據(jù)
 * @param {*} key    要查找的key
 * @param {*} value  key對(duì)應(yīng)的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
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue在線預(yù)覽word、excel、pdf、txt、圖片的方法實(shí)例

    vue在線預(yù)覽word、excel、pdf、txt、圖片的方法實(shí)例

    最近工作中遇到了一個(gè)需要在線預(yù)覽文件的需求,所以這篇文章主要給大家介紹了vue在線預(yù)覽word、excel、pdf、txt、圖片的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • Vue打包后出現(xiàn)一些map文件的解決方法

    Vue打包后出現(xiàn)一些map文件的解決方法

    本篇文章主要介紹了Vue打包后出現(xiàn)一些map文件的解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • Vue實(shí)現(xiàn)簡(jiǎn)單購(gòu)物車小案例

    Vue實(shí)現(xiàn)簡(jiǎn)單購(gòu)物車小案例

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)簡(jiǎn)單購(gòu)物車小案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • vue2.x與vue3.x中自定義指令詳解(最新推薦)

    vue2.x與vue3.x中自定義指令詳解(最新推薦)

    vue自定義指令(2.x丨3.x)可以幫助我們實(shí)現(xiàn)需要操作,比如防抖、節(jié)流、懶加載、輸入框自動(dòng)聚焦等等,使用起來(lái)非常方便,比如vue自帶的v-text、v-html、v-show、v-if等等,這篇文章主要介紹了vue2.x與vue3.x中自定義指令詳解,需要的朋友可以參考下
    2022-12-12
  • vue項(xiàng)目history模式刷新404問(wèn)題解決辦法

    vue項(xiàng)目history模式刷新404問(wèn)題解決辦法

    這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目history模式刷新404問(wèn)題的解決辦法,需要的朋友可以參考下
    2023-11-11
  • 給vue項(xiàng)目添加ESLint的詳細(xì)步驟

    給vue項(xiàng)目添加ESLint的詳細(xì)步驟

    本篇文章主要介紹了給vue項(xiàng)目添加ESLint的詳細(xì)步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • vue懶加載和子組件懶加載的區(qū)別詳解

    vue懶加載和子組件懶加載的區(qū)別詳解

    這篇文章主要給大家介紹了vue懶加載和子組件懶加載有什么區(qū)別,Vue懶加載指的是對(duì)圖片等資源的延遲加載,而子組件懶加載則是指延遲加載組件實(shí)例,文中通過(guò)代碼示例給大家講解的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • 詳解Vue中$refs和$nextTick的使用方法

    詳解Vue中$refs和$nextTick的使用方法

    這篇文章主要為大家介紹了Vue中$refs和$nextTick的使用方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Vue有一定幫助,需要的可以參考一下
    2022-03-03
  • 如何實(shí)現(xiàn)vue的tree組件

    如何實(shí)現(xiàn)vue的tree組件

    這篇文章主要介紹了如何實(shí)現(xiàn)vue的tree組件,幫助大家更好的理解和學(xué)習(xí)vue框架,感興趣的朋友可以了解下
    2020-12-12
  • vue如何循環(huán)給對(duì)象賦值

    vue如何循環(huán)給對(duì)象賦值

    這篇文章主要介紹了vue如何循環(huán)給對(duì)象賦值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04

最新評(píng)論

察雅县| 原阳县| 贡觉县| 沅陵县| 湘潭县| 莱芜市| 舟曲县| 高陵县| 梅河口市| 闵行区| 夏河县| 乾安县| 庆城县| 漳州市| 博罗县| 南宁市| 从化市| 石嘴山市| 中宁县| 安陆市| 连山| 柘荣县| 武宁县| 鄄城县| 皮山县| 上林县| 苍山县| 尉氏县| 克东县| 介休市| 托里县| 保亭| 平原县| 大理市| 洪江市| 阜阳市| 泰兴市| 青浦区| 陇西县| 永城市| 东丽区|