el-tree搜索父节点,父子节点一起展示

会2024.04.22今天我学习了如何对el-tree的:filter-node-method方法进行优化,如果我们有多层的节点数据,

比如我们有这样的数据,当我们输入水果的时候应该出现的是水果和特级水果这两个父节点以及对应底下的子节点数据, 用element里面Element - The world's most popular Vue UI framework里面自带的搜索方法

      filterNode(value, data) {
        if (!value) return true;
        return data.label.indexOf(value) !== -1;
      }

会出现:

 

导致子节点数据都没有,

 后来百度了查到搜索父节点还能保留子节点数据的方法:

    filterNode(value, data, node) {
      if (!value) return true;
      if (data.label) {
        return this.chooseNode(value, data, node);
      }
    },
    // 过滤父节点 / 子节点 (如果输入的参数是父节点且能匹配,则返回该节点以及其下的所有子节点;如果参数是子节点,则返回该节点的父节点。name是中文字符,enName是英文字符.
    chooseNode(value, data, node) {
      if (data.label.indexOf(value) !== -1) {
        return true
      }
      const level = node.level
      // 如果传入的节点本身就是一级节点就不用校验了
      if (level === 1) {
        return false
      }
      // 先取当前节点的父节点
      let parentData = node.parent
      // 遍历当前节点的父节点
      let index = 0
      while (index < level - 1) {
        // 如果匹配到直接返回,此处name值是中文字符,enName是英文字符。判断匹配中英文过滤
        if (parentData.data.label.indexOf(value) !== -1) {
          return true
        }
        // 否则的话再往上一层做匹配
        parentData = parentData.parent
        index++
      }
      // 没匹配到返回false
      return false
    },

效果如下:

 

完整代码如下:

<template>
  <div>
    <el-input v-model="input"/>
    <el-tree
      ref="tree"
      node-key="id"
      :data="data"
      default-expand-all
      :props="props"
      :filter-node-method="filterNode"
    />
  </div>
</template>
<script>
export default {
  data() {
    return {
      data: [
        { id: 1, label: '水果', children: [{ id: 2, label: '苹果' }, { id: 3, label: '香蕉' }] },
        { id: 4, label: '特级-水果', children: [{ id: 5, label: '特级-蓝莓' }, { id: 6, label: '特级-草莓' }] },
        { id: 7, label: '蔬菜', children: [{ id: 8, label: '白菜' }, { id: 9, label: '土豆' }] },
      ],
      props: {
        label: 'label',
        children: 'children'
      },
      input:''
    }
  },
  watch:{
    input(val){
      return this.$refs.tree.filter(val)
    }
  },
  methods:{
    filterNode(value, data, node) {
      if (!value) return true;
      if (data.label) {
        return this.chooseNode(value, data, node);
      }
    },
    // 过滤父节点 / 子节点 (如果输入的参数是父节点且能匹配,则返回该节点以及其下的所有子节点;如果参数是子节点,则返回该节点的父节点。name是中文字符,enName是英文字符.
    chooseNode(value, data, node) {
      if (data.label.indexOf(value) !== -1) {
        return true
      }
      const level = node.level
      // 如果传入的节点本身就是一级节点就不用校验了
      if (level === 1) {
        return false
      }
      // 先取当前节点的父节点
      let parentData = node.parent
      // 遍历当前节点的父节点
      let index = 0
      while (index < level - 1) {
        // 如果匹配到直接返回,此处name值是中文字符,enName是英文字符。判断匹配中英文过滤
        if (parentData.data.label.indexOf(value) !== -1) {
          return true
        }
        // 否则的话再往上一层做匹配
        parentData = parentData.parent
        index++
      }
      // 没匹配到返回false
      return false
    },
  }
}
</script>

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码无敌小奶龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值