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
    }
 }
相关推荐
昨天;明天。今天。几秒前
案例-任务清单
前端·javascript·css
Front思28 分钟前
vue使用高德地图
javascript·vue.js·ecmascript
zqx_71 小时前
随记 前端框架React的初步认识
前端·react.js·前端框架
惜.己1 小时前
javaScript基础(8个案例+代码+效果图)
开发语言·前端·javascript·vscode·css3·html5
什么鬼昵称2 小时前
Pikachu-csrf-CSRF(get)
前端·csrf
长天一色2 小时前
【ECMAScript 从入门到进阶教程】第三部分:高级主题(高级函数与范式,元编程,正则表达式,性能优化)
服务器·开发语言·前端·javascript·性能优化·ecmascript
NiNg_1_2342 小时前
npm、yarn、pnpm之间的区别
前端·npm·node.js
秋殇与星河2 小时前
CSS总结
前端·css
BigYe程普3 小时前
我开发了一个出海全栈SaaS工具,还写了一套全栈开发教程
开发语言·前端·chrome·chatgpt·reactjs·个人开发
余生H3 小时前
前端的全栈混合之路Meteor篇:关于前后端分离及与各框架的对比
前端·javascript·node.js·全栈