当前位置:首页 > VUE

vue实现多级多选框

2026-02-20 22:55:00VUE

Vue 实现多级多选框

多级多选框的实现通常涉及递归组件或动态渲染,以下是两种常见方法:

递归组件实现

递归组件适合树形结构数据,通过组件自身调用自身实现无限层级。

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

<script>
export default {
  name: 'TreeCheckbox',
  props: {
    treeData: {
      type: Array,
      required: true
    }
  },
  methods: {
    handleChange(item) {
      this.$emit('change', item)
    },
    handleChildChange(childItem) {
      this.$emit('change', childItem)
    }
  }
}
</script>

动态渲染实现

通过嵌套循环实现固定层级的多选框,适合层级明确的数据结构。

<template>
  <div v-for="level1 in data" :key="level1.id">
    <input 
      type="checkbox" 
      v-model="level1.checked"
      @change="updateSelection(level1)"
    >
    <span>{{ level1.name }}</span>

    <div v-for="level2 in level1.children" :key="level2.id">
      <input 
        type="checkbox" 
        v-model="level2.checked"
        @change="updateSelection(level2)"
      >
      <span>{{ level2.name }}</span>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      data: [
        {
          id: 1,
          name: 'Parent 1',
          checked: false,
          children: [
            { id: 11, name: 'Child 1-1', checked: false },
            { id: 12, name: 'Child 1-2', checked: false }
          ]
        }
      ]
    }
  },
  methods: {
    updateSelection(item) {
      console.log('Selected:', item)
    }
  }
}
</script>

父子联动逻辑

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

methods: {
  handleParentChange(parent) {
    if (parent.children) {
      parent.children.forEach(child => {
        child.checked = parent.checked
      })
    }
  },
  checkParentStatus(parent) {
    if (parent.children) {
      parent.checked = parent.children.every(child => child.checked)
    }
  }
}

数据格式示例

推荐使用统一的数据结构,便于递归处理。

const treeData = [
  {
    id: 1,
    label: 'Level 1',
    checked: false,
    children: [
      {
        id: 2,
        label: 'Level 2',
        checked: false,
        children: [
          { id: 3, label: 'Level 3', checked: false }
        ]
      }
    ]
  }
]

全选/全不选功能

添加顶级控制选项,实现一键全选或全不选。

vue实现多级多选框

<input 
  type="checkbox" 
  v-model="selectAll"
  @change="toggleAll"
>
<span>Select All</span>
data() {
  return {
    selectAll: false
  }
},
methods: {
  toggleAll() {
    const setChecked = (nodes) => {
      nodes.forEach(node => {
        node.checked = this.selectAll
        if (node.children) {
          setChecked(node.children)
        }
      })
    }
    setChecked(this.treeData)
  }
}

以上实现可根据实际需求调整,递归组件适合动态深度结构,而嵌套循环适合固定层级场景。父子联动逻辑需要根据业务需求定制,数据格式保持一致有助于维护。

标签: 多选vue
分享给朋友:

相关文章

vue实现录像

vue实现录像

Vue 实现录像功能 在 Vue 中实现录像功能通常需要借助浏览器的 MediaDevices API 和 MediaRecorder API。以下是实现步骤: 获取用户摄像头和麦克风权限 使用 n…

vue实现刷卡

vue实现刷卡

Vue 实现刷卡效果 在 Vue 中实现刷卡效果可以通过 CSS 动画和 Vue 的过渡系统结合完成。以下是一种常见的实现方式: 基础实现方法 安装 Vue 过渡依赖(如果尚未安装): npm i…

vue nexttrick实现

vue nexttrick实现

Vue 中 nextTick 的实现原理 nextTick 是 Vue 提供的一个异步方法,用于在下次 DOM 更新循环结束之后执行延迟回调。它利用了 JavaScript 的事件循环机制,确保回调在…

vue实现甘特图

vue实现甘特图

使用 Vue 实现甘特图 基于开源库(如 vue-ganttastic) 安装依赖库: npm install vue-ganttastic 示例代码: <template> &l…

vue工序实现

vue工序实现

Vue 工序实现方法 在Vue中实现工序(或流程)功能,通常涉及状态管理、组件通信和动态渲染。以下是几种常见方法: 使用动态组件 通过Vue的<component :is="currentCo…

vue实现tooltips

vue实现tooltips

Vue 实现 Tooltips 的方法 使用原生 HTML title 属性 在 Vue 模板中直接使用 HTML 原生 title 属性实现简单的提示效果。这种方式无需额外依赖,但功能较为基础,无法…