vue创建树形结构

本文介绍了Vue中父子组件的数据传递,通过父组件将数据传给子组件并展示层级结构,以及子组件如何通过递归调用来实现多层数据的渲染。同时展示了在子组件内部如何通过构建字符串并使用`v-html`插入到模板中呈现树形结构数据的方法。
摘要由CSDN通过智能技术生成

1.数据在父组件中:父组件传值+子组件自调用

父:

<template>
  <div class="hello">
    <comp1 :treeList="tryData"></comp1>//给子组件传值
  </div>
</template>

<script>
import comp1 from './comp1/index.vue'
export default {
  name: 'HelloWorld',
  components:{comp1},
  data () {
    return {
      tryData: [
        { id: 0, show: true, children: [{ id: 1 }, { id: 4 }] },
        { id: 2, show: false, children: [{ id: 5 }] },
        {
          id: 3,
          show: true,
          children: [
            { id: 6 },
            { id: 7 },
            { id: 8, show: false, children: [{ id: 9 }, { id: 10 }] },
          ],
        },
      ],
    }
  }
}
</script>

子:

<template>
  <div>
    <ul v-if="treeList">
      <li v-for="it in treeList" :key="it.id">//展示一层结构
        {{ it.id }}
        //在li里通过自调用展示多层结构
        <comp1 v-if="it.children" :treeList="it.children"></comp1>
      </li>
    </ul>
  </div>
</template>
<script>
export default {
  name: "comp1",
  props:['treeList']//别忘了加引号
};
</script>

2.数据在子组件里:递归创建节点字符串,v-html将其插入到template中

<template>
  <div v-html="str"></div>
</template>
<script>
export default {
  name: "comp1",
  data() {
    return {
      tryData: [
        { id: 0, show: true, children: [{ id: 1 }, { id: 4 }] },
        { id: 2, show: false, children: [{ id: 5 }] },
        {
          id: 3,
          show: true,
          children: [
            { id: 6 },
            { id: 7 },
            { id: 8, show: false, children: [{ id: 9 }, { id: 10 }] },
          ],
        },
      ],
      str: "",
    };
  },
  methods: {
    build(arr) {
      if (arr.length == 0) return;
      this.str = this.str.concat(`<ul>`);
      console.log(arr[0])
      for (let i=0;i<arr.length;i++) {
        console.log(i)
        this.str = this.str.concat(`<li>`);
        this.str = this.str.concat(`${arr[i].id}`);
        if (arr[i].children) this.build(arr[i].children);
        this.str = this.str.concat(`</li>`);
      }
      this.str = this.str.concat(`</ul>`);
    },
  },
  mounted() {
    this.build(this.tryData);
  },
};
</script>

结果展示:

 

Vue3中的树形数据结构通常用于构建菜单、文件系统、组织架构等需要递归展示的数据结构。动态加载意味着数据不是一次性加载完成的,而是通过事件触发,如点击节点或滚动页面时才加载下级节点。在Vue3中,我们可以使用Composition API或者Options API结合Vuex管理状态,以及`v-for`和`ref`组件进行操作。 以下是创建一个动态树形结构的基本步骤: 1. 定义一个树形数据模型(通常是数组),每个节点包含一个子节点数组。 2. 使用`v-for`遍历节点,显示当前节点及其子节点。 3. 当用户交互时(比如点击),通过`@click`事件触发函数,从服务器或本地存储获取并更新子节点列表,然后用`$set`方法更新当前节点的子节点。 4. 可能的话,可以利用懒加载策略(例如`vue-infinite-loading`库)来控制何时请求更多数据。 ```html <template> <ul ref="treeList"> <li v-for="(item, index) in treeData" :key="index"> {{ item.label }} <ul v-if="item.children && !item.expanded"> <LazyLoad :data="item.children" /> </ul> <!-- 添加展开/收起按钮 --> <button @click="toggleChildren(item)" v-if="item.children">{{ item.expanded ? '收起' : '展开' }}</button> </li> </ul> </template> <script> import LazyLoad from 'vue-infinite-loading'; export default { components: { LazyLoad }, data() { return { treeData: [], // 初始树形数据 expandedItems: new Set(), // 记录已展开的节点 }; }, methods: { toggleChildren(node) { this.$set(node, 'expanded', !node.expanded); if (node.expanded) { this.expandedItems.add(node.id); } else { this.expandedItems.delete(node.id); } // 加载更多数据 this.loadMore(node); }, loadMore(parentNode) { // 根据业务逻辑在这里请求新的子节点数据 const loadChildren = () => /* ... */; loadChildren().then((newChildren) => { parentNode.children.push(...newChildren); }); }, }, }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值