当前位置:首页 > 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>

父子节点联动逻辑

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

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等字段。

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样式增强可视化效果,如缩进表示层级关系。

vue 树形checkbox实现

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

标签: vuecheckbox
分享给朋友:

相关文章

vue实现选择分类

vue实现选择分类

Vue 实现选择分类的方法 使用 v-model 绑定选择值 在 Vue 中可以通过 v-model 指令实现双向数据绑定,适用于下拉选择框(<select>)。以下是一个基本示例: &…

vue 分页 实现

vue 分页 实现

Vue 分页实现方法 使用第三方库(如 Element UI) Element UI 提供了现成的分页组件 el-pagination,适合快速集成。 安装 Element UI: npm ins…

vue实现画板

vue实现画板

Vue 实现画板功能 在 Vue 中实现画板功能可以通过 HTML5 的 Canvas API 实现。以下是一个完整的实现方案: 创建 Vue 组件 新建一个 Vue 单文件组件(SFC),命名为…

vue实现书库

vue实现书库

Vue 实现书库功能 使用 Vue 构建书库功能需要结合前端框架和后端数据管理。以下是实现步骤和关键点: 项目初始化 使用 Vue CLI 或 Vite 初始化项目,安装 Vue Router 和状…

vue router实现分页

vue router实现分页

Vue Router 实现分页的方法 在 Vue.js 中,可以通过 Vue Router 实现分页功能,通常需要结合路由参数和动态路由匹配。以下是几种常见的实现方式: 使用查询参数实现分页 在路由…

vue实现回顶部

vue实现回顶部

实现方法一:使用 window.scrollTo 在Vue组件中,可以通过调用 window.scrollTo 方法平滑滚动到页面顶部。该方法接受一个配置对象,指定滚动行为为平滑(smooth)。…