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

全选/全不选功能

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

<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 中实现防抖(Debounce) 防抖的核心是延迟执行函数,在连续触发时取消前一次的调用,只执行最后一次。适用于输入框搜索、窗口大小调整等场景。 方法1:使用 Lodash 的 _.debou…

vue实现sso

vue实现sso

Vue 实现 SSO(单点登录)方案 单点登录(SSO)允许用户通过一次登录访问多个相关系统。以下是基于 Vue 的实现方案: 使用 OAuth2/OpenID Connect 协议 OAuth2…

vue实现详情

vue实现详情

Vue 实现详情页的常见方法 使用动态路由 在 Vue Router 中配置动态路由参数,通过 $route.params 获取详情 ID。示例路由配置: { path: '/detail/:…

vue实现socket

vue实现socket

Vue 中实现 WebSocket 通信 在 Vue 项目中实现 WebSocket 通信可以通过原生 WebSocket API 或第三方库(如 socket.io-client)完成。以下是两种常…

vue 实现脚本

vue 实现脚本

Vue 实现脚本的方法 Vue.js 提供了多种方式来实现脚本功能,包括组件内脚本、混入(Mixins)、插件(Plugins)以及自定义指令等。以下是常见的实现方式: 组件内脚本 在 Vue 单文…

vue首页实现

vue首页实现

实现Vue首页的基本步骤 创建一个Vue首页通常涉及项目初始化、页面结构设计、路由配置和组件开发。以下是具体实现方法: 初始化Vue项目 使用Vue CLI或Vite快速搭建项目结构: np…