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,一经查实,立即删除!

相关文章

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

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

聊聊并发(四)——深入分析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;供俄国大…

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

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

webService上传图片

1 webService 2 3 /// <summary>4 /// 上传图片webServer 的摘要说明5 /// </summary>6 [WebService(Namespace "http://tempuri.org/")]7 [WebServiceBinding(ConformsTo WsiProfiles.BasicProfile1_1)]8 [ToolboxItem(fal…