首页 > 其他分享 >Elementui树形列表控件tree-box

Elementui树形列表控件tree-box

时间:2024-10-14 18:48:43浏览次数:9  
标签:box 控件 node el type Elementui tree data 节点

效果图(在vue2项目开发中,实现了树形列表查看及筛选等交互,用清晰的层级结构展示信息)

 

开发步骤及代码,来喽!!无脑copy

1、组件基本框架

  DeviceTree 是基于 Vue.js 和 Element UI 构建的树形组件。通过 el-tree 组件显示树状结构。组件的外部可通过传递 props 来控制是否显示复选框、设备过滤等特性。

核心字段和方法:
  • treeData: 保存树的节点数据。
  • currentKey: 记录当前点击的节点。
  • defaultProps: 定义树节点的子元素 (children),用于指定树的层次结构。
  • handleNodeClick: 响应节点点击事件,将点击的节点信息传递给父组件。
  • handleNodeExpand: 处理节点展开事件,防止同级节点全部展开,优化用户体验。

2、树形列表数据获取 

        组件在 created 钩子中调用 getTreeData 方法,从服务器获取树形结构数据,并将其格式化为适合 el-tree 的数据格式。(可以使用axios、ajaxs,我使用的是$http.post)

const res = this.$http.post("/后端接口", {userID: userid},{headers:headers});

      res.then((ret) => {

        var data = ret.data.data;

        this.treeData = data.map(line => {

              return {

                NodeName: line.lineName, 

                id: line.lineID,

                type: line.type,

                icon: 'el-icon-location',

                Children: line.areaList.map(area => ({

                  NodeName: area.areaName,  

                  id: area.areaID,

                  type: area.type,

                  icon: 'el-icon-location-outline'

                }))

              };

            });      

      });

3、组件交互功能

3.1过滤功能

  • 使用 el-tree 组件的 filter-node-method 实现对树节点的过滤。filterText 绑定到输入框的内容,当输入内容发生变化时,会触发树节点的过滤。

3.2 节点选择

  • getCheckedNodes: 获取用户选择的复选框节点,用于在用户勾选复选框后,获取所选中的节点信息。
  • clearChecked: 清空所有勾选的节点。

3.3树节点的渲染

        通过 eventRender 自定义树节点的渲染内容,显示节点的图标和名称,并根据需要是否显示复选框。

4、外部接口用于供父组件调用或监听

  • selectEquipTree: 当用户点击某个节点时,触发该事件,向父组件传递所选节点的信息。
  • updateData: 更新树的数据,供外部组件调用,重新渲染树结构。

5、代码来喽

<template>

  <div id="device-tree">

    <div class="title">线路列表<span ref="spanRef"></span></div>

    <el-input placeholder="输入关键字进行过滤" v-model="filterText" size="small">

    </el-input>

    <div class="tree-box">

      <el-tree

        :data="treeData"  

        :props="defaultProps"

        ref="deviceTree"

        node-key="id"

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

        :current-node-key="currentKey"

        :filter-node-method="filterNode"

        :render-content="eventRender"

        @node-click="handleNodeClick"

        @node-expand="handleNodeExpand">

        <span class="span-ellipsis" slot-scope="{ data }">

          <i :class="data.icon" style="color: darkseagreen"></i>

          <span class="span-tip" :title="data.linename">

            {{ data.linename }}

          </span>

        </span>

        <span class="span-ellipsis" slot-scope="{ data }">

          <i :class="data.icon" style="color: darkseagreen"></i>

          <span class="span-tip" :title="data.AreaName">

            {{ data.AreaName }}

          </span>

        </span>

      </el-tree>

    </div>

  </div>

</template>

<script>

export default {

  name: "DeviceTree",

  data() {

    return {

      filterText: "",

      treeData: [],

      currentKey: 1,

      type: '',

      defaultProps: {

        children: "Children",

        label: "NodeName",

        isLeaf: "leaf",

      },

    };

  },

  props: {

    parentNoclick: {

      default: true,

      type: Boolean,

    },

    isShowEquip: {

      default: true,

      type: Boolean,

    },

    equipFilter: {

      default: "All",

      type: String,

    },

    isShowCheck: {

      default: false,

      type: Boolean,

    },

    isShowRedCamera: {

      default: false,

      type: Boolean,

    },

    isShowTempreature: {

      default: false,

      type: Boolean,

    },

    props: {

      equipData: {

        type: Array,

        default: () => [],

      },

    },

  },

  watch: {

    filterText: function (val) {

      this.$refs.tree.filter(val);

    },

  },

  created() {

    this.getTreeData();

  },

  methods: {

    filterNode(value, data) {

      if (!value) return true;

      return data.NodeName.indexOf(value) !== -1;

    },

    handleNodeClick(data, node) {

      this.currentKey = data.id;

      this.type = data.type;

      this.$emit("selectEquipTree", data);

    },

    handleNodeExpand(data, node) {

      if (node.parent.data.NodeType == 1) {

        var nodes = node.parent.childNodes;

        nodes.forEach((n) => {

          if (n.id != node.id) n.expanded = false;

        });

        this.$refs.tree.setCheckedKeys([], true);

      }

    },

    updateData(newData) {

      this.equipData = newData;  // 更新树形组件的数据

      this.refreshTree();  // 假设有一个方法用于刷新树

    },

    refreshTree() {

      this.getTreeData();

    },

    // 获取树形结构

    getTreeData() {

      const token = localStorage.getItem('token')

      const userid = localStorage.getItem('userid');  

      const headers = {

          'Authorization': `Bearer ${token}`

      };

      const res = this.$http.post("/api/Area/GetAreaTreeList", {userID: userid},{headers:headers});

      res.then((ret) => {

        var data = ret.data.data;

        this.treeData = data.map(line => {

              return {

                NodeName: line.lineName,

                id: line.lineID,

                type: line.type,

                icon: 'el-icon-location',

                Children: line.areaList.map(area => ({

                  NodeName: area.areaName,  

                  id: area.areaID,

                  type: area.type,

                  icon: 'el-icon-location-outline'

                }))

              };

            });

       

      });

    },

    eventRender(h, { node, data, store }) {

      if (this.isShowCheck) {

        node.isLeaf = false;

        if (data.NodeType == 1) {

          node.isLeaf = true;

        }

      }

      return (

        <span class="span-ellipsis">

          <i class={data.icon} style="color: darkseagreen"></i>

          <span class="span-tip" title={data.NodeName}>

            {data.NodeName}

          </span>

        </span>

        // {}

      );

    },

    getCheckedNodes() {

      var keys = this.$refs.tree.getCheckedKeys(true);

      let checkedNodes = [];

      keys.forEach((key) => {

        var node = this.$refs.tree.getNode(key);

        checkedNodes.push(node);

      });

      return checkedNodes;

    },

    clearChecked() {

      this.$refs.tree.setCheckedKeys([], true);

    },

  },

};

</script>

<style lang="less">

#device-tree {

  width: 260px;

  padding-left: 10px;

  height: 100%;

  .title {

    color: #1bc3de;

    font-size: 18px;

    border-left: 3px solid #489fff;

    margin-bottom: 10px;

    padding-left: 10px;

    text-align: left;

    span {

      color: #fff;

    }

  }

  .el-input {

    margin-bottom: 10px;

    input {

      width: 240px !important;

    }

  }

  .tree-box {

    height: calc(100% - 34px - 42px);

    overflow: hidden;

    overflow-y: visible;

    .el-input {

      margin-bottom: 10px;

      input {

        width: 240px !important;

      }

    }

  }

  .el-tree {

    background: transparent;

    color: #c0cbe0;

    margin-right: 10px;

    /deep/.is-current {

      background: #13386c;

      > .el-tree-node__content {

        background: #13386c;

      }

    }

    .span-ellipsis {

      display: block;

      overflow: hidden;

      white-space: nowrap;

      text-overflow: ellipsis;

      font-size: 16px;

      font-weight: bold;

    }

    .el-tree-node__content:hover {

      background-color: rgba(20, 57, 109, 0.3);

    }

    .el-tree-node {

      .is-current {

        background-color: #13386c;

      }

    }

    .el-tree-node {

      .is-leaf + .el-checkbox .el-checkbox__inner {

        display: inline-block;

        border: 1px solid #489fff;

        background-color: #3242654d;

      }

      .el-checkbox .el-checkbox__inner {

        display: none;

        border: 1px solid #489fff;

        background-color: #3242654d;

      }

    }

    .el-tree-node:focus > .el-tree-node__content {

      background-color: #13386c;

    }

    .el-tree-node__label {

      font-size: 16px;

      font-weight: bold;

    }

    .el-checkbox__input.is-checked .el-checkbox__inner {

      background-color: #409eff;

    }

  }

}

</style>

6、总结

        这个组件通过 el-tree 组件展示树形结构设备列表,支持节点点击、展开、过滤等功能,并通过多种方法和事件与父组件进行交互。数据通过后端接口获取并动态更新树结构,具有良好的用户体验和扩展性。

标签:box,控件,node,el,type,Elementui,tree,data,节点
From: https://blog.csdn.net/weixin_45148467/article/details/142792144

相关文章

  • 还在使用昂贵的虚拟机?来试试 Devbox,便宜 6 倍!
    这篇小短文来介绍一下用虚拟机的场景是怎么被Devbox全方位碾压的。Devbox唯一弱点是公网出口的地方不分配独立的IP地址,但是这对我们绝大多数场景是没有影响的,通过域名和端口访问我们的后台服务或者网站即可。关于Devbox的详细介绍请参考上篇文章。使用教程SealosDev......
  • Qt/C++开源控件 圆形进度条
    Qt/C++开源控件圆形进度条简约风格:设计简洁,没有多余的元素,清晰地显示了当前进度。颜色对比:使用了亮色的蓝色来标示进度,与深色背景形成鲜明对比,使得进度指示一目了然。清晰的刻度:刻度线清晰,尽管没有标注所有数字,但通过较长的刻度线在50和100的位置,用户可以很容易地估计......
  • Android15车载音频之Virtualbox中QACT实时调试(八十八)
    简介:CSDN博客专家、《Android系统多媒体进阶实战》一书作者新书发布:《Android系统多媒体进阶实战》......
  • Java项目:高校心理辅导系统(java+SpringBoot+Vue+elementui+mysql)
    源码获取:俺的博客首页"资源"里下载! 项目介绍基于Springboot+vue高校心理教育辅导设计与实现本系统分为前后台,包含管理员、学生、教师三种角色,前台为学生、教师登录,后台为管理员、学生、教师分别登录。前台主要功能:首页、心理健康学习、试卷列表、公告通知、留言反馈、......
  • Java项目:母婴商城系统(java+SpringBoot+Mybaits+Vue+elementui+mysql)
    源码获取:俺的博客首页"资源"里下载! 项目介绍基于Springboot+vue的母婴商城系统本系统分为前后台,包含管理员、用户两种角色,前台为普通用户登录,后台为管理员、用户分别登录。前台主要功能:首页、商品信息、商品资讯、用户登录、用户注册、用户个人中心、我的订单、我的地......
  • Java项目:房产销售系统(java+SpringBoot+Mybaits+Vue+elementui+mysql)
    源码获取:俺的博客首页"资源"里下载! 项目介绍基于Springboot+vue的房产销售系统本系统分为前后台,包含管理员、用户、销售经理三种角色,前台为普通用户登录,后台为管理员、用户、销售经理分别登录。前台主要功能:首页、房源信息、用户登录、用户注册、用户个人中心、我的收......
  • Winform MessageBox消息弹窗如何实现自动关闭
     使用了WindowsAPI函数FindWindow和SendMessage来查找消息框的窗口句柄并发送关闭消息实现方法publicclassAutoClosingMessageBox{System.Threading.Timer_timeoutTimer;string_caption;AutoClosingMessageBox(stringtext,stringcap......
  • Virtualbox 《虚拟机空间整理》
    不会删除空间virtualbox中新建的虚拟机随着时间推移,占用物理存储越来越大,并且在动态分配硬盘的过程中,不会因为删除虚拟机上的文件,vdi的大小会随之变化1.虚拟机是Linux环境压缩空间#虚拟机环境下执行(root)ddif=/dev/zeroof=/freerm-rf/free2.虚拟机是window环境h......
  • WPF 性能优化-列表控件性能
    下面记录几种针对大数据列表控件性能的增强特性,WPF所有继承自ItemsControl的控件(列表控件)都支持这些增强特性,包括ListBox、ComboBox、ListView、TreeView以及DataGrid。一、虚拟化WPF列表控件所提供的最重要的功能就是UI虚拟化。UI虚拟化是列表只为可见区域中能显示的项创建容器......
  • 界面控件DevExpress中文教程 - 如何拓展具有AI功能的文本编辑器(二)
    NLP是人工智能的一个分支,它允许计算机与人类语言进行交互,这包括以有意义/有用的方式理解、解释、生成和回应文本(和语音)的能力。基于NLP的功能允许更好的数据分析、个性化体验、高效的沟通,并导致更明智的决策和提高效率。例如:机器翻译文本摘要文本生成文本分类以及更多…......