vue3 + ts 使用 el-tree

实现效果:

代码:

TypeScript 复制代码
<template>

  <!-- el-tree 使用 -->

  <div class="my-tree-container">
    <el-scrollbar height="100%">
      <el-tree ref="treeRef" :data="treeData" node-key="id" @node-click="handleNodeClick" :props="treeProps"
               :show-checkbox="true" :check-strictly="true" :default-expanded-keys="defaultExpandedKeys"
               @check-change="handleCheckChange">
        <template #default="{ node, data }">
          <span class="node-icon"><i class="iconfont" :class="data.icon"/></span>
          <span :class="currentNodeKey === data.id ? 'active-node' : ''">{{ node.label }}</span>
        </template>
      </el-tree>
    </el-scrollbar>
  </div>

</template>

<script setup lang="ts">

import {ref} from "vue";

const treeProps = {
  id: 'id',
  label: 'label',
  children: 'children',
  disabled: 'disabled'
}

const treeData: any[] = [
  {
    id: 1,
    label: 'Level one 1',
    icon: 'icon-houqinguanli',
    children: [
      {
        id: 11,
        label: 'Level two 1-1',
        children: [
          {
            id: 111,
            label: 'Level three 1-1-1',
          },
        ],
      },
    ],
  },
  {
    id: 2,
    label: 'Level one 2',
    icon: 'icon-caiwuguanli',
    children: [
      {
        id: 21,
        label: 'Level two 2-1',
        children: [
          {
            id: 211,
            label: 'Level three 2-1-1',
          },
        ],
      },
      {
        id: 22,
        label: 'Level two 2-2',
        children: [
          {
            id: 221,
            label: 'Level three 2-2-1',
          },
        ],
      },
    ],
  },
  {
    id: 3,
    label: 'Level one 3',
    icon: 'icon-nenghaoqingkuang',
    children: [
      {
        id: 31,
        label: 'Level two 3-1',
        children: [
          {
            id: 311,
            label: 'Level three 3-1-1',
          },
        ],
      },
      {
        id: 32,
        label: 'Level two 3-2',
        children: [
          {
            id: 321,
            label: 'Level three 3-2-1',
          },
        ],
      },
    ],
  },
] // 数据

const currentNodeKey = ref<any>(null) // 当前点击的节点的 key【key具体为哪一个属性可通过 node-key 指定】

const defaultExpandedKeys = [1, 2, 3] // 默认展开的节点的 key

const treeRef = ref<any>(null)

const handleNodeClick = (data: any, node: any) => { /* 节点点击事件 */
  currentNodeKey.value = data.id
}

/* 节点勾选事件(当复选框被点击时触发)
* data: 当前点击的节点的数据
* isNodeChecked: 节点本身是否被选中
* hasChildrenChecked: 节点的子树中是否有被选中的节点
*  */
const handleCheckChange = (data: any, node: any, indeterminate: any) => {
  // console.log(data, node, indeterminate)
  const checkedNodes = treeRef.value.getCheckedNodes()
  console.log(checkedNodes, '被选中的节点')
}

// 根据唯一 id 查找树节点
const findNodeById = (id: number, arr: any[]): any => {
  for (let item of arr) {
    if (item.id === id) {
      return item
    }
    if (item.children && item.children.length > 0) {
      const res = findNodeById(id, item.children)
      if (res) {
        return res
      }
    }
  }
}

</script>

<style scoped lang="scss">

.my-tree-container {
  position: absolute;
  top: 100px;
  left: 100px;
  height: 300px; /* tree height needed */
  width: 230px; /* needed */
  background: linear-gradient(180deg, rgba(26, 35, 48, 0.9) 0%, rgba(6, 13, 22, 0.9) 100%);
  opacity: 0.9;
  padding-bottom: 10px;

  .active-node { /* 选中的节点的样式 */
    color: #409EFF;
    background-color: transparent;
  }

  .node-icon {
    margin-right: 10px;
  }

  :deep(.el-tree) {
    background: none;
    color: rgba(206, 207, 209);
    font-size: 16px;
    margin-left: 10px;
    font-weight: lighter;
    font-family: "ResourceHanRoundedCN-Bold", "黑体", Arial, sans-serif;
  }

  :deep(.el-tree-node__content) { // node-height
    height: 35px;
  }

  :deep(.el-tree-node__expand-icon) { /* 隐藏可展开节点前面的箭头 */
    display: none;
  }

  :deep(.el-tree-node__content:hover) {
    background-color: transparent;
    color: #409EFF;
  }

  :deep(.el-tree-node:focus > .el-tree-node__content) { /* 解决点击一个节点后,鼠标移开,修改该节点背景色失效的问题 */
    background: none;
  }

  :deep(.el-icon) {
    font-size: 16px;
  }

  :deep(.el-tree-node) { /* 只有叶子节点显示勾选框 */
    .is-leaf + .el-checkbox {
      display: inline-flex;
    }

    .el-checkbox {
      display: none;
    }
  }

}

</style>
相关推荐
烂蜻蜓39 分钟前
前端已死?什么是前端
开发语言·前端·javascript·vue.js·uni-app
Rowrey2 小时前
react+typescript,初始化与项目配置
javascript·react.js·typescript
谢尔登2 小时前
Vue 和 React 的异同点
前端·vue.js·react.js
祈澈菇凉6 小时前
Webpack的基本功能有哪些
前端·javascript·vue.js
小纯洁w6 小时前
Webpack 的 require.context 和 Vite 的 import.meta.glob 的详细介绍和使用
前端·webpack·node.js
想睡好7 小时前
css文本属性
前端·css
qianmoQ7 小时前
第三章:组件开发实战 - 第五节 - Tailwind CSS 响应式导航栏实现
前端·css
zhoupenghui1687 小时前
golang时间相关函数总结
服务器·前端·golang·time
White graces7 小时前
正则表达式效验邮箱格式, 手机号格式, 密码长度
前端·spring boot·spring·正则表达式·java-ee·maven·intellij-idea
庸俗今天不摸鱼7 小时前
Canvas进阶-4、边界检测(流光,鼠标拖尾)
开发语言·前端·javascript·计算机外设