el-tree使用笔记---定位到指定节点,查找其所有父级节点,并展开,vue组件动态引入


<template>
  <div class="top">
    <el-tree
        ref="tree"
        :data="data"
        :props="defaultProps"
        accordion
        :expand-on-click-node="true"
        auto-expand-parent
        highlight-current
        node-key="code"
        :default-expanded-keys="defaultShowNodes"
        @node-click="handleNodeClick"
      >
        
        <span slot-scope="{data}" class="custom-tree-node">
          <span class="treeSpan">{{ data.name }}span>
          <span>{{ data.contentTotal }}篇span>
        span>
      el-tree>    
    div>
template>

<script>
export default {
  components: {
    ShareDialog
  },
  data() {
    return {
      data: [{
        id: '1',
        name: '测试节点1',
        code: '001',
        subs: [{
          id: '11',
          name: '测试节点11',
          code: '001001',
          subs: [{
            id: '111',
            name: '测试节点111',
            code: '001001001'
          }, {
            id: '112',
            name: '测试节点112',
            code: '001001002'
          }]
        }, {
          id: '12',
          name: '测试节点12',
          code: '001002'
        }]
      }, {
        id: '2',
        name: '测试节点2',
        code: '002'
      }],
      defaultProps: {
        children: 'subs',
        label: 'name'
      },
      nodeParentAll: [],
      props: {
        children: 'children',
        label: 'label'
      }
    }
  },
  computed: {
    // 通过计算属性动态引入组件
    loadPage() {
      return () => import('@/components/page.vue')
    },
    // 通过计算属性动态引入组件
    loadCollect() {
      return () => import('@/components/collect.vue')
    }
  },
  methods: {
    // 通过节点的key(这里使用的是数据中的code属性,node-key="code")获取并高亮显示指定节点,并展开其所有父级节点
    getAndExpandAll(nodeKey) {
      if (nodeKey) {
        this.$nextTick(() => { // 等待树组件渲染完成再执行相关操作
          // 获取节点
          const node = this.$refs.tree.getNode(nodeKey)
          if (node) {
            // 获取其所有父级节点
            this.getParentAll(node)
            if (this.nodeParentAll.length > 0) {
              // 将获取到的所有父级节点进行展开
              for (var i = 0, n = this.nodeParentAll.length; i < n; i++) {
                this.$refs.tree.store.nodesMap[this.nodeParentAll[i].data.code].expanded = true
              }
            }

            // 将节点高亮显示
            this.$refs.tree.setCurrentKey(nodeKey)
          }
        })
      }
    },
    // 获取所有父级节点
    getParentAll(node) {
      if (node) {
        this.nodeParentAll = []
        // 节点的第一个父级
        var parentNode = node.parent
        // level为节点的层级 level=1 为顶级节点
        for (var j = 0, lv = node.level; j < lv; j++) {
          if (parentNode.level > 0) {
            // 将所有父级节点放入集合中
            this.nodeParentAll.push(parentNode)
          }
          // 继续获取父级节点的父级节点
          parentNode = parentNode.parent
        }

        if (this.nodeParentAll.length > 1) {
          // 如果集合长度>1 则将数组进行倒叙.reverse() 其是就是将所有节点按照 从 顶级节点 依次往下排
          this.nodeParentAll.reverse()
        }
      }
    },
  }
}

script>

每天进步一点点,点滴记录,积少成多。

以此做个记录,

如有不足之处还望多多留言指教!