单选el-tree组件,只可选最后一个层级

<template>

  <div>

    <el-tree

      :data="treeData"

      :props="defaultProps"

      node-key="id"

      :default-checked-keys="[selectedNodeId]"

      :default-expanded-keys="[expandedNodeId]"

      :highlight-current="true"

      :expand-on-click-node="true"

      :render-content="renderContent"

      @node-click="handleNodeClick"

      :check-on-click-node="true"

    ></el-tree>

  </div>

</template>

<script>

export default {

  data() {

    return {

      treeData: [

        {

          id: 1,

          label: '节点1',

          children: [

            {

              id: 2,

              label: '子节点1-1',

              children: [

                {

                  id: 3,

                  label: '子节点1-1-1'

                },

                {

                  id: 4,

                  label: '子节点1-1-2'

                }

              ]

            },

            {

              id: 5,

              label: '子节点1-2'

            }

          ]

        },

        {

          id: 6,

          label: '节点2'

        }

      ],

      selectedNodeId: '',

      expandedNodeId: '',

      parentMap: {} // 父节点映射关系

    };

  },

  computed: {

    defaultProps() {

      return {

        children: 'children',

        label: 'label'

      };

    }

  },

  created() {

    this.buildParentMap(this.treeData);

  },

  methods: {

    handleNodeClick(node) {

      if (!node.children || node.children.length === 0) {

        // 只选中最后一个层级节点

        this.selectedNodeId = node.id;

        // 获取当前选中子节点的所有父节点

        const parentNodes = this.getParentNodes(node);

        console.log(parentNodes); // 输出父节点数组

      } else {

        // 清空选中

        this.selectedNodeId = '';

      }

      // 展开点击的节点

      // this.expandedNodeId = node.id;

    },

    renderContent(h, { node, data }) {

      const isSelected = node.id === this.selectedNodeId;

      return h(

        'span',

        {

          class: {

            'tree-node': true,

            'tree-node-selected': isSelected

          },

          style: isSelected ? { color: 'white', background: 'blue', width: '100%' } : {}

        },

        data.label

      );

    },

    buildParentMap(nodes, parent = null) {

      for (const node of nodes) {

        this.parentMap[node.id] = parent;

        if (node.children && node.children.length > 0) {

          this.buildParentMap(node.children, node);

        }

      }

    },

    getParentNodes(node, parents = []) {

      if (!node || !this.parentMap[node.id]) {

        return parents;

      }

      const parent = this.parentMap[node.id];

      parents.unshift(parent);

      return this.getParentNodes(parent, parents);

    }

  }

};

</script>

<style scoped>

.tree-node-selected {

  color: white !important;

  background-color: blue !important;

}

</style>

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值