当前位置:首页 > VUE

vue 树形checkbox实现

2026-03-08 11:08:54VUE

vue 树形checkbox实现

递归组件实现树形结构

创建递归组件TreeCheckbox,通过v-for渲染子节点。组件接收treeData作为prop,每个节点包含labelchildren等属性。

<template>
  <div>
    <div v-for="node in treeData" :key="node.id">
      <label>
        <input 
          type="checkbox" 
          v-model="node.checked"
          @change="handleCheck(node)"
        />
        {{ node.label }}
      </label>
      <TreeCheckbox 
        v-if="node.children && node.children.length"
        :treeData="node.children"
        @check-change="handleChildChange"
      />
    </div>
  </div>
</template>

<script>
export default {
  name: 'TreeCheckbox',
  props: {
    treeData: Array
  },
  methods: {
    handleCheck(node) {
      this.$emit('check-change', node)
    },
    handleChildChange(node) {
      this.$emit('check-change', node)
    }
  }
}
</script>

父子节点联动逻辑

实现选中父节点时自动选中所有子节点,或子节点全部选中时自动选中父节点。

vue 树形checkbox实现

methods: {
  handleCheck(node) {
    this.toggleChildren(node, node.checked)
    this.updateParentStatus(node)
    this.$emit('check-change', node)
  },
  toggleChildren(node, checked) {
    if (node.children) {
      node.children.forEach(child => {
        child.checked = checked
        this.toggleChildren(child, checked)
      })
    }
  },
  updateParentStatus(node) {
    let parent = this.findParent(this.treeData, node)
    while (parent) {
      const allChildrenChecked = parent.children.every(child => child.checked)
      parent.checked = allChildrenChecked
      parent = this.findParent(this.treeData, parent)
    }
  },
  findParent(tree, node) {
    for (const item of tree) {
      if (item.children && item.children.includes(node)) {
        return item
      }
      if (item.children) {
        const found = this.findParent(item.children, node)
        if (found) return found
      }
    }
    return null
  }
}

数据格式示例

树形数据应包含idlabelcheckedchildren等字段。

vue 树形checkbox实现

treeData: [
  {
    id: 1,
    label: 'Parent 1',
    checked: false,
    children: [
      {
        id: 2,
        label: 'Child 1-1',
        checked: false,
        children: []
      },
      {
        id: 3,
        label: 'Child 1-2',
        checked: false,
        children: []
      }
    ]
  },
  {
    id: 4,
    label: 'Parent 2',
    checked: false,
    children: []
  }
]

获取选中节点

提供方法获取所有选中的节点ID,便于表单提交。

methods: {
  getCheckedNodes() {
    const checkedNodes = []
    this.collectCheckedNodes(this.treeData, checkedNodes)
    return checkedNodes
  },
  collectCheckedNodes(nodes, result) {
    nodes.forEach(node => {
      if (node.checked) {
        result.push(node.id)
      }
      if (node.children) {
        this.collectCheckedNodes(node.children, result)
      }
    })
  }
}

样式优化

添加CSS样式增强可视化效果,如缩进表示层级关系。

.tree-item {
  margin-left: 20px;
  padding: 5px 0;
}
label {
  cursor: pointer;
  display: flex;
  align-items: center;
}
input[type="checkbox"] {
  margin-right: 8px;
}

标签: vuecheckbox
分享给朋友:

相关文章

vue SSG实现

vue SSG实现

Vue SSG 实现方法 Vue 的静态站点生成(SSG)可以通过多种工具和框架实现,以下是几种常见的方法: 使用 VuePress VuePress 是一个基于 Vue 的静态站点生成器,适合文档…

vue功能实现

vue功能实现

Vue 功能实现指南 Vue.js 是一个渐进式 JavaScript 框架,广泛用于构建用户界面。以下是 Vue 功能的常见实现方法。 数据绑定 Vue 的核心功能之一是数据绑定,通过 v-mod…

vue实现erp

vue实现erp

Vue实现ERP系统的关键步骤 技术选型与架构设计 采用Vue 3 + TypeScript构建前端,搭配Pinia状态管理,Element Plus或Ant Design Vue作为UI框架。后端可…

vue实现toast

vue实现toast

Vue 实现 Toast 的方法 使用第三方库(推荐) 对于快速实现 Toast 功能,推荐使用成熟的第三方库如 vue-toastification 或 vant 的 Toast 组件。 安装 v…

vue实现波形

vue实现波形

实现波形效果的方法 在Vue中实现波形效果可以通过多种方式完成,常见的方法包括使用Canvas绘制、CSS动画或第三方库。以下是几种实现方案: 使用Canvas绘制波形 通过Canvas API动态…

甘特图vue实现

甘特图vue实现

甘特图 Vue 实现方法 使用开源库 vue-ganttastic 安装依赖: npm install vue-ganttastic 基础实现代码: <template> <…