Vue 中如何处理树形结构数据渲染与操作?

news2024/11/27 23:50:47

Vue 中如何处理树形结构数据渲染与操作?

在实际开发中,我们经常会遇到需要渲染树形结构数据的情况,例如商品分类、组织架构、地区选择等等。Vue 提供了一些便捷的方法和工具来处理树形结构数据的渲染和操作,本文将介绍 Vue 处理树形结构数据的方法和技巧。

在这里插入图片描述

渲染树形结构数据

递归组件渲染

在 Vue 中,可以使用递归组件的方式来渲染树形结构数据。递归组件指的是组件自身调用自身的情况,这种方式可以实现无限级别的嵌套。下面是一个简单的递归组件渲染树形结构数据的示例代码:

<template>
  <div>
    <ul>
      <li v-for="node in tree">
        {{ node.label }}
        <tree :tree="node.children"></tree>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'tree',
  props: {
    tree: {
      type: Array,
      default: () => []
    }
  }
}
</script>

在这个示例中,我们创建了一个名为 tree 的递归组件,它接收一个名为 tree 的属性来表示当前节点的子节点。在模板中,我们使用 v-for 指令来遍历当前节点的子节点,并在每个子节点中再次调用 tree 组件来实现递归渲染。

使用第三方组件库

除了递归组件之外,我们也可以使用一些第三方的组件库来快速地渲染树形结构数据。比较常用的组件库包括 Element UI 和 Vue Tree 等等。这些组件库提供了一些内置的方法和样式来快速地渲染和操作树形结构数据,可以大大提高开发效率。

树形结构数据的操作

展开和折叠

在树形结构数据中,展开和折叠是比较常见的操作,可以让用户快速地查看和定位到目标节点。在 Vue 中,我们可以通过绑定 v-showv-if 指令来实现节点的展开和折叠。下面是一个简单的示例代码:

<template>
  <div>
    <ul>
      <li v-for="node in tree">
        <span @click="toggle(node)">
          {{ node.label }}
          <i v-if="node.children && node.children.length" :class="{'icon-expand': node.expanded, 'icon-collapse': !node.expanded}"></i>
        </span>
        <ul v-show="node.expanded">
          <li v-for="child in node.children">
            {{ child.label }}
          </li>
        </ul>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'tree',
  props: {
    tree: {
      type: Array,
      default: () => []
    }
  },
  methods: {
    toggle(node) {
      node.expanded = !node.expanded;
    }
  }
}
</script>

<style>
.icon-expand:before {
  content: '+';
}

.icon-collapse:before {
  content: '-';
}
</style>

在这个示例中,我们在每个节点前面添加了一个可点击的图标,通过绑定 toggle 方法来实现节点的展开和折叠。在模板中,我们使用 v-show 指令来根据节点的 expanded 属性来控制子节点的显示和隐藏。同时,我们还根据节点的 expanded 属性来切换图标样式,以便用户能够清晰地知道当前节点的状态。

###搜索和筛选

在树形结构数据中,搜索和筛选也是比较常见的操作,可以让用户快速地找到目标节点。在 Vue 中,我们可以通过在组件中添加搜索框和筛选条件的方式来实现树形结构数据的搜索和筛选。下面是一个简单的示例代码:

<template>
  <div>
    <input type="text" v-model="searchText" placeholder="请输入搜索关键字">
    <select v-model="filterType">
      <option value="">全部</option>
      <option v-for="type in types" :value="type">{{ type }}</option>
    </select>
    <ul>
      <li v-for="node in filteredTree">
        {{ node.label }}
        <ul v-if="node.children && node.children.length">
          <li v-for="child in node.children">
            {{ child.label }}
          </li>
        </ul>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'tree',
  props: {
    tree: {
      type: Array,
      default: () => []
    }
  },
  data() {
    return {
      searchText: '',
      filterType: '',
    }
  },
  computed: {
    filteredTree() {
      return this.filterTree(this.tree);
    },
    types() {
      let types = new Set();
      this.tree.forEach(node => {
        if (node.type) {
          types.add(node.type);
        }
        if (node.children && node.children.length) {
          node.children.forEach(child => {
            if (child.type) {
              types.add(child.type);
            }
          });
        }
      });
      return Array.from(types);
    }
  },
  methods: {
    filterTree(nodes) {
      const filteredNodes = [];
      nodes.forEach(node => {
        if (this.match(node)) {
          filteredNodes.push(node);
        }
        if (node.children && node.children.length) {
          const filteredChildren = this.filterTree(node.children);
          if (filteredChildren.length) {
            filteredNodes.push({
              ...node,
              children: filteredChildren,
            });
          }
        }
      });
      return filteredNodes;
    },
    match(node) {
      if (this.searchText) {
        const regex = new RegExp(this.searchText, 'i');
        if (!regex.test(node.label)) {
          return false;
        }
      }
      if (this.filterType && node.type !== this.filterType) {
        return false;
      }
      return true;
    }
  }
}
</script>

在这个示例中,我们在组件中添加了一个搜索框和一个筛选条件下拉框,通过绑定 searchTextfilterType 属性来实现搜索和筛选功能。在模板中,我们使用 v-for 指令来遍历过滤后的树形结构数据,并使用递归渲染的方式来处理子节点。在组件中,我们定义了一个 filterTree 方法来递归过滤树形结构数据,并定义了一个 match 方法来判断当前节点是否符合搜索和筛选条件。

总结

在 Vue 中,处理树形结构数据的渲染和操作可以使用递归组件、第三方组件库、搜索和筛选等方式。递归组件可以实现无限级别的嵌套,第三方组件库可以提高开发效率,搜索和筛选可以让用户快速地找到目标节点。在实际开发中,我们需要根据具体的业务需求来选择合适的方式来处理树形结构数据。

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

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

相关文章

web前端要怎么样自学?

前言 前端入门相关的路线图以及资源都帮大噶准备好啦&#xff0c;希望对想要入门前端的小伙伴们有所帮助~ 先放上前端学习的思维导图 &#xff1a; 学习前准备&#xff1a;编译器 编译器方面的选择推荐HBuilder X或者Vscode&#xff0c;运行环境在浏览器&#xff0c;推荐是ch…

Mysql锁机制简介

一、什么是锁 锁是系数据库统区别于文件系统的一个关键特性。 锁机制用于管理对共享资源的并发访问&#xff0c;提供数据的完整性和一致性。 InnoDB存储引擎不仅会在行级别上对表数据上锁&#xff0c;还会在数据库内部其他多个地方使用锁&#xff0c;从而允许对多种不同资源…

【项目实战】一、Spring boot整合JWT、Vue案例

前言 通过Spring boot整合JWT、Vue案例&#xff0c;其中融合了微服务网关、微服务等。 1、若无公共模块&#xff0c;先添加公共模块 1.1、创建模块&#xff1a;common-service 1.2、修改父项的pom文件 1.2.1、给springCloud父项添加子模块 1.2.2、添加common-service的全局…

FinClip | 日子过的飞快,又来汇报了

FinClip 的使命是使您&#xff08;业务专家和开发人员&#xff09;能够通过小程序解决关键业务流程挑战&#xff0c;并完成数字化转型的相关操作。不妨让我们看看在本月的产品与市场发布亮点&#xff0c;看看是否有助于您实现目标。 产品方面的相关动向&#x1f447;&#x1f…

【021】C/C++字符串处理函数

C/C字符串处理函数 引言一、字符串操作函数1.1、测量字符串的长度strlen1.2、字符串拷贝函数strcpy1.3、字符串追加函数strcat1.4、字符串比较函数strcmp 二、字符串查找函数2.1、字符串查找字符函数strchr2.2、字符串查找子串函数strstr 三、其他字符串处理函数3.1、字符串分割…

结构型设计模式04-适配器模式

&#x1f9d1;‍&#x1f4bb;作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 适配器模式 1、适配器模式介绍 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计…

chatgpt赋能python:用Python实现文本数字转换:从123到一二三

用Python实现文本数字转换&#xff1a;从123到一二三 在网站开发中&#xff0c;我们经常需要将数字转换成文字&#xff0c;比如将123转成“一百二十三”。这种数字转文字的需求&#xff0c;既方便了用户的阅读&#xff0c;也提高了网站的可读性和SEO效果。 在本文中&#xff…

定时任务原理方案综述 | 京东云技术团队

本文主要介绍目前存在的定时任务处理解决方案。业务系统中存在众多的任务需要定时或定期执行&#xff0c;并且针对不同的系统架构也需要提供不同的解决方案。京东内部也提供了众多定时任务中间件来支持&#xff0c;总结当前各种定时任务原理&#xff0c;从定时任务基础原理、单…

excel中的vlookup函数使用,查找对应信息

简单做一个小表格&#xff0c;第一列序号、第二列姓名、第三列数值 显然我这里都乱序了&#xff0c;是为了更好的展示 vlookup函数是查找函数的一种&#xff0c;有四个参数&#xff1a; VLOOKUP(lookup_value,table_array,col_index_num,range_lookup) lookup_value&#xf…

【算法与数据结构】206、LeetCode 反转链表

文章目录 一、题目二、翻转链表双指针法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、翻转链表双指针法 思路分析&#xff1a;代码首先进行头结点合法性判断&#xff0c;如果是空链表或者仅有一个节点的链…

SpringBoot + minio实现分片上传、秒传、续传

什么是minio MinIO是一个基于Go实现的高性能、兼容S3协议的对象存储。它采用GNU AGPL v3开源协议&#xff0c;项目地址是https://github.com/minio/minio。 引用官网&#xff1a; MinIO是根据GNU Affero通用公共许可证v3.0发布的高性能对象存储。它与Amazon S3云存储服务兼容…

SpringBoot SpEL表达式(五十二)

当死亡笼罩在脑海&#xff0c;请用生的信念打败它 上一章简单介绍了SpringBoot 事件监听处理(五十一), 如果没有看过,请观看上一章 一. 解析器 我们在生活中&#xff0c;常常会用到表达式计算&#xff0c; 如 传入一个字符串 abcd, 然后指定 a,b,c,d 的值。 让其计算出最后的…

2023年律师事务所研究报告

第一章 行业概况 律师事务所行业是一个关键的法律服务提供者&#xff0c;为客户提供各种法律咨询、代理和解决纠纷的服务。律师事务所是由一群经验丰富的律师和法律专业人员组成的机构&#xff0c;他们具备广泛的法律知识和专业技能。 律师事务所在各个领域都扮演着重要的角色…

信捷PLC中A_PLSF指令的加减速时间设置简析

我们在使用信捷PLC通过ethercat总线控制伺服驱动器时,可能会需要用到其用于轴控制的指令: A_PLSF,即“可变速度输出”。 这个指令的特点是运行过程中,速度可以实时改变,实时生效,不需要重新触发。 既然是速度指令,肯定需要设置加减速时间,因为根据实际负载的不同,使用…

30分钟Cadence原理图入门

新建工程 点击Design Entry CIS图标&#xff0c;选择OrCAD Capture。 新建工程File->New->Project 设置工程名字和路径。 默认生成PAGE1 新建页 右键点击SCHEMATIC1->New Page&#xff0c;新建原理图页。 页面设置 修改原理图页大小 选择大小A、B、C、D、E或自定义…

uniapp与webview网页交互打开手机扫码

公司的uniapp项目有一个专门打开网页的功能&#xff0c;uniapp通过webview去打开对应的url&#xff0c;然后通过监听webview网页发送过来的事件&#xff0c;在uniapp手机端打开手机的扫码功能&#xff0c;然后将扫码识别到的结果传回给网页。 思路 1.网页引入uni.webview.js文…

【HTML】【一文全解Canvas】从初学到实战,彻底掌握前端绘图神器!

【HTML】Canvas 基本介绍与应用 前言一、Canvas 概述二、在 HTML 中使用 Canvas三、Canvas 绘制图形1、绘制矩形a. fillRect()b. strokeRect() 2、绘制圆形a. 绘制实心圆形b. 绘制空心圆形 四、Canvas 绘制文本1、 fillText()2、 strokeText() 五、Canvas 绘制图片1、drawImage…

vue中安装使用Mock来模拟数据(详细教程)

在做前后分离的项目时候&#xff0c;比如制作VUE项目&#xff0c;很多时候后端没有提供接口&#xff0c;前端人员可以自己通过mock来造一个接口&#xff0c;返回数据 操作步骤 1&#xff09; 安装mockjs和axios&#xff1a; npm install mockjs -S npm install axios -S &…

怎么翻译文档?翻译文档的方法你知道几种?

文档翻译在现代社会中已经成为一项重要的工作&#xff0c;随着全球化的加速和跨境交流的增多&#xff0c;越来越多的公司和组织需要将自己的文件、资料等内容进行翻译&#xff0c;以便更好地与国际市场接轨。而如何进行高质量的文档翻译&#xff0c;一直是许多人所关注的问题。…

webstorm+小程序相配合来开发小程序

前言&#xff1a; webstorm可以安装的一个小程序插件&#xff1a; wechat-miniprogram-plugin &#xff0c;来实现小程序语法的高亮&#xff0c;并识别 rpx 这种小程序专有单位&#xff0c;还可以实现跟开发者工具中一些类似的操作功能。 注意事项&#xff1a; 1、小程序的根目…