elementui tree 節(jié)點(diǎn)過(guò)濾加載對(duì)應(yīng)子節(jié)點(diǎn)

element-ui tree 節(jié)點(diǎn)過(guò)濾加載對(duì)應(yīng)子節(jié)點(diǎn)方法,官網(wǎng)例子,不會(huì)返回過(guò)濾節(jié)點(diǎn)
的子節(jié)點(diǎn),這也是總結(jié)這篇博客的原因。

//官網(wǎng)例子
<el-input
  placeholder="輸入關(guān)鍵字進(jìn)行過(guò)濾"
  v-model="filterText">
</el-input>

<el-tree
  class="filter-tree"
  :data="data2"
  :props="defaultProps"
  default-expand-all
  :filter-node-method="filterNode"
  ref="tree2">
</el-tree>

<script>
  export default {
    watch: {
      filterText(val) {
        this.$refs.tree2.filter(val);
      }
    },

    methods: {
    //不會(huì)返回匹配的node的子節(jié)點(diǎn)
      filterNode(value, data) {
        if (!value) return true;
        return data.label.indexOf(value) !== -1;
      }
    },

    data() {
      return {
        filterText: '',
        data2: [{
          id: 1,
          label: '一級(jí) 1',
          children: [{
            id: 4,
            label: '二級(jí) 1-1',
            children: [{
              id: 9,
              label: '三級(jí) 1-1-1'
            }, {
              id: 10,
              label: '三級(jí) 1-1-2'
            }]
          }]
        }, {
          id: 2,
          label: '一級(jí) 2',
          children: [{
            id: 5,
            label: '二級(jí) 2-1'
          }, {
            id: 6,
            label: '二級(jí) 2-2'
          }]
        }, {
          id: 3,
          label: '一級(jí) 3',
          children: [{
            id: 7,
            label: '二級(jí) 3-1'
          }, {
            id: 8,
            label: '二級(jí) 3-2'
          }]
        }],
        defaultProps: {
          children: 'children',
          label: 'label'
        }
      };
    }
  };
</script>

  • 此時(shí)可以實(shí)現(xiàn),當(dāng)點(diǎn)擊搜索時(shí),只會(huì)搜索到當(dāng)前節(jié)點(diǎn)包含該搜索字段filterText的樹(shù)渲染
  • 而我們一般實(shí)際業(yè)務(wù)中,需要搜索到其下所有的子節(jié)點(diǎn)
  • 實(shí)現(xiàn)方法如下(修改filterNode方法即可,注意注意:filterNode方法有三個(gè)參數(shù))
filterNode(value,data,node) {
  //如果有三級(jí)
  if (!value) return true;
  let if_one = node.data.label.indexOf(value) !== -1
  let if_two = node.parent && node.parent.data && node.parent.data.label && (node.parent.data.label.indexOf(value) !== -1)
  let if_three = node.parent && node.parent.parent && node.parent.parent.data && node.parent.parent.data.label && (node.parent.parent.data.label.indexOf(value) !== -1)
  let result_one = false
  let result_two = false
  let result_three = false
  if(node.level === 1) {
    result_one = if_one
  }else if(node.level === 2) {
    result_two = if_one || if_two
  }else if(node.level === 3) {
    result_three = if_one || if_two || if_three
  }
  return result_one || result_two || result_three
}

//優(yōu)化之后的代碼 不管有幾級(jí)都可以適用
filterNode(value,data,node) {
  if(!value){
    return true;
  }
  let level = node.level;
  let _array = [];//這里使用數(shù)組存儲(chǔ) 只是為了存儲(chǔ)值。
  this.getReturnNode(node,_array,value);
  let result = false;
  _array.forEach((item)=>{
    result = result || item;
  });
  return result;
},
getReturnNode(node,_array,value){
 let isPass = node.data &&  node.data.label && node.data.label.indexOf(value) !== -1;
 isPass?_array.push(isPass):'';
 this.index++;
 console.log(this.index)
 if(!isPass && node.level!=1 && node.parent){
  this.getReturnNode(node.parent,_array,value);
 }
}


//如果不明白上面的寫(xiě)法 可以看下面詳解的寫(xiě)法 


 // 觸發(fā)頁(yè)面顯示配置的篩選
      filterNode(value, data, node) {
        // 如果什么都沒(méi)填就直接返回
        if (!value) return true;
        // 如果傳入的value和data中的label相同說(shuō)明是匹配到了
        if (data.label.indexOf(value) !== -1) {
          return true;
        }
        // 否則要去判斷它是不是選中節(jié)點(diǎn)的子節(jié)點(diǎn)
        return this.checkBelongToChooseNode(value, data, node);
      },
      // 判斷傳入的節(jié)點(diǎn)是不是選中節(jié)點(diǎn)的子節(jié)點(diǎn)
      checkBelongToChooseNode(value, data, node) {
        const level = node.level;
        // 如果傳入的節(jié)點(diǎn)本身就是一級(jí)節(jié)點(diǎn)就不用校驗(yàn)了
        if (level === 1) {
          return false;
        }
        // 先取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)
        let parentData = node.parent;
        // 遍歷當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)
        let index = 0;
        while (index < level - 1) {
          // 如果匹配到直接返回
          if (parentData.data.label.indexOf(value) !== -1) {
            return true;
          }
          // 否則的話再往上一層做匹配
          parentData = parentData.parent;
          index ++;
        }
        // 沒(méi)匹配到返回false
        return false;
      },


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明AI閱讀 16,171評(píng)論 3 119
  • 我是一名高二的學(xué)生,本來(lái)說(shuō)好初中就拉牙齒的,但是遲遲推到了現(xiàn)在才拉。然后高二了,暑假也不長(zhǎng),所以之前還猶豫到底要不...
    ZHENGBINBINZ閱讀 211評(píng)論 0 0
  • 端午的后兩天,我們一起來(lái)到福州,準(zhǔn)備在他畢業(yè)后即將工作的城市,福州,租下一個(gè)房子。這次租房,有小感動(dòng),也有...
    盒子亭閱讀 701評(píng)論 5 1

友情鏈接更多精彩內(nèi)容