vue uniapp树形简单递归


<template>
  <my-tree :tree-data="treeData" @node-click="nodeClick"></my-tree>
</template>

<script>
import myTree from "./component/myTree.vue";
export default {
  components: {
    myTree,
  },
  data() {
    return {
      treeData: [
        // { id: 1, name: "一级1" },
        // {
        //   id: 2,
        //   name: "一级2",
        //   children: [
        //     { id: 3, name: "二级2-1" },
        //     { id: 4, name: "二级2-2" },
        //   ],
        // },
        {
          id: 5,
          name: "一级3",
          children: [
            {
              id: 6,
              name: "二级3-1",
              children: [
                { id: 7, name: "三级3-1-1" },
                { id: 8, name: "三级3-1-2" },
              ],
            },
            { id: 9, name: "二级3-2" },
            { id: 10, name: "二级3-3" },
          ],
        },
      ],
    };
  },
  methods: {
    nodeClick(val) {
      console.log(val);
    },
  },
};
</script>

<template>
  <div class="tree-item">
    <div v-for="item in treeData" :key="item.id">
      <div class="item-title" @click="nodeClick(item)">
        <span>{{ item.name }}</span>
        <span v-if="item.children && item.children.length">
          [{{ isOpen(item.id) ? "-" : "+" }}]
        </span>
      </div>
      <div
        v-if="item.children && item.children.length"
        v-show="isOpen(item.id)"
        class="item-childen"
      >
        <my-tree
          :treeData="item.children"
          @node-click="$emit('node-click', $event)"
        ></my-tree>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: "myTree",
  props: {
    treeData: {
      type: Array,
      default: () => [],
    },
  },
  data() {
    return {
      expandedKeys: [], // 当前展开的节点id组成的数组
    };
  },
  methods: {
    nodeClick(item) {
      this.$emit("node-click", item);
      if (item.children && item.children.length) {
        let index = this.expandedKeys.indexOf(item.id);
        if (index > -1) {
          // 如果当前节点id存在数组中,则删除
          this.expandedKeys.splice(index, 1);
        } else {
          // 如果当前节点id不存在数组中,则添加
          this.expandedKeys.push(item.id);
        }
      }
    },
    isOpen(id) {
      // 判断节点id在不在数组中,在则显示,不在则隐藏
      return this.expandedKeys.includes(id);
    },
  },
};
</script>

<style lang="scss" scoped>
.tree-item {
  cursor: pointer;
  .item-title {
    padding: 4px 8px;
    &:hover {
      background: #eee;
    }
  }
  .item-childen {
    padding-left: 20px;
  }
}
</style>

https://juejin.cn/post/7056922161788747789 这个帅哥写的很好

重置遍历表单
    calculateLevel(arr, initLevel) {
      arr.forEach((element) => {
        element.show = false;
        element.disabled = false;

        if (element.children) {
          this.calculateLevel(element.children);
        }
      });
      return arr;
    },

    chongzhi() {
      this.calculateLevel(this.testJson);
    },
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Uniapp是一款基于Vue.js的跨平台应用开发框架,可以用于开发微信小程序、H5页面、App等多个平台。在Uniapp中,实现树形控件可以通过自定义组件和归组件的方式来完成。 首先,需要创建一个自定义组件用于展示树形结构。比如可以创建一个TreeItem组件,其中包含一个节点的数据和子节点。通过传入父组件的数据,TreeItem组件可以获取到当前节点的数据并进行展示,同时可以归地渲染子节点。 接着,在父组件中使用v-for指令遍历树形数据,为每个节点传入相应的数据。可以使用computed属性对树形数据进行处理和格式化,以方便在子组件中进行展示。然后,在父组件中引入TreeItem组件,通过传入当前节点的数据,渲染出树形结构。 在TreeItem组件中,通过判断当前节点是否有子节点,如果有,则归调用自身组件进行子节点的渲染。这样就可以实现树形控件的嵌套展示。 在树形控件中,可以通过添加点击事件,实现节点的展开和折叠功能。比如可以给每个节点添加一个状态值来表示是否展开,通过点击节点改变状态值,然后根据状态值控制子节点的显示和隐藏。 总结起来,Uniapp中实现树形控件需要创建自定义组件和使用归组件的方式。通过遍历树形数据,传入相应的数据给子组件,并在子组件中归渲染子节点,可以实现树形控件的嵌套展示。同时,可以通过添加点击事件,并通过状态值的改变控制节点的展开和折叠,从而实现更多的交互功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值