当前位置:首页 > 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 的实现过程可以分为多个核心模块,包括响应式系统、虚拟 DOM、模板编译等。以下是 Vue 的主要实现过程分析。 响应式系统 Vue 的响应式系统基于 Object.def…

vue实现海报

vue实现海报

Vue 实现海报生成方案 使用 html2canvas 库 html2canvas 是一个将 HTML 元素转换为 Canvas 的库,适合将 Vue 组件渲染为海报图片 安装依赖: npm in…

vue实现popup

vue实现popup

Vue 实现 Popup 弹窗 使用 Vue 原生组件 创建一个基本的 Vue 组件作为弹窗,通过 v-if 或 v-show 控制显示隐藏。 <template> <div&…

vue 实现$(id)

vue 实现$(id)

在 Vue 中实现类似 jQuery 的 $(id) 功能,可以通过以下几种方式操作 DOM 元素: 使用 ref 属性 Vue 推荐使用 ref 属性来直接访问 DOM 元素或组件实例。在模板中为…

vue实现数据

vue实现数据

Vue 实现数据绑定的方法 Vue.js 提供了多种方式实现数据绑定,包括双向绑定、单向绑定以及动态数据绑定。以下是几种常见的实现方式: 双向数据绑定(v-model) 双向数据绑定通常用于表单元素…

vue实现文章滚动

vue实现文章滚动

Vue 实现文章滚动效果 使用 CSS 实现基础滚动 通过 CSS 的 overflow 和 height 属性控制滚动区域,适用于静态内容滚动。在 Vue 模板中定义固定高度的容器,内容超出后自动滚…