el-tree 解决setcurrentKey 节点定位问题

需求:

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

感觉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

el-tree-select节点点击的问题可能是由于冲突导致的。其中可能存在两种冲突情况。第一种是点击事件冲突,可能是因为触发了两次点击,一个是当前节点的handleNodeClick,另一个是onclick,导致了背景色丢失。解决这个问题可以检查代码中是否存在重复的点击事件,并进行相应的处理。第二种是驱动tree高亮的冲突,可能是因为在需要点击按钮让tree高亮显示时,值可能为null导致样式节点丢失。解决这个问题可以使用条件判断来避免空值导致的问题。例如使用`newVal && this.$refs.tree.setCurrentKey(newVal)`来进行空值判断。\[3\] #### 引用[.reference_title] - *1* [el-select 多选模式下嵌套el-tree 删除tag时能去掉el-tree对应节点的勾](https://blog.csdn.net/dabaoai123123/article/details/126075532)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [el-table+el-tree+el-select动态选择对应值](https://blog.csdn.net/weixin_43388691/article/details/127385435)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [el-tree失去焦点丢失节点背景色](https://blog.csdn.net/Y4258/article/details/126655778)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值