简单记录使用 ElementPlus 的虚拟化树形控件(el-tree-v2)心得

简介: 这篇文章分享了作者使用ElementPlus的虚拟化树形控件`el-tree-v2`的心得,展示了其基本用法和如何通过自定义模板来增强树节点的交互性。

前言

首先在 ElementPlus 官方文档中有 el-tree-v2 使用说明,其实和 el-tree 基本一样。不同就是 el-tree-v2 使用了虚拟滚动技术,正如官方文档所说,不论数据量多大,虚拟树都能毫无压力地处理。

一、示例代码

(1)src/views/Example/ElTreeV2/index.vue

<template>
  <div class="index">
    <el-tree-v2
      :ref="'treeRef'"
      :data="treeData"
      :height="400"
      :indent="26"
      :props="defaultProps"
      :show-checkbox="true"
      :default-expand-all="true"
      :highlight-current="true"
      :expand-on-click-node="false"
    >
      <template #default="{ node, data }">
        <!-- 目录 -->
        <span v-if="data.children != null" @click="handleNodeClick(node, data)" style="display: inline-flex; align-items: center;">
          <i style="display: inline-flex; align-items: center;">
            <svg style="margin: 2px 7px 2px 5px" viewBox="0 0 16 16" width="16" height="16">
              <path d="M14,6 L14,5 L7.58578644,5 L5.58578644,3 L2,3 L2,6 L14,6 Z M14,7 L2,7 L2,13 L14,13 L14,7 Z M1,2 L6,2 L8,4 L15,4 L15,14 L1,14 L1,2 Z" stroke-width="1" fill="#8a8e99" />
            </svg>
          </i>

          <small :title="node.label">{
  
  { node.label }}</small>
        </span>

        <!-- 文档 -->
        <span v-else style="display: inline-flex; align-items: center;">
          <i style="display: inline-flex; align-items: center;">
            <svg style="margin: 2px 5px 2px 3px" viewBox="0 0 16 16" width="16" height="16">
              <path d="M13,6 L9,6 L9,5 L9,2 L3,2 L3,14 L13,14 L13,6 Z M12.5857864,5 L10,2.41421356 L10,5 L12.5857864,5 Z M2,1 L10,1 L14,5 L14,15 L2,15 L2,1 Z" stroke-width="1" fill="#8a8e99" />
            </svg>
          </i>

          <small :title="node.label">{
  
  { node.label }}</small>
        </span>
      </template>
    </el-tree-v2>

    <div style="margin: 0 100px">
      <el-button size="small" type="primary" @click="handleGetCheckedNodesClick">
        <el-icon :size="14" style="margin-right: 5px"><Check /></el-icon>
        <small>获取选中节点</small>
      </el-button>
    </div>
  </div>
</template>

<script setup>
import {
    
     onMounted, onUnmounted, ref, getCurrentInstance } from 'vue'

// 代理对象
const {
    
     proxy } = getCurrentInstance()

// 树组件实例
const treeRef = ref(null)

// 树形数据
const treeData = ref(
  [
    {
    
    
      id: 1,
      name: '香烟 WiFi 啤酒',
      children: [
        {
    
    
          id: 2,
          name: '香烟',
          children: [
            {
    
    
              id: 3,
              name: '煊赫门'
            },
            {
    
    
              id: 4,
              name: 'ESSE双爆珠'
            }
          ],
        },
        {
    
    
          id: 5,
          name: '后端开发技术',
          children: [
            {
    
    
              id: 51,
              name: 'Java编程技术',
              children: [
                {
    
    
                  id: 511,
                  name: 'SpringBoot框架'
                }
              ]
            },
            {
    
    
              id: 52,
              name: 'Python编程技术',
              children: [
                {
    
    
                  id: 522,
                  name: 'Django框架'
                }
              ]
            }
          ],
        },
        {
    
    
          id: 8,
          name: '数据库',
          children: [
            {
    
    
              id: 9,
              name: '关系型数据库',
              children: [
                {
    
    
                  id: 10,
                  name: 'MySQL'
                },
                {
    
    
                  id: 11,
                  name: 'Oracle'
                }
              ],
            },
            {
    
    
              id: 12,
              name: '非关系型数据库',
              children: [
                {
    
    
                  id: 13,
                  name: 'Redis'
                },
                {
    
    
                  id: 14,
                  name: 'Elasticsearch'
                }
              ],
            }
          ],
        },
        {
    
    
          id: 15,
          name: 'AI人工智能'
        },
      ],
    },
    {
    
    
      id: 16,
      name: '火腿 iPad 泡面'
    },
  ]
)

// 树节点属性映射关系
const defaultProps = {
    
    
  children: 'children',
  label: 'name',
}


/**
 * 点击节点事件句柄方法
 */
const handleNodeClick = (node, data) => {
    
    
  console.log(node, data)
}

/**
 * 获取选中的节点句柄方法
 */
const handleGetCheckedNodesClick = () => {
    
    
  const refs = proxy.$refs
  console.log('refs =>', refs)

  const treeRef = refs.treeRef
  console.log('treeRef =>', treeRef)

  const checkedNodes = treeRef.getCheckedNodes()
  console.log('checkedNodes =>', checkedNodes)
}

onMounted(() => {
    
    
 // ...
})
</script>

<style lang="less" scoped>
  .index {
    
    
    display: flex;
    flex-direction: column;
    position: relative;
    width: 100%;
    height: 100%;
    overflow: hidden;
    background-color: #f3f6f8;

    :deep(.el-tree) {
    
    
      height: 400px;
      margin: 100px 100px 50px 100px;
      border: 1px solid #dcdfe6;

      /* ---- ---- ---- ---- ^(节点对齐)---- ---- ---- ---- */
      .el-tree-node {
    
    

        /* ^ 所有节点 */
        i.el-tree-node__expand-icon {
    
    
          padding: 6px;
          margin-right: 5px;

          &::before {
    
    
            font-family: element-ui-icons;
            font-style: normal;
            content: "\e6d9";
            color: #000000;
            border: 1px solid #606266;
            border-radius: 2px;
          }

          svg {
    
    
            display: none; // 隐藏所有节点的 svg 图标
          }
        }
        /* / 所有节点 */

        /* ^ 已展开的父节点 */
        i.el-tree-node__expand-icon.expanded {
    
    
          transform: rotate(0deg); // 取消旋转
          -webkit-transform: rotate(0deg); // 取消旋转

          &::before {
    
    
            font-family: element-ui-icons;
            font-style: normal;
            content: "\e6d8";
            color: #000000;
            border: 1px solid #606266;
            border-radius: 2px;
          }
        }
        /* / 已展开的父节点 */

        /* ^ 叶子节点 */
        i.el-tree-node__expand-icon.is-leaf {
    
    

          &::before {
    
    
            display: none;
          }
        }
        /* / 叶子节点 */

        /* ^ 复选框 */
        .el-checkbox {
    
    
          margin: 0 5px 0 2px;

          .el-checkbox__inner {
    
    
            width: 14px;
            height: 14px;
            border-radius: 2px;
            border: 1px solid #bbb;
          }

          .el-checkbox__input.is-checked .el-checkbox__inner,
          .el-checkbox__input.is-indeterminate .el-checkbox__inner {
    
    
            border: 1px solid #5e7ce0;
          }
        }
        /* / 复选框 */

        .el-tree-node__content {
    
    
          small {
    
    
            font-size: 13px;
            padding-right: 5px;
            transition: all ease 0.1s;
          }
        }
      }
      /* ---- ---- ---- ---- /(节点对齐)---- ---- ---- ---- */
    }
  }
</style>

二、运行效果

三、参考资料

如何在前端项目中单独引入 ElementUI 图标以及使用_element-icons.woff_帅龍之龍的博客-CSDN博客

目录
相关文章
|
JSON JavaScript 数据格式
Elementui Tree 树形控件删除子节点
Elementui Tree 树形控件删除子节点
108 1
|
4月前
|
数据格式
使用小技巧实现el-table组件的合并行功能,ElementUI和ElementPlus都适用
本文介绍了在ElementUI和ElementPlus中使用`el-table`组件实现合并行功能的技巧,包括多列合并和单列合并的方法,并提供了相应的示例代码和运行效果。
3898 1
使用小技巧实现el-table组件的合并行功能,ElementUI和ElementPlus都适用
|
JSON JavaScript 前端开发
vue如何获取Elementui Tree 树形控件当前选中的节点
vue如何获取Elementui Tree 树形控件当前选中的节点
152 0
|
2月前
|
前端开发 JavaScript 开发者
利用 el-select 和 el-tree 实现树形结构多选框联动功能
本文详细介绍了如何使用ElementUI中的el-select下拉选择器和el-tree树形控件来实现多功能联动选择器,包括多选、删除、搜索、清空选项等功能。通过树形控件展示复杂的层级结构,用户可以通过下拉选择树形节点,实时搜索节点,且支持批量选择和删除功能。文中提供了完整的HTML、JavaScript和CSS代码实现,帮助开发者快速集成此功能。
913 0
利用 el-select 和 el-tree 实现树形结构多选框联动功能
|
5月前
Element UI 树形控件Tree 【详解】el-tree 展开指定节点,判断是否存在指定节点
Element UI 树形控件Tree 【详解】el-tree 展开指定节点,判断是否存在指定节点
946 0
element组件里的tree树形控件的使用?
element组件里的tree树形控件的使用?
|
7月前
|
JavaScript
vue3使用element-plus 树组件(el-tree)数据回显
vue3使用element-plus 树组件(el-tree)数据回显
499 0
|
7月前
element plus 可选择树形组件(el-tree) 怎样一键展开/收起?实现方法详解
element plus 可选择树形组件(el-tree) 怎样一键展开/收起?实现方法详解
906 2
|
前端开发 JavaScript
饿了么UI中el-tree中的树节点选中高亮的两种常用方式(highlight-current属性)
饿了么UI中el-tree中的树节点选中高亮的两种常用方式(highlight-current属性)
503 0
|
JSON JavaScript 前端开发
Elementui Tree 树形控件删除功能
Elementui Tree 树形控件删除功能
124 0
Elementui Tree 树形控件删除功能

热门文章

最新文章