当前位置:首页 > VUE

vue实现树组件

2026-03-09 02:16:03VUE

基础树组件实现

使用递归组件实现树形结构,核心是通过组件自身调用自身渲染子节点。

模板部分

<template>
  <ul>
    <li v-for="node in treeData" :key="node.id">
      <span @click="toggleExpand(node)">{{ node.label }}</span>
      <tree-component 
        v-if="node.expanded && node.children" 
        :tree-data="node.children"
      />
    </li>
  </ul>
</template>

脚本部分

<script>
export default {
  name: 'TreeComponent',
  props: {
    treeData: {
      type: Array,
      required: true
    }
  },
  methods: {
    toggleExpand(node) {
      node.expanded = !node.expanded;
    }
  }
};
</script>

动态加载数据

通过异步加载子节点数据实现懒加载,适合大数据量场景。

添加加载方法

methods: {
  async loadChildren(node) {
    if (!node.children) {
      const res = await fetchChildrenData(node.id); // 模拟API调用
      node.children = res.data;
      node.expanded = true;
    }
  }
}

模板调整

<span @click="loadChildren(node)">{{ node.label }}</span>

复选框支持

为每个节点添加复选框,并实现父子级联动。

添加checked状态

props: {
  treeData: {
    type: Array,
    default: () => []
  }
},
methods: {
  toggleCheck(node) {
    node.checked = !node.checked;
    this.updateChildren(node, node.checked);
    this.updateParent(node);
  },
  updateChildren(node, checked) {
    if (node.children) {
      node.children.forEach(child => {
        child.checked = checked;
        this.updateChildren(child, checked);
      });
    }
  }
}

模板增加复选框

<input 
  type="checkbox" 
  v-model="node.checked" 
  @change="toggleCheck(node)"
/>

性能优化

通过虚拟滚动解决大数据量渲染卡顿问题,需配合第三方库如vue-virtual-scroller

安装依赖

npm install vue-virtual-scroller

示例代码

import { RecycleScroller } from 'vue-virtual-scroller';
components: {
  RecycleScroller
}

调整模板

<RecycleScroller 
  :items="flattenedTreeData" 
  :item-size="32"
>
  <template v-slot="{ item }">
    <div :style="{ paddingLeft: `${item.level * 20}px` }">
      {{ item.label }}
    </div>
  </template>
</RecycleScroller>

自定义节点内容

通过插槽允许用户自定义节点渲染方式,增强灵活性。

定义插槽

<template>
  <ul>
    <li v-for="node in treeData" :key="node.id">
      <slot name="node" :node="node">
        <!-- 默认内容 -->
        <span>{{ node.label }}</span>
      </slot>
    </li>
  </ul>
</template>

使用示例

vue实现树组件

<tree-component :tree-data="data">
  <template #node="{ node }">
    <div class="custom-node">
      <i :class="node.icon"></i>
      {{ node.label }}
    </div>
  </template>
</tree-component>

标签: 组件vue
分享给朋友:

相关文章

vue实现聊天

vue实现聊天

Vue实现聊天功能 基础项目结构搭建 使用Vue CLI或Vite创建项目,安装必要依赖如socket.io-client或axios(根据通信方式选择)。核心组件通常包括: ChatWindow.…

vue实现tab换行

vue实现tab换行

Vue实现Tab切换的常见方法 使用Vue实现Tab切换功能可以通过多种方式完成,以下是几种常见的方法: 动态组件结合v-if或v-show 通过v-if或v-show控制不同Tab内容的显示与隐…

vue怎么实现数据检测

vue怎么实现数据检测

Vue 数据检测的实现方式 Vue 通过响应式系统实现数据检测,核心机制基于 Object.defineProperty(Vue 2)或 Proxy(Vue 3)。以下是具体实现方法: 基于 Vue…

vue实现闪烁

vue实现闪烁

Vue实现元素闪烁效果 使用CSS动画实现 通过Vue绑定class结合CSS动画实现闪烁效果,代码简洁且性能较好。 <template> <div :class="{…

vue动画实现

vue动画实现

Vue动画实现方法 Vue提供了多种方式实现动画效果,主要通过内置组件和第三方库完成。 使用<transition>组件 Vue内置的<transition>组件可以为元素添…

vue实现分栏

vue实现分栏

Vue实现分栏的常见方法 使用CSS Flexbox布局 通过Flexbox可以快速实现分栏效果,适合大多数响应式布局场景 <template> <div class="con…