antd——使用a-tree组件实现 检索+自动展开+自定义增删改查功能——技能提升

news2025/8/6 6:21:43

之前写后台管理系统时,遇到一个下面的需求,下面是最终完成的效果图。
在这里插入图片描述
实现的功能有:

1. 下拉 选择不同的类型——就是一个普通的select组件,下面并不做介绍

2. 通过关键字可以进行tree树形结构的筛选,然后将筛选后的内容自动展开

在这里插入图片描述

3. tree组件中,每一条数据,鼠标移入后展示 增/删/改 图标,点击有对应的功能

在这里插入图片描述

下面直接上代码

一:tree组件的使用

<a-tree
 :treeData="treeData"
  ref="treeNode"
  v-if="treeData"
  :showIcon="false"
  class="tree-list"
  :defaultExpandAll="true"
  :expandedKeys.sync="defaultExpandedKeys"
  tree-default-expand-all
  :replaceFields="replaceFields"
>
</a-tree>
1. treeData :tree组件的数据源
2. ref:相当于id,可以通过此参数获取到dom结构
3. v-if:只有当有数据源的时候才显示组件
4. showIcon:设置成false,就不会展示默认的tree组件图标了,此时可以通过自定义图标的形式来展示自定义的效果了
5. class="tree-list":因为我进行了自定义的样式处理,此时添加一个类名用于与其他tree组件区分
6. defaultExpandAll:设置成true,默认展开所有节点,也可以通过下面的expandedKeys来指定展开的节点
7. expandedKeys:异步指定要展开的节点,用于筛选后所有符合条件的数据的展开
8. replaceFields:当数据源给定的数据结构与期望的结构不符时,可以通过此参数进行设置。
我这边的配置如下: 
replaceFields: {
    children: 'children',
    title: 'title',
    key: 'key',
    value: 'subTitle',
  },

二:使用插槽实现自定义组件结构

<a-icon slot="switcherIcon" type="caret-down" />
<template slot="custom" slot-scope="item">
  <div @mouseenter="mouseenter(item)" style="position: relative">
    <span
      style="
        height: 30px;
        width: 70%;
        display: flex;
        align-items: center;
      "
    >
      <a-icon
        type="home"
        theme="filled"
        style="
          height: 30px;
          line-height: 30px;
          padding-right: 5px;
        "
        v-if="item.slots.Code"
      />
      <a-icon
        type="user"
        style="
          height: 30px;
          line-height: 30px;
          padding-right: 5px;
        "
        v-if="item.slots.UserId"
      />
      <span
        style="
          height: 30px;
          display: inline-block;
          max-width: 80%;
          overflow: hidden;
          text-overflow: ellipsis;
          padding-right: 5px;
        "
        >{{ item.title }}</span
      >
      <span
        style="
          height: 30px;
          display: inline-block;
          max-width: 80%;
          overflow: hidden;
          color: #f90;
          font-weight: bold;
          height: 30px;
        "
      >
        <span v-if="item.slots.IsSecondary"
          >[]</span
        >
        <span v-if="item.slots.IsLeader"
          >[]</span
        >
      </span>
    </span>
    <a-space
      @click.stop
      v-if="currentId == item.key"
      style="position: absolute; right: 25px; top: 0"
    >
      <a-icon
        type="plus-square"
        style="color: green"
        @click.stop="handleAdd(item)"
        v-if="item.key.indexOf('U') == -1"
      />
      <a-icon type="edit" @click.stop="handleEdit(item)" />
      <a-icon
        type="delete"
        @click.stop="handleDel(item)"
        style="color: red"
        v-if="item.key.indexOf('U') == -1"
      />
    </a-space>
  </div>
</template>

三:数据结构需要转化成 scopedSlots自定义的插槽

在这里插入图片描述
原有的数据结构:
在这里插入图片描述
将上面的数据结构通过下面的方法进行转化。

filterTreeData(arr) {
  arr.forEach((item) => {
    item['scopedSlots'] = { title: 'custom' };
    item.Id = item?.slots?.Id;
    item.Name = item?.slots?.Name;
    item.selectable = true;
    item.subTitle = item.title + '(' + item.key + ')';
    this.$forceUpdate();
    if (item.children) {
      this.filterTreeData(item.children);
    }
  });
},

最终转化后的数据结构如下:
在这里插入图片描述
此时就可以通过上面前两步的设置进行正常渲染了。

四:监听关键字的检索

4.1 节流检索关键字

//先定义一个定时器,然后在指定时间内,默认是200毫秒,如果发生变化,则清理定时器,重新定时
debounce(callback, delay = 200) {
  clearTimeout(this.timeout);
  this.timeout = setTimeout(() => {
    callback();
  }, delay);
},

4.2 input组件作为输入框

 <a-input
  style="margin-top: 8px; margin-bottom: 8px"
  v-model="searchValue"
  placeholder="请输入关键字"
  @change="onChange($event.target.value)"
  allowClear
/>

4.3 监听input的change事件

onChange(value) {
  this.defaultExpandedKeys = [];
  if (value) {
    this.debounce(() => {
      //此时需要根据value关键字,从treeData数据源中查找对应的数据,将key存放到defaultExpandedKeys数组中,就可以实现自动展开功能了。
    });
  } else {
    this.treeData = JSON.parse(JSON.stringify(this.originTreeData));
  }
},

4.4 通过XEUtiles.searchTree实现 多层对象数组的检索

this.treeData = XEUtiles.searchTree(
  this.treeData,
  (item) => {
    if (item.title.toLowerCase().indexOf(value.toLowerCase()) > -1) {
      if (item.parent) {
        this.defaultExpandedKeys.push('S-' + item.parent);
      }
      this.defaultExpandedKeys.push(item.key);
      return true;
    } else {
      return false;
    }
  },
  { children: 'children' }
);

4.5 npm install xe-utils --save——我这边安装的版本是3.5.6

"xe-utils": "^3.5.6"

4.6 局部页面引入xe-utils

const XEUtiles = require('xe-utils');

xe-utils使用文档说明:https://vxetable.cn/xe-utils/#/

在这里插入图片描述
入参:(数据源,查找条件,children的字段可以自定义)。

可以将符合条件的数据,每一层的父级都找出来。

具体的使用原理我没有研究,但是不用自己一层层遍历循环,还是很好的。

五:鼠标移入

mouseenter(item) {
  this.currentId = item.key;
},

通过currentId参数与数据源中的key匹配,相同的则展示对应的图标。

完成!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/34633.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构学习笔记——查找算法

目录前言一、查找的相关概念&#xff08;一&#xff09;内查找和外查找&#xff08;二&#xff09;静态查找和动态查找&#xff08;三&#xff09;平均查找长度二、线性查找&#xff08;一&#xff09;顺序查找1、查找思想2、算法分析3、有序表的顺序查找&#xff08;二&#x…

gitlab-runner 的安装使用(含 .gitlab-ci.yml 的简单使用)

简介 GitLab Runner 是一个开源项目&#xff0c;用于运行您的作业并将结果发送回 GitLab。它与 GitLab CI 一起使用&#xff0c;GitLab CI 是 GitLab 随附的开源持续集成服务&#xff0c;用于协调作业。 简单理解就是一个服务放在那儿&#xff0c;当你提交代码时&#xff0c;…

[附源码]java毕业设计在线课程网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

腾讯安全SOC+能力图谱正式发布,助力政企构建闭环安全运营体系

随着云计算、人工智能、5G等新兴技术的融合发展&#xff0c;数字化转型正成为企业数字经济时代的重要发展路径。然而&#xff0c;数字化转型过程中IT架构的重塑、安全产品体系化能力不足带来的安全运营挑战&#xff0c;使得企业在业务突破上面临安全瓶颈。 面对网络安全事件频…

做一个微信小程序需要多少钱?

做一个微信小程序需要多少钱&#xff1f; 如果是选择套用小程序模板&#xff0c;自建的方式的话&#xff0c;价格是在698-3498元一年的。 如果是代建小程序的话&#xff0c;需要在自建的费用上&#xff0c;再加上1500-12000元的代建费用。 下面主要给大家讲讲698-3498元这个…

Spring依赖注入源码解析(上)

文章目录前言一、Spring中到底有几种依赖注入的方式&#xff1f;1、手动注入1.1、set方法进行注入1.2、通过构造方法进行注入2、自动注入2.1、XML的autowire自动注入2.2、Autowired注解的自动注入二、autowireByName && autowireByType核心源码分析2.1、autowireByName…

最新最全的JavaScript入门视频,包含小程序和uniapp相关的JavaScript知识学习

写在前面 我们学习JavaScript不仅可以用于web网站开发&#xff0c;也可以用于小程序&#xff0c;uniapp项目的开发&#xff0c;所以我们学习JavaScript很重要。 准备工作 我们这里学习JavaScript用的是小程序开发者工具或者uniapp开发者工具&#xff0c;所以需要你先装好这两…

基于Servlet+jsp+mysql开发javaWeb学生管理系统(学生信息、学生选课、学生成绩、学生签到考勤)

你知道的越多&#xff0c;你不知道的越多 点赞再看&#xff0c;养成习惯 如果您有疑问或者见解&#xff0c;或者没有积分想获取项目&#xff0c;欢迎指教&#xff1a; 企鹅&#xff1a;869192208 文章目录一、开发背景二、 需求分析三、开发环境四、运行效果五、开发流程工程目…

【web前端开发】HTML知识点超详细总结

文章目录什么是网页常用的浏览器及内核VScode和WebStrom使用HTML常用标签文档类型<!DOCTYPE>网页语言lang字符集title标签标题标签段落和换行标签文本格式化标签div和span标签图像标签路径相对路径同一级路径上一级路径:下一级路径绝对路径链接标签超链接标签外部链接:内…

为什么心脏长在左边?

人体各项生命活动的正常维持&#xff0c;都离不开血液循环系统输送营养和代谢废物&#xff0c;而给全身输送血液的动力器官就是心脏。可以说&#xff0c;心脏是人体的发动机。不过&#xff0c;你有没有思考过&#xff0c;为什么心脏会长在我们身体的左边呢&#xff1f; 为了解释…

css ppt操作面板 预览时其中标签定位问题

最近用网页写了一个类似PPT页面板操作功能&#xff0c;就是把文本框和图片放入操作面板后&#xff0c;手动拖动到自定义位置&#xff0c;并可以控制文本框和图片大小&#xff0c;但是在预览时位置怎么都放不对&#xff0c;可能跟我css知识不扎实有关&#xff0c;两天没解决&…

从一道题到贪心入门

今天,我们将从一道题引入贪心算法的认识. 题目 题目描述 又是一年秋季时&#xff0c;陶陶家的苹果树结了 n 个果子。陶陶又跑去摘苹果&#xff0c;这次他有一个 a 公分的椅子。当他手够不着时&#xff0c;他会站到椅子上再试试。 这次与 NOIp2005 普及组第一题不同的是&#x…

搭建ESP8266开发环境

获取工具 安信可一体化开发环境 Source insight (本菜鸟不太喜欢用Eclipse) 安装 安装ESP8266开发环境(Windows) 1)双击运行解压到文件 2)安装方式一:eclipse 双击运行ConfigTool.exe点击 Default 可以检测当前所在路径&#

图神经网络关系抽取论文阅读笔记(三)

1 用于关系提取的注意引导图卷积网络&#xff08;Attention Guided Graph Convolutional Networks for Relation Extraction&#xff0c;2020&#xff09; 论文&#xff1a;Attention Guided Graph Convolutional Networks for Relation Extraction&#xff0c;2020 1.1 引言 依…

笔试强训第一天

选择题&#xff1a; 题目1&#xff1a; 我们对这道题目进行分析&#xff1a;第一个打印的是computer没有什么问题&#xff0c;但是第二个%5.3s我们需要进行分析&#xff1a; %m.ns m表示输出字符串的宽度&#xff0c;这里输出字符串的宽度为5 n表示左起截取目标字符串的n个…

m基于OFDM系统,对比SC算法,Minn算法,PARK算法同步性能matlab仿真分析

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 OFDM系统下对比SC算法&#xff0c;Minn算法&#xff0c;PARK算法同步性能matlab仿真分析。OFDM系统中的定时估计和频率频率算法——时频联合估计的SC算法&#xff0c;由Schmidl和Cox提出…

Python入门自学进阶-Web框架——27、DjangoAdmin项目应用-数据记录操作2

四、对数据记录删除 1、首先是配置整个流程框架&#xff0c;使整个流程运转顺利&#xff1a; 路由项添加&#xff1a;path(<str:app_name>/<str:table_name>/<int:id_num>/delete/,views.rec_obj_delete,namerec_delete), 主要是匹配记录的id和delete字符…

【LeetCode每日一题:809.情感丰富的文字~~~双指针+计数器】

题目描述 有时候人们会用重复写一些字母来表示额外的感受&#xff0c;比如 “hello” -> “heeellooo”, “hi” -> “hiii”。我们将相邻字母都相同的一串字符定义为相同字母组&#xff0c;例如&#xff1a;“h”, “eee”, “ll”, “ooo”。 对于一个给定的字符串 S…

MyBatis核心对象简介说明

转自: MyBatis核心对象简介说明 MyBatis 有三个基本要素&#xff1a; 核心接口和类MyBatis核心配置文件&#xff08;mybatis-config.xml&#xff09;SQL映射文件&#xff08;mapper.xml&#xff09;下面首先介绍 MyBatis 的核心接口和类&#xff0c;如下图 每个 MyBatis 应…

华为云会议网络研讨会,按次订购更方便!

如今&#xff0c;云会议已经成为日常办公协作的常态&#xff0c;但在线发布会、大型培训会、大型招聘会等大型会议&#xff0c;常规云会议由于会议容量有限、人多会控难、角色单一等技术限制&#xff0c;已经无法满足大型会议的需求&#xff0c;此时&#xff0c;网络研讨会便能…