Vue 实现checkbox的全选,单选和删除

本文介绍了使用Vue.js创建一个带有全选和单选功能的列表,以及如何实现选中项的删除操作。通过监听checkbox状态,动态更新选中项目的ID数组,并提供了一个全选按钮来切换所有项目的选中状态。此外,当有项目被选中时,删除按钮将启用,允许用户移除选中的条目。
<template>
    <div>
      <input type='checkbox' class='input-checkbox' :checked="fruitIds.length === fruits.length" @click='checkedAll()'>全选
      <div v-for='(fruit, index) in fruits' :key="index">
          <!--判断fruitIds是否包含当前fruit,fruitIds.indexOf(fruit.id)返回包含fruit的下标, 若不包含则返回-1-->
         <input type='checkbox' :checked="fruitIds.indexOf(fruit.id)>=0" name='checkboxinput' class='input-checkbox' @click='checkedOne(fruit.id)'>
      </div>
      <!--默认删除按钮不能点击, 当选中某一checkbox时可以删除-->
      <button :disabled="!fruitIds.length>0" value="Delete" @click="deleteFruits()">Delete</button>
    </div>
</template>
<script>
export default {
  data () {
    return {
      fruits:[{
        id:'1',
        value:'苹果'
      },{
        id:'2',
        value:'荔枝'
      },{
        id:'3',
        value:'香蕉'
      },{
        id:'4',
        value:'火龙果'
      }],
      fruitIds:['1','3','4'],
      // 初始化全选按钮, 默认不选
      isCheckedAll: false
    }
  },
  methods:{
    checkedOne (fruitId) {
    // checkbox单选去重
        let idIndex = this.fruitIds.indexOf(fruitId)
        if (idIndex >= 0) {
          // 如果已经包含了该id, 则去除(单选按钮由选中变为非选中状态)
          this.fruitIds.splice(idIndex, 1)
        } else {
          // 选中该checkbox
          this.fruitIds.push(fruitId)
        }
        //单个全部选中了,全选要勾上
        if (this.fruitIds.length === this.fruits.length) {
            this.isCheckedAll = true;
        }else{
            this.isCheckedAll = false
        }
    },
    checkedAll () {
      this.isCheckedAll = !this.isCheckedAll
      if (this.isCheckedAll) {
        // 全选时
        this.fruitIds = []
        this.fruits.forEach(function (fruit) {
          this.fruitIds.push(fruit.fruitId)
        }, this)
      } else {
        this.fruitIds = []
      }
    },
    deleteFruits () {
 
    }
  }
}
</script>

 

<think>我们将使用Ant Design Vue (antd-vue) Vue2实现一个具有全选单选搜索功能的复选框列表。 组件:a-checkbox, a-checkbox-group, a-input(用于搜索) 功能点: 1. 全选:一个全选复选框,用于控制所有项目的选中状态。 2. 单选:每个项目有一个复选框,可以单独选中或取消。 3. 搜索:通过输入框过滤显示的项目。 4. 全选状态:当所有项目都被选中时,全选框为选中状态;部分选中时为半选状态;没有选中时为空。 实现思路: - 使用a-checkbox-group来管理一组复选框。 - 全选复选框的状态由计算属性得出(全选、半选、未全选)。 - 当全选复选框被点击时,将当前显示的项目列表(即搜索后的列表)全部选中或全部取消。 - 当单个复选框改变时,判断全选框的状态。 - 搜索功能:使用computed属性或一个方法过滤数据源。 注意:由于我们使用了搜索功能,所以全选操作只针对当前搜索出来的结果。 步骤: 1. 定义数据:原始数据列表(包含idlabel等),选中的值数组(checkedList),搜索关键字(searchValue)。 2. 计算属性:过滤后的列表(filteredList),用于显示。 3. 全选框的状态:使用计算属性判断(全选、半选、未全选)。 4. 全选事件:当全选框变化时,如果选中,则将filteredList中所有项的id(或value)添加到checkedList;如果取消,则从checkedList中移除filteredList中所有项的id(或value)。 5. 当checkedList变化时,全选框状态会随之更新。 注意:由于全选操作只针对当前搜索出来的项目,所以当搜索条件变化时,全选操作的对象也会变化。 代码实现如下:</think>下面我将使用 Ant Design Vue (antd-vue) Vue2 实现一个具有全选单选搜索功能的复选框组件。 ### 解决方案 ```vue <template> <div class="checkbox-container"> <!-- 搜索框 --> <a-input-search v-model="searchText" placeholder="搜索选项..." @change="handleSearch" /> <!-- 全选复选框 --> <div class="select-all"> <a-checkbox :indeterminate="indeterminate" :checked="isAllSelected" @change="handleSelectAll" > 全选 </a-checkbox> </div> <!-- 选项列表 --> <a-checkbox-group v-model="selectedValues" @change="handleGroupChange" > <a-row> <a-col v-for="item in filteredOptions" :key="item.value" :span="8" > <a-checkbox :value="item.value"> {{ item.label }} </a-checkbox> </a-col> </a-row> </a-checkbox-group> </div> </template> <script> export default { data() { return { // 原始选项数据 options: [ { label: '苹果', value: 'apple' }, { label: '香蕉', value: 'banana' }, { label: '橙子', value: 'orange' }, { label: '葡萄', value: 'grape' }, { label: '西瓜', value: 'watermelon' }, { label: '菠萝', value: 'pineapple' }, ], // 当前选中的值 selectedValues: [], // 搜索文本 searchText: '', // 过滤后的选项 filteredOptions: [], // 半选状态标志 indeterminate: false, // 全选状态标志 isAllSelected: false }; }, mounted() { // 初始化过滤列表 this.filteredOptions = [...this.options]; }, methods: { // 处理搜索 handleSearch() { if (!this.searchText.trim()) { this.filteredOptions = [...this.options]; return; } this.filteredOptions = this.options.filter(item => item.label.includes(this.searchText) ); this.updateSelectState(); }, // 处理全选 handleSelectAll(e) { const isChecked = e.target.checked; if (isChecked) { // 获取当前显示的所有值 this.selectedValues = [ ...new Set([ ...this.selectedValues, ...this.filteredOptions.map(item => item.value) ]) ]; } else { // 移除当前显示的所有值 this.selectedValues = this.selectedValues.filter( value => !this.filteredOptions.some(item => item.value === value) ); } this.updateSelectState(); }, // 处理复选框组变化 handleGroupChange() { this.updateSelectState(); }, // 更新选择状态 updateSelectState() { const visibleValues = this.filteredOptions.map(item => item.value); const visibleSelected = this.selectedValues.filter( value => visibleValues.includes(value) ); // 更新半选状态 this.indeterminate = visibleSelected.length > 0 && visibleSelected.length < visibleValues.length; // 更新全选状态 this.isAllSelected = visibleValues.length > 0 && visibleSelected.length === visibleValues.length; } } }; </script> <style scoped> .checkbox-container { padding: 20px; border: 1px solid #e8e8e8; border-radius: 4px; } .select-all { margin: 12px 0; padding-bottom: 8px; border-bottom: 1px solid #f0f0f0; } </style> ``` ### 代码解释 #### 1. 核心组件 - **a-input-search**:实现搜索功能 - **a-checkbox**:全选复选框(带半选状态) - **a-checkbox-group**:管理单选复选框组 - **a-row/a-col**:网格布局展示选项 #### 2. 关键功能实现 - **搜索功能**: - 使用 `filteredOptions` 存储过滤后的选项 - 根据输入文本实时过滤选项标签 - **全选/半选状态**: - `indeterminate`:控制半选状态(部分选中) - `isAllSelected`:控制全选状态 - 通过 `updateSelectState()` 动态计算状态 - **全选逻辑**: - 选中时:添加当前显示的所有值到已选项 - 取消时:从已选项移除当前显示的所有值 - **状态同步**: - 当复选框组变化时,自动更新全选/半选状态 - 当搜索内容变化时,重新计算选择状态 #### 3. 状态管理 ```javascript updateSelectState() { // 获取当前可见选项的值 const visibleValues = this.filteredOptions.map(item => item.value); // 获取当前可见选项中已选的值 const visibleSelected = this.selectedValues.filter( value => visibleValues.includes(value) ); // 计算半选状态:部分选中但未全选 this.indeterminate = visibleSelected.length > 0 && visibleSelected.length < visibleValues.length; // 计算全选状态:所有可见项都被选中 this.isAllSelected = visibleValues.length > 0 && visibleSelected.length === visibleValues.length; } ``` #### 4. 特性说明 1. **智能全选**:只影响当前搜索结果的选项 2. **状态同步**:全选框自动响应单选操作 3. **布局优化**:使用网格布局自适应展示选项 4. **视觉区分**:全选区域与选项区域有分隔线
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值