首页 > 其他分享 >web技术分享| 虚拟 tree

web技术分享| 虚拟 tree

时间:2022-10-25 10:45:37浏览次数:72  
标签:web arr tree children 虚拟 deviceId MonitorArea 节点 加载

查了好久,觉得使用 Ant Design Vue 中的 Tree 树形控件
因项目需求,节点的移动不通过拖拽移动,需要通过弹窗实现节点的移动,因此基于添加、删除实现。
当前仅使用节点添加、删除、移动(删除+添加)以及懒加载。

开发中移动时注意懒加载的值,否则移动后,已经展开的节点无法正常展开

使用 Tree

tree 引入

使用 Ant Design Vue 中的 Tree 树形控件 引入 Tree

  • 具体引入方式查看 Ant Design Vue 文档

组件使用

template

  • expandedKeys 展开指定的树节点

  • loadedKeys 已经加载的节点,需要配合 loadData 使用(控制是否进行懒加载,移动(删除+添加)所需):保存 key 表示该节点已进行懒加载(如果删除该节点将会重新懒加载)

  • height 固定高度,虚拟滚动

相关代码:

  <a-tree
          v-model:expandedKeys="MonitorArea.expandedKeys"
          v-model:loadedKeys="MonitorArea.loadedKeys"
          :height="510"
          :tree-data="MonitorArea.options"
          :load-data="onLoadData"
        >
        <-- 展开折叠自定义 -->、
         <template #switcherIcon="{ expanded }">
            <img
              v-if="expanded"
              class="w-5 h-5"
              src="@/assets/img/spread.png"
              draggable="false"
              alt=""
            />
            <img
              v-else
              class="w-5 h-5"
              src="@/assets/img/fewer.png"
              draggable="false"
              alt=""
            />
          </template>
           <template #title="item">
             ...内容自定义...
           </template>
  </a-tree>

ts 相关方法

在 vue3 setup 中

  • 在懒加载中保存已经加载的节点
const MonitorArea = reactive({
  // 默认展开指定节点
   expandedKeys: [""],
   loadedKeys: [""],     
   // 内容     
   options: [] as any[],  
   // 字段替换    
   fieldNames: {     
    children: "children",    
    title: "name",   
    key: "deviceId",
  },
};
/** 懒加载 **/
const onl oadData: TreeProps["loadData"] = (treeNode) => {
  return new Promise(async (resolve) => {
    // 是否是子叶点(无 childern)
    if (treeNode.dataRef?.isLeaf) {
      resolve();
      return;
    }
    // 保存 key 表示该节点已进行懒加载(如果删除该节点将会重新懒加载)
    MonitorArea.loadedKeys.push(对应节点的key);
    treeNode.dataRef!.children = 对应节点的子节点列表
    MonitorArea.options = [...MonitorArea.options];
    resolve();
  }
}
/** 创建子节点 **/
searchOption(
          Object.assign(子节点信息, {
            isLeaf: true,
          }),
          MonitorArea.options,
          "add"
        );
/** 删除子节点 **/
searchOption(子节点信息, MonitorArea.options);
/** 移动(删除+添加)节点 **/
// 删除老数据
await searchOption(老数据, MonitorArea.options);

// 过滤掉旧的节点以及父节点相关懒加载
MonitorArea.loadedKeys = MonitorArea.loadedKeys.filter((item) => {
            return 过滤;
          });
// 同上
MonitorArea.expandedKeys = MonitorArea.expandedKeys.filter((item) => {
            return 过滤;
          });

// 添加移动后的数据
 searchOption(
            Object.assign(移动后的数据, {
              isLeaf: 判断是否存在childern,
            }),
            MonitorArea.options,
            "add"
          );

封装 递归查询

const searchOption = (
  option: { deviceId: string; parentId: string; name: string },
  arr: any[],
  type = "delect"
) => {
  for (let s = 0; s < arr.length; s++) {
    // console.log(type, option.deviceId, arr[s].deviceId);

    if (type === "edit" && arr[s].deviceId === option.deviceId) {
      // 编辑
      arr[s].name = option.name;
      break;
    } else if (type !== "edit" && arr[s].deviceId === option.parentId) {
      // 父节点-添加
      if (type === "add") {
        if (!arr[s].children) {
          arr[s].children = [];
        }
        const isExist = arr[s].children.some((item: { deviceId: string }) => {
          return item.deviceId === option.deviceId;
        });
        if (!isExist) {
          arr[s].childIsNull = 0;
          arr[s].isLeaf = false;
          arr[s].class = "show_line";
          arr[s].children.unshift(option);
        }
      }
      // 父节点-删除
      if (type === "delect") {
        arr[s].children = arr[s].children.filter(
          (item: { deviceId: string }) => {
            return item.deviceId !== option.deviceId;
          }
        );
        if (arr[s].children.length == 0) {
          arr[s].isLeaf = true;
          arr[s].class = "";
          arr[s].childIsNull = 1;
        }
      }
      break;
    } else if (arr[s].children && arr[s].children.length > 0) {
      // 递归条件
      searchOption(option, arr[s].children, type);
    } else {
      continue;
    }
  }
};

在这里插入图片描述

标签:web,arr,tree,children,虚拟,deviceId,MonitorArea,节点,加载
From: https://www.cnblogs.com/anyrtc/p/16824073.html

相关文章

  • grpc-web使用
    一,proto协议编译js文件hello.proto文件1syntax="proto3";23packageapi;45//这里可以写服务注释6serviceHelloWorldService{7//这里可以......
  • #yyds干货盘点# 虚拟存储技术
    在常见的存储管理方案中,必须为每个作业分配足够的空间,以便装入全部信息。当主存空间不能满足作业要求时,作业便无法装入主存执行,此时就可以使用虚拟存储技术。如果一个作业的......
  • Vmware虚拟机RAC集群绑定共享磁盘方法
    作者:IT邦德中国DBA联盟(ACDU)成员,目前从事DBA及程序编程(Web\java\Python)工作,主要服务于生产制造现拥有Oracle11gOCP/OCM、Mysql、Oceanbase(OBCA)认证分布式TBase\TDSQL数......
  • 关于一个web站点的欢迎页面
    关于一个web站点的欢迎页面什么是一个web站点的欢迎页面?对于一个webapp来说,我们是可以设置它的欢迎页面的。设置欢迎页面之后,当你访问这个webapp的时候,或者访问这......
  • 1.1 WCF SOA架构和webservice
    1.什么是SOA?SOA全称:面向服务架构(serviceOrientedArchitecture),它是一种组件架构模式。一、定义1.WebService:严格来说是行业标准,不是技术,使用XML扩展标记语言来表示数据......
  • 虚拟机VMware上CentOS 6
    虚拟机VMware上CentOS6.8配置网络1.NAT模式1.1配置虚拟网络配置器1.2编辑DHCP1.3编辑ifcfg-eth0文件1.4检查IP1.5检查网络连通性2.桥接模式2.1配置......
  • centos虚拟机修复网络
    vi/etc/sysconfig/network-scripts/ifcfg-ens33BOOTPROTO="static"IPADDR=192.168.96.11(此处的IP就是你虚拟机的IP)GATEWAY=192.168.96.2(这是网关,此网关不是真实的交......
  • 7.TreeMap源码解析
    1.数据结构TreeMap的底层数据结构是红黑树,和HashMap的红黑树结构一样。不同的是,TreeMap利用红黑树左节点小,右节点大的性质,根据key进行排序,使每个元素能够插入到红黑树的适......
  • springmvc中web.xml模板
    myweborg.springframework.web.servlet.DispatcherServlet<init-param><param-name>contextConfigLocation</param-name><param-value>classpat......
  • WebRTC源码学习02---webrtc源码编译安装(Mac)
    参考文献https://webrtc.org.cn/mirror/ (主要参考文章)https://www.an.rustfisher.com/webrtc/intro/sync-build/(参考一下代理设置)https://blog.csdn.net/dangwei_90/ar......