首页 > 其他分享 >vue+el-tree 通过下拉框选中节点,定位到当前节点,并高亮

vue+el-tree 通过下拉框选中节点,定位到当前节点,并高亮

时间:2023-08-09 14:26:00浏览次数:45  
标签:node el 父级 nodeParentAll tree 下拉框 query 节点

此处为下拉选择器:

        <el-select
          ref="searchSelect"
          v-model="filter"
          filterable
          remote
          size="mini"
          clearable
          placeholder="请输入关键词"
          :remote-method="remoteMethod"
          @input="handleChange"
          @focus="selectFocus"
          @visible-change="visibleChange"
          @blur="selectBlur"
          @change="selectChange">
          <el-option
            v-for="(item,i) in options"
            :key="item.id+'_'+i"
            :label="item.label"
            :value="item.id">
          </el-option>
        </el-select>

 此处为过滤节点,满足条件的树节点按名称显示在下拉选择器种:

    remoteMethod(query) {
      if (query !== '' && query.trim() !== '') {
        this.filterCopy = query
        this.loading = true;
        setTimeout(() => {
          this.loading = false;
          this.options = this.filterCallback({query, filterType: this.filterType});
        }, 200);
      } else {
        this.options = [];
      }
    }
    getListByKey({query: val, filterType}) {
//此处flatTreeData是由el-tree的数据转换来的,具体方法如下: return this.flatTreeData .filter((item) => { const includesLabel = item.label ? item.label.toLowerCase().indexOf(val.toLowerCase()) > -1 : false const includesId = item.id ? item.id.toLowerCase().indexOf(val.toLowerCase()) > -1 : false const filterTypeMap = { 0: includesId, 1: includesLabel } return filterType ? filterTypeMap[filterType] : (includesId || includesLabel) }) .splice(0, 500); },
    mapTree(data) {
      const arr = []
      function fn(arrs) {
        for (let items of arrs) {    //遍历树
          if (items.type === 'node') {
            arr.push(items)
          }
          if (items.children && items.children.length > 0) {
            fn(items.children)
          }
        }
      }
      fn(data)
      return arr
    },

以下为选中节点时,触发的事件

    handleChange(val) {
      this.$refs.tree.scrollToNode(val)
      this.filter = this.filterCopy
    },
    selectFocus(e) {
      let value = e.target.value;
      setTimeout(() => {
        let input = this.$refs.searchSelect.$children[0].$refs.input;
        input.value = value;
        if (value) {
          this.remoteMethod(value)
        }
      })
    },

此处为关键节点,选中节点设置为当前节点,并滚动到屏幕中间。

scrollToNode(scrollToData) {
      const node = this.$refs.tree.getNode(scrollToData);
      if (node) {
        // 获取其所有父级节点
        this.getParentAll(node)
        if (this.nodeParentAll.length > 0) {
          // 将获取到的所有父级节点进行展开
          for (var i = 0, n = this.nodeParentAll.length; i < n; i++) {
          this.$refs.tree.store.nodesMap[this.nodeParentAll[i].data.id].expanded = true
          }
        }
      }
      // 使用节点的数据来查找对应的 DOM 节点
      this.$refs.tree.setCurrentKey(scrollToData)
      setTimeout(() => {
        //根据树id 找到高亮的节
        let node = document.querySelector('.c-tree-content .is-current');
        if (node) {
          setTimeout(() => {
            node.scrollIntoView({block:"center"}); //有bug,可尝试
          }, 500);
        }
      }, 0);
    },
    // 获取所有父级节点
    getParentAll(node) {
      if (node) {
        this.nodeParentAll = []
        // 节点的第一个父级
        var parentNode = node.parent
        // level为节点的层级 level=1 为顶级节点
        for (var j = 0, lv = node.level; j < lv; j++) {
          if (parentNode.level > 0) {
            // 将所有父级节点放入集合中
            this.nodeParentAll.push(parentNode)
          }
          // 继续获取父级节点的父级节点
          parentNode = parentNode.parent
        }

        if (this.nodeParentAll.length > 1) {
          // 如果集合长度>1 则将数组进行倒叙.reverse() 其是就是将所有节点按照 从 顶级节点 依次往下排
          this.nodeParentAll.reverse()
        }
      }
    },

大概记录下...................................................................................备用

标签:node,el,父级,nodeParentAll,tree,下拉框,query,节点
From: https://www.cnblogs.com/zmh-980509/p/17616704.html

相关文章

  • Element-Plus 学习笔记一
    这几天在学vue3,用Element-plus加vue3搭了个框架,在这里记录一下项目搭建中遇到的问题。 1、使用Element-plus的icon图标,显示不出来  首先,用命令行中安装 Element-plus的图标:npminstall@element-plus/icons-vue--save  然后,在main.js中进行全局......
  • Linux Ubuntu Helloworld 模块 的编译 插入 删除
    总述:编写.c文件和Makefile文件->make->生成点.ko文件->insmode->lsmode->rmmode. 一、编写Hello.c与Makefile ubuntu@ubuntu-VirtualBox:/$cd~/Desktop/ubuntu@ubuntu-VirtualBox:~/Desktop$cdMooc/ubuntu@ubuntu-VirtualBox:~/Desktop/Mooc$vimhelloworld.cubuntu......
  • Excel实现下拉菜单多选
    Excel实现下拉菜单多选注意事项需要用到VBA宏编程WPS需要商业版才能启用VBA编程,office破解版(仅供学习)可以使用本文所有操作均在office2021上进行 一、(已有可忽略)打开office开发者工具"文件“-->"选项"-->"自定义功能区"-->勾上"开发者工具" 二、设......
  • win11 PowerShell关闭拆分选项卡窗框窗口
    PowerShell拆分窗格一、拆分选项卡窗格1.鼠标操作:2.快捷键操作:Alt+Shift+d、Alt+Shift+minus、Alt+Shift+plus没点一次,就在当前选项卡上拆分一次。minus:键盘上-减号键plus:键盘上+加号键COMMA键盘上的“逗号”equal键盘上的“=”二、关闭拆分......
  • java XSSFWorkbook excel 公式计算
    excel公式计算//创建一个工作薄XSSFWorkbookworkbook=newXSSFWorkbook();//如果是最后一列添加一个求和计算,将结果放到同一列最后一个。dataLists数据列表XSSFSheetsheet=workbook.getSheet(replaceSpecStr(sheetNames.get(0)));Rowrow......
  • 关于菜鸡学习RHEL8的一些小笔记--->防火墙
    #如果说SELINUX是对内管控应用程序的安全,那么防火主要是对外进行管理防火墙:Linux的内核中包含了netfilter,netfilter主要是对流量操作的一个框架,其中包括数据包的过滤,网络地址转换和端口转发等;在rhel8中内核还包含nftables,这是一个较新的数据包分类和过滤的子系统,在netfilter的......
  • 输入框 input的 支持 clearable 清空 select 下拉列表框的 支持 clearable 清空 fil
    开发的前端 中select 下拉列表框 必须支持1、模糊查询2、清空按钮......
  • vue3 + ElementPlus 封装函数式弹窗组件
    需求场景:弹窗组件需要支持自定义的插槽内容,删除的弹窗也要使用这个组件,只是样式不一样而已,希望在父组件使用删除弹窗的时候直接调用某个方法就可以显示弹窗组件模拟cuDialog假设我的弹窗组件有以下的props和事件dialogVisible:控制弹窗显示和隐藏title:弹窗的标题showClose......
  • Qemu中helper机制的理解
    因为项目中准备使用AFL+++Qemu下,所以研究了其中AFL++下的Qemuafl的源码,其中插桩的方式与AFL原理一样,但是代码相差很大,因此记录一下。qemuafl中桩点基本逻辑1)qemuafl是AFL++直接fork了一份Qemu的源码,在Qemu的源码中直接进行代码修改。2)其中使用每个基本块的PC来作为每个基本......
  • select的错误用法
     执行 manselect 会有如下提示 说明调用select函数时传入的timeval的值会变,所以在重复调用select的场景下,每次调用select,timeval的值都需要重新设置,如下是一个错误的示例,需要将设置时间值的代码移到while(1)里面 ......