当前位置: 首页 > news >正文

uni-app无限级树形组件简单实现

       因为项目一些数据需要树形展示,但是官网组件没有。现在简单封装一个组件在app中使用,可以无线嵌套,展开,收缩,获取子节点数据等。

简单效果

组件TreeData

<template><view class="tree"><template v-for="(node, index) in treeData"><view><span @click="toggleNode($event, node)"><uni-iconsv-if="node.children && node.children.length > 0":type="node.expanded ? 'arrowdown' : 'arrowright'"size="14"></uni-icons>{{ node.label }}</span><span@click.stop="deleteNode($event, node)"class="action-button delete-button">删除</span><span@click.stop="editNode($event, node)"class="action-button edit-button">编辑</span><view v-if="node.expanded" class="children"><Tree:treeData="node.children"@edit-node="(childNode) => $emit('edit-node', childNode)"@delete-node="(childNode) => $emit('delete-node', childNode)"/></view></view></template></view>
</template><script>
export default {name: "Tree",props: {treeData: {type: Array,default: () => [],},expandAll: {type: Boolean,default: true,},},data() {return {init: false,};},watch: {treeData: {immediate: true,handler(newData) {if (!this.init) {this.initializeTreeData(newData, this.expandAll);this.init = true;}},},},methods: {initializeTreeData(nodes, expanded) {nodes.forEach((node) => {this.$set(node, "expanded", expanded); // 使用 $set 确保响应式if (node.children && node.children.length > 0) {this.initializeTreeData(node.children, expanded); // 递归处理子节点}});},toggleNode(event, node) {event.stopPropagation(); // 阻止事件冒泡node.expanded = !node.expanded; // 切换节点展开状态},editNode(event, node) {event.stopPropagation();this.$emit("edit-node", node); // 触发父组件的 edit-node 事件,并传递当前节点},deleteNode(event, node) {event.stopPropagation();this.$emit("delete-node", node); // 触发父组件的 delete-node 事件,并传递当前节点},},
};
</script><style scoped>
.tree {padding-left: 15px;
}
.children {padding-left: 15px;
}
.tree-node {display: flex;align-items: center;
}.action-button {cursor: pointer;margin-left: 10px;color: #409eff;
}.edit-button {float: right;
}.delete-button {float: right;
}
</style>

在页面中使用...

<template><view class="page"><Tree:treeData="treeData":expandAll="expandAll"@edit-node="handleEditNode"@delete-node="handleDeleteNode"/></view>
</template><script>
import Tree from "@/components/TreeData";export default {components: {Tree,},data() {return {treeData: [{label: "根节点 1",children: [{label: "子节点 1-1",children: [{label: "子节点 1-1-1",children: [],},{label: "子节点 1-1-2",children: [],},],},{label: "子节点 1-2",children: [],},],},{label: "根节点 2",children: [{label: "子节点 2-1",children: [],},],},],expandAll: true, // 控制是否全部展开};},methods: {handleEditNode(node) {console.log("编辑节点", node);// 处理编辑节点的逻辑},handleDeleteNode(node) {console.log("删除节点", node);// 处理删除节点的逻辑},},
};
</script><style scoped>
page {background-color: #f5f6f8;
}.page {padding: 20px;
}
</style>

凑活用

http://www.lryc.cn/news/519611.html

相关文章:

  • 基于华为ENSP的OSPF状态机、工作过程、配置保姆级别详解(2)
  • 请求方式(基于注解实现)
  • day38 tcp 并发 ,linux下的IO模型----IO多路复用
  • 更新Office后,LabVIEW 可执行程序生成失败
  • 重塑视频创作的格局!ComfyUI-Mochi本地部署教程
  • 如何理解机器学习中的非线性模型 ?
  • Web 品质样式表
  • 计算机网络 笔记 数据链路层3(局域网,广域网,网桥,交换机)
  • centos7.6 安装nginx 1.21.3与配置ssl
  • redis 内存管理和持久化机制
  • python-42-使用selenium-wire爬取微信公众号下的所有文章列表
  • 机器人碳钢去毛刺,用大扭去毛刺主轴可轻松去除
  • day05_Spark SQL
  • Java线程的异常处理:确保线程安全运行
  • nvim 打造成可用的IDE(2)
  • 如何当前正在运行的 Elasticsearch 集群信息
  • PHP Filesystem:深入解析与实战应用
  • pdf提取文本,表格以及转图片:spire.pdf
  • jQuery UI 主题
  • C# GDI+的DrawString无法绘制Tab键的现象
  • C# GID+绘制不透明和半透明的线条
  • L4-Prompt-Delta
  • Qt 自定义控件(Qt绘图)
  • electron 上怎么用node 调用 c++ 提供的方法
  • Chromium 132 编译指南 Windows 篇 - Git 初始化设置 (四)
  • day03-前端Web-Vue3.0基础
  • Windows 下Mamba2 / Vim / Vmamba 环境安装问题记录及解决方法终极版(无需绕过triton)
  • GitLab本地服务器配置ssh和克隆项目
  • Win10和11 git/Android Studio遇到filename too long问题的解决
  • 【JavaWeb学习Day11】