需求:

点击树结构右侧区域的按钮,树结构高亮选中的节点,并展开父节点,定位到高亮的节点。

感觉el-tree应该直接可以实现这种操作,但是setcurrentKey方法只实现了高亮节点,没有展开父节点,也没有定位到这个节点。不知道是哪个属性没有设置,还是设置了哪个属性影响了。一个个排查后,始终达不到想要的效果。那好吧,只能手动实现这个功能了。

解决方案:
1、高亮节点后,展开父节点。
2、获取高亮节点的offsetTop,把滚动条的位置定位到这个元素附近。

关键部分代码:

html结构部分:这个地方把el-tree单独封装了组件
父组件中使用:

<div class="tree-box">
   <custom-tree ref="customTree"
   :tree-data="getOntoLogyNodes"
   :tree-expand-all="treeExpandAll"
   :tree-node-key="treeNodeKey"
   @addItem="addTreeItem"
   @deleteItem="deleteTreeItem"
   @editItem="editTreeItem"
   @updateAdd="handleAddUpdate" />
</div>

tree-box高度固定,el-tree作为滚动区域,所以tree-box样式设置如下:

.tree-box {
  width: 100%;
  height: calc(100vh - 196px);
  overflow-y: auto;
}

另外,我们的这个功能点中树结构每个节点的label是唯一的,不会重复,所以node-key设置为label,等同于id。

treeNodeKey: "label",

custom-tree组件template内容:

<template>
  <el-tree
    id="my-tree"
    ref="tree"
    class="tree-view structure-tree"
    :data="treeData"
    highlight-current
    :default-expand-all="treeExpandAll"
    :props="defaultProps"
    :node-key="treeNodeKey"
    :filter-node-method="filterNode"
    :auto-expand-parent="true"
    :accordion="true"
    @node-click="handleNodeClick"
    @node-expand="handleNodeExpand"
  >
    <span slot-scope="{ node, data }" class="custom-tree-node">
      <span class="tooltip">
        <span class="add-f-s-14">{{ data.label }}</span>
      </span>
      <div v-if="node.isCurrent == true" class="operation-view">
        <i
          class="small-operation-btn el-icon-plus"
          @click.stop="handleAdd(data)"
        />
        <i
          class="small-operation-btn el-icon-edit "
          @click.stop="handleEdit(data)"
        />
        <i
          class="small-operation-btn el-icon-delete"
          @click.stop="handleDelete(data)"
        />
      </div>
    </span>
  </el-tree>
</template>

父组件中调用实现

handleClick(name) {
	const node = this.$refs.customTree.$refs.tree.getNode(name);
    this.$nextTick(() => {
      this.$refs.customTree.$refs.tree.setCurrentKey(node);
      if (node && node.parent) {
      	// 展开高亮的节点的父节点
        this.expandParents(node.parent);
        // 此处定时1秒是因为我们没有异步加载el-tree,所以为了能够后续获取到dom,不得不设置定时器。
        setTimeout(() => {
          const dom = document.getElementsByClassName("tree-box")[0];
          const dom1 = document.getElementsByClassName("el-tree-node is-current is-focusable")[0];
          // 这里的104是一个大概位置
          dom.scrollTop = dom1.offsetTop - 104;
        }, 1000);
      }
    });
  });

},
expandParents(node) {
  node.expanded = true;
  if (node.parent) {
    this.expandParents(node.parent);
  }
}

以上就是关键代码部分,网上找了好多解决方案,但是一直不是很理想,最后想到了这个简单粗暴的方法。不知道有没有其他好的方法,欢迎大佬们指导交流!

参考文章:
https://blog.csdn.net/weixin_41832017/article/details/110209949
https://blog.csdn.net/weixin_41953046/article/details/119867971

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐