tree组件实现折叠与展开功能(方式1 - expandedTree计算属性)

news/2024/9/1 3:13:26 标签: vite, vue3, tsx, vue计算属性

本示例节选自vue3最新开源组件实战教程大纲(持续更新中)的tree组件开发部分。考察响应式对象列表封装和computed计算属性的使用,以及数组reduce方法实现结构化树拍平处理的核心逻辑。

实现思路

第一种方式:每次折叠或展开后触发扁平化列表的重新计算和渲染。

第二种方式:每次折叠或展开后出发其所有子节点的visible计算属性重新计算,用v-show进行动态渲染。

这里我们先讨论第一种方案的实现。

实现方式

在循环遍历树节点时,增加要渲染的内容:

<div class='juan-tree-node' key=... style=...>
  {/* 渲染节点前的内容,父节点需要展示隐藏或展开按钮,叶子节点留出空的span来占据位置 */}
  {node.isLeaf ? (
    <span class='mr-1 inline-block w-[20px]'></span>
  ) : (
    <button onClick={() => toggleNode(node)} class='mr-1 inline-block h-[18px] w-[20px]'>
      {node.expanded ? <span>-</span> : <span>+</span>}
    </button>
  )}
  {node[labelName as 'label']}
</div>

节点的展开与折叠操作,注意需要操作响应式的对象,这样会触发计算属性的重新计算:

// 将树拍平的扁平化列表结构,包装成响应式列表,操作一个节点的展开与折叠,其实操作的是响应式列表中的一个元素,以便触发expandedTree计算属性重新计算。
const flatData = ref(generateFlatTree(data, optionProps))
const toggleNode = (node: IFlatTreeNode) => {
  // 注意,这里操作的其实是响应式列表中的一个元素,改变其属性会触发expandedTree重新计算
  node.expanded = !node.expanded
}
// 该计算属性用于计算已经展开的所有节点,包括手动设置expanded属性为false的父节点,而排除掉扁平化列表中折叠节点的所有子孙节点。
const expandedTree = computed(() => {
  const result = []
  for (let i = 0; i < flatData.value.length; i++) {
    const item = flatData.value[i]
    // 如果是父节点并且非展开(默认是折叠的)则跳过其所有子孙节点。
    if (!item.isLeaf && item.expanded !== true) {
      // 跳过内部所有节点
      i += item.length!
    }
    result.push(item)
  }
  return result
})

不要忘了,tree模板中遍历的对象为expandedTree.value

跳过多少个需要隐藏的子节点列表呢?

这是expandedTree计算属性实现中的关键点,咱们的实现是给IFlatTreeNode上加一个length属性,

// 扩展的扁平化节点
export interface IFlatTreeNode extends ITreeNode {
  ...
  length?: number // 设置其子孙节点的长度
}

该属性值是在generateFlatTree拍平函数中设置的:

在这里插入图片描述
执行效果:
在这里插入图片描述

存在的问题

存在的问题

  1. expandedTree计算属性每次都要整体进行计算,且对变化的部分做重新渲染
  2. IFlatTreeNodelength属性是在拍平函数中设置死的,append节点后,这个属性值应该是变化的。

下一小节,我们讲采用第二种实现方式来规避这个问题。


http://www.niftyadmin.cn/n/5561736.html

相关文章

[GXYCTF2019]Ping Ping Ping1

打开靶机 结合题目名称&#xff0c;考虑是命令注入&#xff0c;试试ls 结果应该就在flag.php。尝试构造命令注入载荷。 cat flag.php 可以看到过滤了空格,用 $IFS$1替换空格 还过滤了flag&#xff0c;我们用字符拼接的方式看能否绕过,ag;cat$IFS$1fla$a.php。注意这里用分号间隔…

Transformer系列专题(四)——Swintransformer

文章目录 九、SwinTransformer9.1 整体网络架构9.2 Transformer Blocks9.3 Patch Embedding&#xff08;将图像切割成小块&#xff08;Patch&#xff09;&#xff09;9.4 window_partition9.5 W-MSA&#xff08;Window Multi-head Self Attention&#xff09;9.6 window_revers…

本地免费使用大模型保姆机教程!且无需翻墙!

常见方案 方案一&#xff1a;使用ollama工具下载大模型docker安装web uicontinue插件完成idea代码提升---无需翻墙即可完成&#xff0c;但是使用continue完成对话的速度很慢 使用说明&#xff1a;联网使用响应效果都还可以&#xff0c;无论是终端还是webui&#xff0c;但是断网…

数据库管理的艺术(MySQL):DDL、DML、DQL、DCL及TPL的实战应用(上:数据定义与控制)

文章目录 DDL数据定义语言1、创建数据库2、创建表3、修改表结构4、删除5、数据类型 列的约束主键约束&#xff08;primary key&#xff09;唯一约束&#xff08;unique key&#xff09;非空约束检查约束&#xff08;check&#xff09;外键约束&#xff08;foreign key&#xff…

怎么关闭Windows安全中心?

Windows安全中心是Windows操作系统中的一项重要功能&#xff0c;系统提供这个功能的目的是保护电脑免受各种安全威胁。尽管如此&#xff0c;有时候我们可能出于某些原因需要关闭它。本文将详细介绍如何关闭Windows安全中心&#xff0c;以及需要注意的事项。 重要提醒&#xff1…

玄机-第一章 应急响应- Linux入侵排查

文章目录 前言简介应急开始准备工作步骤 1步骤 2步骤 3步骤 4步骤5 总结 前言 作者这一次也是差一点一次过&#xff0c;因为没有经验的原因&#xff0c;或者说题目对问题描述不太对&#xff0c;如果说是求黑客反连的ip的话我或许就知道要执行一下留下来的那个 .elf 可疑文件。 …

STM32创建HAL库工程文件

文章目录 1. HAL库 2. 下载源码安装包 3. 创建工程 4. KEIL配置工程文件 5. 可能的问题 1. HAL库 HAL库&#xff08;Hardware Abstraction Layer&#xff09;是STMicroelectronics提供的STM32微控制器的硬件抽象层库。它通过一套统一的API接口&#xff0c;简化了对STM32外…

澳大利亚药品数据库-40000+药品

众所周知&#xff0c;澳大利亚是一个药品管理极其严格的国家&#xff0c;拥有完善的药品监管体系。对于需要了解澳大利亚药品信息的人来说&#xff0c;了解其药品查询方法是必备基础。本文将详细介绍不同人群对澳大利亚药品信息查询的3种方法。 一、先了解一下澳大利亚药品监管…