案例下载:https://gitee.com/tudoumlp/just1.git   (vue-ele-demo)

在项目中,会遇到树节点的搜索,中文和英文搜索,以及搜索到父节点匹配的时候同步显示该父节点下所有的子节点,搜索到子节点匹配的时候同步显示该子节点的父节点。话不多说,以下是代码:

首先是组件部分:

<template>
<el-popover placement="bottom-start" trigger="click" style="width:100%;" v-model="cdListVisible">
  <el-tree :data="cdList" :props="{ label: 'name', children: 'children' }"
    node-key="id" ref="cdListTree"
    :filter-node-method="filterNodeTree"
    @current-change="currentHandle">
  </el-tree>
  <template>
    <el-input slot="reference" v-model="dataForm.parentName" @input="filterInput" placeholder="设备树"></el-input>
  </template>
</el-popover>
</template>
:data="cdList"是请求回来的树数据
:filter-node-method="filterNodeTree" 自定义过滤方法(重点)
@current-change="currentHandle" 当前树节点选中事件(可忽略,做赋值操作)
@input="filterInput" 输入信息触发过滤事件(重要)

接下来是事件部分:

filterInput () {
  //调用el-tree的filter方法,触发条件过滤,并将当前输入的信息传递到事件内部.
  this.$refs.cdListTree.filter(this.dataForm.parentName)
},
// 调用tree过滤方法 中文英过滤
filterNodeTree (value, data, node) {
  if (!value) {
    //如果数据为空,则返回true,显示所有的数据项
    node.expanded = false
    return true
  }
  // 查询列表是否有匹配数据,将值小写,匹配英文数据
  let val = value.toLowerCase()
  return this.chooseNode(val, data, node) // 调用过滤二层方法
},
 // 过滤父节点 / 子节点 (如果输入的参数是父节点且能匹配,则返回该节点以及其下的所有子节点;如果参数是子节点,则返回该节点的父节点。name是中文字符,enName是英文字符.
  chooseNode (value, data, node) {
    if (data.name.indexOf(value) !== -1 || data.enName.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.name.indexOf(value) !== -1 || parentData.data.enName.indexOf(value) !== -1) {
return true
}
// 否则的话再往上一层做匹配
parentData = parentData.parent
index++
}
// 没匹配到返回false
return false
},

最后,数据格式:以下是模拟数据

let city = [
    { name: '北京', enName: 'bj', children: [ { name: '朝阳区', enName: 'cyq' }, { name: '大兴区', enName: 'dxq' }, { name: '昌平区', enName: 'cpq' } ] },
    { name: '天津', enName: 'tj', children: [ { name: '南开区', enName: 'nkq' }, { name: '和平区', enName: 'hpq' }, { name: '西青区', enName: 'xqq' } ] }
  ]
 this.cdList = city

看结果:

获取焦点之后,显示所有的数据

中文搜索:

英文搜索:

这就实现了,输入子节点或者父节点的名称显示相应的父节点或子节点。

以下是完整代码:

<template>
  <el-popover placement="bottom-start" trigger="click" style="width:100%;" v-model="cdListVisible">
    <el-tree :data="cdList" :props="{ label: 'name', children: 'children' }"
      node-key="id" ref="cdListTree"
      :filter-node-method="filterNodeTree"
      @current-change="currentHandle">
    </el-tree>
    <template>
      <el-input slot="reference" v-model="dataForm.parentName" @input="filterInput" placeholder="设备树"></el-input>
    </template>
  </el-popover>
</template> <script>
export default {
data () {
return {
visible: false,
cdList: [], // 城市菜单列表
cdListVisible: false,
dataForm: {
parentName: ''
}
}
},
methods: {
    filterChange () {
    //调用el-tree的filter方法,触发条件过滤,并将当前输入的信息传递到事件内部
    this.$refs.cdListTree.filter(this.dataForm.parentName)
},
// 调用tree过滤方法 中文英过滤
filterNode (value, data, node) {
if (!value) {
node.expanded = false
return true
}
// 查询列表是否有匹配数据
let val = value.toLowerCase()
return this.chooseNode(val, data, node)
},
// 过滤父节点 子节点:如果输入的参数是父节点且能匹配,则返回该节点以及其下的所有子节点;如果参数是子节点,则返回该节点的父节点。
chooseNode (value, data, node) {
if (data.name.indexOf(value) !== -1 || data.enName.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.name.indexOf(value) !== -1 || parentData.data.enName.indexOf(value) !== -1) {
return true
}
// 否则的话再往上一层做匹配
parentData = parentData.parent
index++
}
// 没匹配到返回false
return false
},
  // 点击选中
currentHandle (selectData) {
if (selectData.children.length === 0) {
this.dataForm.parentName = selectData.name
this.cdListVisible = false
}
}
}
</script>

至此,搜索过滤完毕,有不正之处还望指出,谢谢呀呀~~

(Elementui) el-tree 中英文过滤以及搜索到父子显示子节点,搜索到子节点显示父节点(filter-node-method)的更多相关文章

  1. vue+element-ui之tree树形控件有关子节点和父节点之间的各种选中关系详解

    做后端管理系统,永远是最蛋疼.最复杂也最欠揍的事情,也永远是前端开发人员最苦逼.最无奈也最尿性的时刻.蛋疼的是需求变幻无穷,如同二师兄的三十六般变化:复杂的是开发难度寸步难行,如同蜀道难,难于上青天: ...

  2. elementUI vue tree input 懒加载 输入下拉树型示例 点击其他区域关闭自定义div

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  3. ELementUI 树形控件tree 获取子节点同时获取半选择状态的父节点ID

    使用element-ui  tree树形控件的时候,在选择一个子节点后,使用getCheckedKeys 后,发现只能返回子节点的ID,但是其父节点ID没有返回. 解决办法有三种: 1.element ...

  4. element-ui tree控件获取当前节点和父节点

    今天使用element-ui 遇到两个问题,第一个问题是获取tree控件的当前节点和父节点, 一开始使用tree控件的getCurrentNode()函数,结果发现返回的是当前节点的data属性,和u ...

  5. 自己封装element-ui树组件的过滤

    前言:vue开发项目时用到了element-ui的树组件,但是发现一执行过滤事件,树就全部都展开了,为了解决这个问题,只能自己先过滤数剧,再赋值给树组件的data,就避免了一上来全部展开的尴尬. 一. ...

  6. element-ui的Tree树组件使用技巧

    目录 1,前言 2,需求 3,解决思路 4,完整代码 5,总结 1,前言 最近这段时间在做一个新的模块,其中有一个三层的树结构,产品经理提出了一个很古怪的需求,整的我只能自己控制树的交互,写完之后,感 ...

  7. vue_elementUI_ tree树形控件 获取选中的父节点ID

    el-tree 的 this.$refs.tree.getCheckedKeys() 只可以获取选中的id 无法获取选中的父节点ID想要获取选中父节点的id;需要如下操作1. 找到工程下的node_m ...

  8. Element ui tree树形控件获取当前节点id和父节点id

    低版本Element ui tree树形控件获取当前节点id和父节点id的方法:点击查看 最新版本Element ui tree树形控件获取当前节点id和父节点id教程: 1.找到node_modul ...

  9. [LeetCode] Lowest Common Ancestor of a Binary Tree 二叉树的最小共同父节点

    Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According ...

随机推荐

  1. 图解MySQL:count(*) 、count(1) 、count(主键字段)、count(字段)哪个性能最好?

    大家好,我是小林. 当我们对一张数据表中的记录进行统计的时候,习惯都会使用 count 函数来统计,但是 count 函数传入的参数有很多种,比如 count(1).count(*).count(字段 ...

  2. Linux 中安装、升级、配置 Swoole 扩展

    从源码编译安装 # 下载Swoole wget http://pecl.php.net/get/swoole-4.5.2.tgz tar -zxvf swoole-4.5.2.tgz cd swool ...

  3. SpringBoot集成jasperreport实现打印功能

    1.jaspersoft studio工具下载地址 下载直通车 2.工具使用方法查看以下链接 工具使用 3.将工具编译后的.jasper文件放到SpringBoot项目的resources/templ ...

  4. 获取python的版本

    import sys # Syntax sugar. _ver = sys.version_info # 获取python版本 #: Python 2.x? is_py2 = (_ver[0] == ...

  5. Centos7下yum安装mydql8

    昨天安装mydql时总是报错缺少插件,虽然最后安装上了,但还是在此记录下 一. 安装centos7系统系统 在选择安装基本环境时,选择基本环境为"网页服务器",昨天我因为选择了&l ...

  6. Java复制文件用数据流方法,renameTO()方法是相当于剪切操作

    我想达到的效果是,一个文件复制到另一个地方,然后重命名 //判断是否存在 File file = new File("D:/tomcat9.0.12/apache-tomcat-9.0.12 ...

  7. MySQL使用时间作为判断条件

    背景:在开发过程中,我们经常需要根据时间作为判断条件来查询数据,例如:当月,当日,当前小时,几天内...... 1. 当月 我们只需要使用一个mysql的MONTH(date)函数即可实现.(注意判断 ...

  8. PkavHTTPFuzzer爆破带验证码的后台密码

    之前对暴力破解这块并没有做系统的总结,况且登录这块也是个重头戏,所以我想总结总结. 环境准备 1.用phpstudy搭建phpwms1.1.2演示环境 2.pkavhttpfuzzer工具 漏洞复现 ...

  9. php反序列化之pop链构造

    本题是某信有一次内部比赛的题目,涉及到pop链的构造问题,所以在这里与大家分享一下 题目 查看源码 逻辑是当参数fn存在且不包含string.zlib.flag这三个字符串时,进行文件包含这里的过滤是 ...

  10. 应用层:http请求报文和响应报文

    1.http请求报文 请求报文由请求行.报文头.空行.报文体组成. 请求行可分为请求方法.请求URL.HTTP协议及版本. 举例1: GET / HTTP/1.1\nHost: 220.181.38. ...