elementui树形组件自定义高亮颜色

1、需求描述:点击按钮切换树形的章节,同时高亮

2、代码实现

1)style样式添加

javascript 复制代码
<style>
.el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {
  background-color: #81d3f8 !important;  //高亮颜色
  color:#fff;  // 字体颜色
}
</style>```

2)组件添加

```javascript
  <el-tree
          ref="treeRef"   
          :data="treeData"
          node-key="key"   //node-key必须要绑定唯一id,我这里的id是key所以使用key
          :highlight-current="true"  //设置高亮
          :default-expanded-keys="['0-1-0']"  // 默认展开
          @node-click="handleNodeClick"  // 节点点击事件
        ></el-tree> 

3)事件

javascript 复制代码
mounted(){
	this.$refs.treeRef.setCurrentKey(this.treeData[0].key);  //threeData是树形结构的数据
	//toNextClick是"下一步"按钮触发的事件
	this.$bus.$on("toNextClick", () => {
	this.getkey(this.treeData, this.componentsKey);  //this.componentsKey是当前的key
	//找到点击下一步之后的key值
      this.$refs.treeRef.setCurrentKey(this.keys); //添加高亮
    });
}

注:其他函数代码 (仅供自己参考,可忽略),大概的思路是通过当前的key判断,如果当前key是一级菜单,判断当前菜单下是否有二级菜单,如果有二级菜单直接高亮第一个二级菜单,如果没有,则找到下一个同级的一级菜单,判断是否有二级菜单,有则高亮。如果当前key是二级菜单,则判断上一级的菜单的二级菜单长度是否大于当前二级菜单的index,如果大于,key就是下一个index+1的位置,如果当前二级菜单的位置是一级菜单的最后一个元素,去找一级菜单的同级下一个一级菜单。

javascript 复制代码
// 寻找下一个key的位置
 getkey(obj, okey) {
      //找到okey在的位置
      let treeDataLen = this.treeData.length;
      let rootKey;
      let parentKey;
      let parentArrLen;
      let parentArr;
      let rootArr = this.treeData;
      if (!okey) {
        okey = "0-0";
      }
      let num = okey.match(/-/gim).length;  // key的格式是0-0(一级菜单) 0-0-1(二级) 0-0-0-1(三级菜单)
      if (num == 2) {
        //二级菜单
        rootKey = okey.slice(0, 3); 
        parentKey = rootKey;
      } else if (num == 3) {
        rootKey = okey.slice(0, 5);
        parentKey = okey.slice(0, 3);
      } else {
        //直接去下一个
        rootKey = okey;
        parentKey = rootKey;
      }
      let rootindex = rootArr.map(item => item.key).indexOf(rootKey);
      //找到okey的上一级的children长度
      let parentObj = this.treeData.find(item => {
        return item.key == parentKey;
      });
      if (parentObj.key == "0-0") {
        if (rootindex + 1 < treeDataLen && rootArr[rootindex + 1].children) {
          this.str = rootArr[rootindex + 1].children[0].key;
        }
        return;
      } else {
        parentArr = parentObj.children ? parentObj.children : [];
      }
      //找到okey的下标
      parentArrLen = parentArr.length;
      let keyindex = parentArr.map(item => item.key).indexOf(okey);
      //根元素的下标
      if (keyindex + 1 > parentArrLen - 1 && rootindex + 1 >= treeDataLen) {
        this.str = okey;
      } else if (
        keyindex + 1 > parentArrLen - 1 &&
        rootindex + 1 < treeDataLen
      ) {
        //子元素超出但是根还有
        if (rootArr[rootindex + 1].children) {
          this.str = rootArr[rootindex + 1].children[0].key;
        }
      } else {
        this.str = parentArr[keyindex + 1].key;
      }
    }
  }

tree格式 (以上getkey函数可以优化,通过层级index和parentIdx来判断,由于本人较懒,暂时先这样吧)

javascript 复制代码
export const TreeData =
  [
    {
      index: 1,
      label: "使用说明",
      key: "0-0",   //如果这里定义的是id:"0-0",那么node-key="id"
      parentIdx: 0,
      children: []
    },
    {
      index: 2,
      parentIdx: 0,
      label: "第一部分 合同协议书",
      key: "0-1",  //一级菜单
      children: [{
        index: 1,
        parentIdx: 2,
        label: "1.工程简况",
        key: "0-1-0",  // 二级菜单
      },
      {
        index: 2,
        parentIdx: 2,
        label: "2.合同的文件组成及解释顺序",
        key: "0-1-1",
      }
      ]}
     }
     ...
]
      
  1. 切换右侧的内容使用动态组件
javascript 复制代码
<component :is="isComponents" :ref="isRef" :key="isRef"></component>

computed: {
    isComponents() {
    //根据key来匹配组件 例如组件名字chapter0_0 (key:0-0) ,chapter0_0_1 (0-0-1)
      let key = this.componentsKey
        ? this.componentsKey.replace(/-/g, "_")
        : "0_0";
      return `chapter${key}`;  //组件的名字 chapter0_0
    }
 }
相关推荐
橙序员小站34 分钟前
Agent Skill 是什么?一文讲透 Agent Skill 的设计与实现
前端·后端
炫饭第一名3 小时前
速通Canvas指北🦮——基础入门篇
前端·javascript·程序员
王晓枫3 小时前
flutter接入三方库运行报错:Error running pod install
前端·flutter
符方昊3 小时前
React 19 对比 React 16 新特性解析
前端·react.js
ssshooter3 小时前
又被 Safari 差异坑了:textContent 拿到的值居然没换行?
前端
曲折4 小时前
Cesium-气象要素PNG色斑图叠加
前端·cesium
Forever7_4 小时前
Electron 淘汰!新的桌面端框架 更强大、更轻量化
前端·vue.js
不会敲代码14 小时前
前端组件化样式隔离实战:React CSS Modules、styled-components 与 Vue scoped 对比
css·vue.js·react.js
Angelial4 小时前
Vue3 嵌套路由 KeepAlive:动态缓存与反向配置方案
前端·vue.js
jiayu4 小时前
Angular学习笔记24:Angular 响应式表单 FormArray 与 FormGroup 相互嵌套
前端