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

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

简单效果

组件TreeData

html 复制代码
<template>
  <view class="tree">
    <template v-for="(node, index) in treeData">
      <view>
        <span @click="toggleNode($event, node)">
          <uni-icons
            v-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>

在页面中使用...

html 复制代码
<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>

凑活用

相关推荐
程序鉴定师1 天前
2026年深圳小程序/App开发公司技术选型指南:从架构设计到交付标准全维度评估
java·小程序·uni-app·php·objective-c
Q26433650231 天前
【有源码】基于uni-app的旅游行程规划小程序-基于微信小程序的智慧文旅综合服务平台
java·微信小程序·小程序·uni-app·毕业设计·springboot·源代码
qq_316837752 天前
阿里云百炼 fun-asr-realtime uniapp vue3 调用
javascript·vue.js·uni-app
特创数字科技2 天前
uniapp 图片全能处理|全平台支持(鸿蒙、安卓、苹果、web),实现九宫格、水印、滤镜、压缩、拼图
uni-app
2501_916007472 天前
苹果应用商店App Store上架费用标准及原因解析
android·ios·小程序·https·uni-app·iphone·webview
00后程序员张3 天前
苹果App Store上架指南:费用、原理与步骤详解
android·ios·小程序·https·uni-app·iphone·webview
特创数字科技3 天前
【uni-app x】告别系统相机限制!三端通用自定义相机组件:任意布局、静默拍照、录像、水印叠加、连拍回图一次搞定
前端·数码相机·uni-app
Martin -Tang3 天前
uniapp app嵌套webview 弹窗方式
android·ios·uni-app
郑州光合科技余经理4 天前
同城电商系统:库存变更怎么同步到订单
java·开发语言·前端·后端·uni-app·php·ai编程
CHB4 天前
一文讲透原生渲染和自渲染
flutter·react native·uni-app