vue-org-tree搜索到对应项高亮展开

news2024/10/7 11:31:18

效果图:

代码:

<template>
  <div class="AllTree">
    <el-form :inline="true" :model="formInline" class="demo-form-inline">
      <el-form-item>
        <el-input v-model="formInline.user" placeholder="请输入名称"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="handleSearch">查询</el-button>
      </el-form-item>
    </el-form>
    <div ref="treeContainer" class="tree-container">
      <org-tree :data="data" :horizontal="true" name="test" :label-class-name="labelClassName" collapsable
        @on-expand="onExpand" @on-node-click="clickTree" ref="orgTree" :label-width="150"
        :line-style="{ stroke: '#ccc', strokeWidth: 2 }">
      </org-tree>
    </div>
    <!-- 俱乐部信息弹窗 -->
    <el-drawer title="俱乐部信息" :visible.sync="drawer" :before-close="handleClose">
      <span>我来啦!</span>
    </el-drawer>
  </div>
</template>

 初始化定义数据:

import OrgTree from 'vue2-org-tree';
import 'vue2-org-tree/dist/style.css';

export default {
  components: {
    orgTree: OrgTree
  },
  data() {
    return {
      formInline: {
        user: ''
      },
      id: null,
      drawer: false,
      data:{},
      data1: {
        id: 0,
        label: "XX俱乐部",
        children: [
          {
            id: 2,
            label: "xx合伙人",
            children: [
              {
                id: 5,
                label: "研发-前端",
                children: [
                  {
                    id: 55,
                    label: "前端1",
                    children: [
                      {
                        id: 555,
                        label: "前端1111",
                      },
                      {
                        id: 556,
                        label: "前端2222",
                      },
                      {
                        id: 557,
                        label: "前端3333",
                        children: [{
                          id: 5557,
                          label: "前端11111",
                        },
                        {
                          id: 5558,
                          label: "前端22222",
                        },
                        {
                          id: 5559,
                          label: "前端33333",
                        },
                        {
                          id: 5560,
                          label: "前端44444",
                        },
                        {
                          id: 5561,
                          label: "前端55555",
                        }]
                      },
                      {
                        id: 558,
                        label: "前端3333",
                      }
                    ]
                  },
                  {
                    id: 56,
                    label: "前端2"
                  },
                  {
                    id: 57,
                    label: "前端3"
                  },
                  {
                    id: 58,
                    label: "前端4"
                  }
                ]
              },
              {
                id: 6,
                label: "研发-后端"
              },
              {
                id: 9,
                label: "UI设计"
              },
              {
                id: 10,
                label: "产品经理"
              }
            ]
          },
          {
            id: 3,
            label: "销售部",
            children: [
              {
                id: 7,
                label: "销售一部",
                children: [
                  {
                    id: 78,
                    label: "销售一部组长",
                    children: [{
                      id: 788,
                      label: "销售一部A",
                    },
                    {
                      id: 789,
                      label: "销售一部B",
                    },
                    {
                      id: 790,
                      label: "销售一部C",
                    },
                    {
                      id: 791,
                      label: "销售一部D",
                    }]
                  }
                ]
              },
              {
                id: 8,
                label: "销售二部"
              }
            ]
          },
          {
            id: 4,
            label: "财务部"
          },
          {
            id: 9,
            label: "HR人事"
          }
        ]
      },
      defaultProps: {
        children: 'children',
        label: 'label'
      },
      zoom: 1,
      BasicSwich: false,
      collapsable: true,
      labelClassName: "org-bg-white",
      clickTimeout: null
    };
  },

 搜索事件定义方法:

 created() {
    this.getTreeData();
  },
  methods: {
    //获取节点数据
    getTreeData(){
      this.data=this.data1
      this.expandChange();
    },
    renderContent(h, data) {
      return data.label;
    },
    // 树状结构折叠打开
    onExpand(e, data) {
      if ("expand" in data) {
        data.expand = !data.expand;
        if (!data.expand && data.children) {
          this.collapse(data.children);
        }
      } else {
        this.$set(data, "expand", true);
      }
    },
    collapse(list) {
      var _this = this;
      list.forEach(function (child) {
        if (child.expand) {
          child.expand = false;
        }
        child.children && _this.collapse(child.children);
      });
    },
    expandChange() {
      this.toggleExpand(this.data, true);
    },
    toggleExpand(data, val) {
      var _this = this;
      if (Array.isArray(data)) {
        data.forEach(function (item) {
          _this.$set(item, "expand", val);
          if (item.children) {
            _this.toggleExpand(item.children, val);
          }
        });
      } else {
        this.$set(data, "expand", val);
        if (data.children) {
          _this.toggleExpand(data.children, val);
        }
      }
    },
    // 搜索事件
    handleSearch() {
      const isLabelFound = this.findLabel(this.data, this.formInline.user.trim());
      console.log('isLabelFound',isLabelFound)

    },
    findLabel(node, targetLabel) {
       // 清除先前设置的背景色
      this.clearHighlight();
      const searchInChildren = (node) => {
        if (node.id == 0) {
          node.expand = true          
        }
        //检查当前节点
        if (node.label === targetLabel) {
          this.id = node.id;
          node.expand = true;
          this.highlightLabel(targetLabel, "#46a6ff"); // 设置背景色为 pink
          return true;//找到目标节点
        }
        //递归搜索子节点
        if (node.children) {
          for (let child of node.children) {
            if (searchInChildren(child)) {
              child.expand = true
              return true;//如果在子节点找到目标节点,直接返回true
            }
          }
        }
        return false;//当前节点及其子节点都未找到目标节点
      }
      const found = searchInChildren(node)
      if (!found) {
        this.$message.warning('未找到该项')
      }
      return found ? this.id : false
    },
    highlightLabel(targetLabel, color) {
      // 异步更新,等待 DOM 渲染完成后再操作
      setTimeout(() => {
        let orgTreeList = document.getElementsByClassName('org-tree-node-label-inner');
        for (let i = 0; i < orgTreeList.length; i++) {
          if (orgTreeList[i].innerText === targetLabel) {
            orgTreeList[i].style.backgroundColor = color;
            break; // 找到第一个匹配的节点后即可退出循环
          }
        }
      }, 0);
    },

    clearHighlight() {
      let orgTreeList = document.getElementsByClassName('org-tree-node-label-inner');
      for (let i = 0; i < orgTreeList.length; i++) {
        orgTreeList[i].style.backgroundColor = ""; // 清除背景色
      }},
    //点击事件
    clickTree(e, data) {
      if (this.clickTimeout) {
        // 如果存在单击事件的计时器,则视为双击事件
        clearTimeout(this.clickTimeout);
        this.$router.push({
          path: "/dataVisualization/recommendedLinksDetail",
          query: {
            id: data.id,
          },
        });
      } else {
        // 否则,启动单击事件计时器
        this.clickTimeout = setTimeout(() => {
          this.drawer = true
          this.clickTimeout = null; // 清除计时器
        }, 500); // 200毫秒内判断是否双击
      }
      // const depth = this.getNodeDepth(data);
      // if (depth === 1) {
      //   // 第一层节点,显示弹窗或其他操作
      //   this.drawer = true
      // } else {
      //   // this.$router.push({
      //   //   path: "/dataVisualization/recommendedLinksDetail",
      //   //   query: {
      //   //     id: data.id,
      //   //   },
      //   // });
      //   console.log(111)
      // }

    },
    getNodeDepth(node, depth = 0) {
      // 递归计算节点的深度(层级)
      console.log(node)
      console.log(node.parent)
      if (node.parent) {
        return this.getNodeDepth(node.parent, depth + 1);
      }
      return depth;
    },
    handleClose() {
      this.drawer = false
    }
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1893326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年【天津市安全员B证】最新解析及天津市安全员B证实操考试视频

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【天津市安全员B证】最新解析及天津市安全员B证实操考试视频&#xff0c;包含天津市安全员B证最新解析答案和解析及天津市安全员B证实操考试视频练习。安全生产模拟考试一点通结合国家天津市安全员B证考试最新大…

C++必修:深入理解继承与虚继承

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. 继承的概念与定义 1.1. 继承的概念 继承(inheritance)机制是面向对象程序设计…

【12321骚扰电话举报受理中心-短信验证安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

【HTML入门】第一课 - 网页标签框架

这一节&#xff0c;我们说一下学习前端开发的话&#xff0c;最入门的也是非常重要的一门可成&#xff0c;也就是HTML。HTML标签&#xff0c;是网页的重要组成部分&#xff0c;可以说&#xff0c;你看到网页上的内容&#xff0c;都是基于HTML标签呈现出来的。 这一小节呢&#…

Windows系统安装SSH服务结合内网穿透配置公网地址远程ssh连接

前言 在当今的数字化转型时代&#xff0c;远程连接和管理计算机已成为日常工作中不可或缺的一部分。对于 Windows 用户而言&#xff0c;SSH&#xff08;Secure Shell&#xff09;协议提供了一种安全、高效的远程访问和命令执行方式。SSH 不仅提供了加密的通信通道&#xff0c;…

SalesForce集成案例-获取联系人信息

SalesForce本身比较复杂&#xff0c;涉及的东西比较多&#xff0c;下面以使用REST API接口为例&#xff0c;介绍与SalesForce集成的过程&#xff0c;集成案例&#xff1a;获取联系人信息。 首先需要注册一个免费的开发者帐号&#xff0c;具有完全操作SalesForce的权限。 1、注…

【vmbox centos7 网络配置】【centos7 glances 安装】【centos7 安装MySQL5.7】

文章目录 vmbox centos7 网络配置centos7 修改镜像地址centos7 安装 glancesCentOS 7 上安装 MySQL 5.7 并进行基本的安全配置使用 firewalld 开放 3306 端口 可以远程连接mysql vmbox centos7 网络配置 目前 能组建集群 虚拟机网络互通&#xff0c;虚拟机能访问外网 创建一个…

OpenCV库Windows端编译方法

编译前提 &#xff08;1&#xff09;下载好所需版本的OpenCV源码&#xff0c;点击进入下载地址&#xff0c;此处以OpenCV-2.4.13.6为例&#xff0c;下载页面截图如下图所示&#xff1a; 解压后如下图所示&#xff1a; &#xff08;2&#xff09;安装好CMake软件&#xff0c;点…

数据结构(一)C语言补

数据结构 内存空间划分 一个进程启动后&#xff0c;会生成4G的内存空间 0~3G是用户空间(应用层) 3~4G是内核空间(底层) 0~3G 3~4G 所有的进程都会共享3G~4G的内核空间&#xff0c; 但是每个进程会独立拥有0~3G的用户空间。 栈区 存放数据特点 栈区存放数据的申请空间的先后…

Ecology Letters | 植物多样性-生产力关系的正反馈机制:基于BEF-China的7年大规模实验数据

本文首发于“生态学者”微信公众号&#xff01; 森林提供了丰富的生态系统功能和服务&#xff0c;如生物质生产、碳固存、气候调节、水过滤和防止土壤侵蚀。森林生物多样性丧失的空前速度可能会严重损害世界森林提供基本生态系统功能和服务的能力。因此&#xff0c;了解物种丧失…

【Linux进阶】Linux目录配置,FHS

在了解了每个文件的相关种类与属性&#xff0c;以及了解了如何修改文件属性与权限的相关信息后&#xff0c;再来要了解的就是&#xff0c;为什么每个Linux发行版它们的配置文件、执行文件、每个目录内放置的东西&#xff0c;其实都差不多&#xff1f;原来是有一套标准依据&…

CentralCache中心缓存

目录 一.CentralCache基本结构 1.CentralCache任务 2.基本结构 二.函数调用层次结构/.h文件 三.Span和SpanList的封装 Span:大块内存跨度 PAGE_ID _pageId size_t _objSize _useCount SpanList:管理Span的双链表(桶锁) 四.获取大块内存GetOneSpan 五.FetchRangeObj输…

C语言作业笔记

1. 要找俩个数使其相加等于一个数&#xff0c;那么俩个数从头尾出发&#xff0c;先动一边&#xff0c;假设是尾先动&#xff0c;一开始俩个数相加大于sum&#xff08;小于的话就动头&#xff09;&#xff0c;那么总有一时刻俩数相加小于sum&#xff0c;则就在那一刻停下来&…

MySQL高可用(MHA高可用)

什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过程中最大…

机器学习与模式识别_清华大学出版社

contents 前言第1章 绪论1.1 引言1.2 基本术语1.3 假设空间1.4 归纳偏好1.5 发展历程1.6 应用现状 第2章 模型评估与选择2.1 经验误差与过拟合2.2 评估方法2.3 性能度量2.3.1 回归任务2.3.2 分类任务 2.4 比较检验2.5 偏差与方差2.5.1 偏差-方差分解2.5.2 偏差-方差窘境 第3章 …

In Ictu Oculi: Exposing AI Created Fake Videos by Detecting Eye Blinking

文章目录 In Ictu Oculi: Exposing AI Created Fake Videos by Detecting Eye Blinking背景关键点内容预处理Long-Term Recurrent CNNsLSTM-RNN模型训练实验data启示In Ictu Oculi: Exposing AI Created Fake Videos by Detecting Eye Blinking 会议:2018 IEEE International…

用Vue3和Rough.js绘制一个交互式3D图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 基于Rough.js和GSAP创建交互式SVG图形卡片 应用场景 本代码适用于需要创建动态交互式SVG图形卡片的场景&#xff0c;例如网页设计、数据可视化和交互式艺术作品。 基本功能 该代码利用Rough.js和GSAP库&…

数据分析入门指南:从基础概念到实际应用(一)

随着数字化时代的来临&#xff0c;数据分析在企业的日常运营中扮演着越来越重要的角色。从感知型企业到数据应用系统的演进&#xff0c;数据驱动的业务、智能优化的业务以及数智化转型成为了企业追求的目标。在这一过程中&#xff0c;数据分析不仅是技术的运用&#xff0c;更是…

在 PostgreSQL 中强制执行连接顺序#postgresql认证

让我们首先创建一些表&#xff1a; PgSQL plan# SELECT CREATE TABLE x || id || (id int) FROM generate_series(1, 5) AS id;?column? --------------------------CREATE TABLE x1 (id int)CREATE TABLE x2 (id int)CREATE TABLE x3 (id int)CREATE TABLE…

Richtek立锜科技车规级器件选型

芯片按照应用场景&#xff0c;通常可以分为消费级、工业级、车规级和军工级四个等级&#xff0c;其要求依次为军工>车规>工业>消费。 所谓“车规级元器件”--即通过AEC-Q认证 汽车不同于消费级产品&#xff0c;会运行在户外、高温、高寒、潮湿等苛刻的环境&#xff0c…