Vue创建递归树组件(点击可展开关闭)

本篇文章借鉴于此处,如果只需显示树形组件,可以直接访问该博主文章。我这里对他的组件做了扩展,增加了点击展开和关闭操作,话不多说上代码。

1.数据结构

const data = {label: '根目录',children: [{label: '目录A',children: [// 叶子节点{label: '目录A1'}]}, {label: '目录B'}]

2. 节点(Node.js)

<template><div ><div:class="isExpand === node.label?'parent active':'parent'":style="getLevelStyle(level)"@click="showChild(node)"><span>{{node.label}}</span><span v-show="!isNode()">&gt;</span></div><div v-show="!isNode() && isExpand === node.label"><!-- 在这里引用node自身,完成递归操作 --><node :node="node" v-for="(node, i) of node.children" :key="i" :level="level+1" v-bind="$attrs" v-on="$listeners"></node></div></div></template><script>
export default {name: 'Node',props: {node: Object,level: {type: Number,default: 0}},components: {// 这里不需要引用node自身},data() {return {isExpand: null}},methods: {isNode() {return !this.node.children || this.node.children.length === 0},showChild(node) {if (this.isNode()) {this.$emit('nodeClick', node)} else {if (this.isExpand === node.label) {this.isExpand = null} else {this.isExpand = node.label}}},getLevelStyle(level) {return { 'margin-left': level * 20 + 'px' }}}}
</script><style lang="scss" scoped>.parent {background: #F2F2F6;border-radius: 10px;padding: 12px;margin-bottom: 5px;display: flex;justify-content: space-between;}.active{background: #D3D3DC;}
</style>

3.组合成树(TreeNode.js)

<template><div style="padding: 20px 10px;"><Node :node="treeData" v-bind="$attrs" v-on="$listeners"></Node></div></template><script>
import Node from './Node'
export default {name: 'TreeNode',props: {treeData: Object},components: {Node},methods: {nodeClick(data) {this.$emit('nodeClick', data)}}}
</script><style scoped></style>

4.使用

 <template><div><TreeNode :tree-data="treeData" @nodeClick="nodeClick"></TreeNode></div>
</template><script>
import TreeNode from "./TreeNode";
export default {name: 'HelloWorld',components: {TreeNode},data () {return {treeData: {label: 'A',children: [{label: 'A-1',children: [{label: 'A-1-1',children: [{label: 'A-1-1-1'},{label: 'A-1-1-2'}]},{label: 'A-1-2',children: [{label: 'A-1-2-1'}]},{label: 'A-1-3',children: [{label: 'A-1-3-1'}]}]}, {label: 'B-1',children: [{label: 'B-1-1'},{label: 'B-1-2'}]}]}}},methods:{nodeClick(data) {console.log('===========Node click', data)}}
}
</script><style scoped>
</style>

5. 显示效果
在这里插入图片描述
6. 总结
遇到一个难题就是子组件往最外层传递事件,在网上找到了答案,需要在内层组件加:

v-bind="$attrs" v-on="$listeners"

使用的地方不用加,这样最外层可以监听到子组件发出的事件。

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

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

相关文章

【Java线程】锁机制:synchronized、Lock、Condition

转载声明&#xff1a;转载自&#xff1a;点击打开链接http://blog.csdn.net/vking_wang/article/details/9952063非常感谢博主的讲解&#xff0c;对锁这一块又加深了理解http://www.infoq.com/cn/articles/java-memory-model-5 深入理解Java内存模型&#xff08;五&#xff09…

linux 进程线程拓展

依次参考&#xff1a; 多线程和多进程的区别&#xff08;小结&#xff09; Linux内核源代码分析——fork()原理&多进程网络模型 Linux写时拷贝技术(copy-on-write) linux内核 do_fork 函数源代码浅析 转载于:https://www.cnblogs.com/mylinux/p/4947103.html

“睡服”面试官系列第五篇之proxy(建议收藏学习)

目录 1. 概述 2. Proxy 实例的方法 2.1get() 2.2set() 2.3apply() 2.4has() 2.5construct() 2.7deleteProperty() 2.8defineProperty() 2.9getOwnPropertyDescriptor() 2.10getPrototypeOf() 2.11isExtensible() 2.12ownKeys() 2.13preventExtensions() 2.14set…

Java 批量插入数据到数据库(MySQL)中

实现Java批量插入数据库数据&#xff1a; package Proxy;import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedSt…

实战CGLib系列之proxy:方法拦截MethodInterceptor

一、首先说一下JDK中的动态代理&#xff1a; JDK中的动态代理是通过反射类Proxy以及InvocationHandler回调接口实现的&#xff0c;但是&#xff0c;JDK中所要进行动态代理的类必须要实现一个接口&#xff0c;也就是说只能对该类所实现接口中定义的方法进行代理&#xff0c;这在…

“睡服”面试官系列第六篇之set数据结构(建议收藏学习)

目录 set 1基本用法 2Set 实例的属性和方法 3遍历操作 3.1 keys() &#xff0c; values() &#xff0c; entries() 3.2 forEach() 3.3遍历的应用 weakset 含义 语法 总结 set 1基本用法 ES6 提供了新的数据结构 Set。它类似于数组&#xff0c;但是成员的值都是唯一…

“睡服”面试官系列第七篇之map数据结构(建议收藏学习)

目录 1map 1.1含义和基本用法 1.2实例的属性和操作方法 1.2.1size属性 1.2.2set(key, value) 1.2.3get(key) 1.2.4has(key) 1.2.5delete(key) 1.2.6clear&#xff08;&#xff09; 1.3遍历方法 1.4与其他数据结构的互相转换 1.4.1Map 转为数组 1.4.2数组 转为 Map…

java 入门 第二季3

1.继承 1.java是单继承的&#xff0c;一个子类只有一个父类 父类&#xff0c;基类 子类&#xff0c;派生类 2.继承的好处&#xff1a;子类拥有父类的所有属性和方法&#xff0c;属性的修饰符不能是private 3.语法规则&#xff1a; class 子类 extends 父类 如果父类的属性是用p…

聊聊并发(四)——深入分析ConcurrentHashMap

转载自&#xff1a;http://www.infoq.com/cn/articles/ConcurrentHashMap 术语定义 术语 英文 解释哈希算法hash algorithm是一种将任意内容的输入转换成相同长度输出的加密方式&#xff0c;其输出被称为哈希值。哈希表hash table根据设定的哈希函数H(key)和处理冲突方法将一组…

布点算法的原理和实现

在数据可视化的过程中&#xff0c;绘制网络拓扑图是很重要的&#xff0c;它能清晰呈现一个复杂网络的结构&#xff0c;节点的重要性和关系。比如下面几张图&#xff1a; 下面这张图是我的软件绘制的&#xff1a; 这些都有一个共同的问题&#xff0c;就是如何让图绘制的更加美观…

Nginx是什么?

一、介绍 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理服务器。 Nginx是一款轻量级的Web服务器/反向代理服务器以及电子邮件代理服务器&#xff0c;并在一个BSD-like协议下发行。由俄罗斯的程序设计师lgor Sysoev所开发&#xff0c;供俄国大…

实战SQL Server 2005镜像配置全过程

SQL Server 2005镜像配置基本概念 我理解的SQL Server 2005镜像配置实际上就是由三个服务器&#xff08;也可以是同一服务器的三个 SQL 实例&#xff09;组成的一个保证数据的环境&#xff0c;分别是&#xff1a;主服务器、从服务器、见证服务器。 主服务器&#xff1a;数据存放…

Java反转单链表(code)

转载自&#xff1a;http://poly.iteye.com/blog/1748272 主要是面试中可能会经常碰上该类似操作&#xff0c;尤其是稍大点公司&#xff0c;面试官可能并不在乎你能不能搞定该题&#xff0c;但是这类型题目最是能体现程序员的思维状态 ---一个迷糊头脑的程序员 怎能立志改变这个…

Spring中拦截/和拦截/*的区别 - 不能访问到返回的JSP - 访问静态资源(jpg,js等)

最近碰到了一个spring的web.xml无法跳转到index.html页面的小问题&#xff0c;查了之后从下面这篇文章中受益&#xff0c;特此转发&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 一、我们都知道在基于Spring的Application中&#xff0c;需要在web.xml中增加下面类似的…