vue antd checkbox 遍历多选 全选 反全选功能

Vue+antd-UI checkbox实现遍历全选、单选、反全选功能。话不多少,直接上代码

首先是效果图

在这里插入图片描述
在这里插入图片描述

vue html代码

<div class="address-content">
   <div class="address-item address-item-all">
     <a-checkbox @change="onChangeAll" v-model="changeAll"
       >全国</a-checkbox
     >
   </div>
   <div class="address-group">
     <div
       class="address-item"
       v-for="(item, index) in cityList"
       :key="index"
     >
       <a-checkbox
         :indeterminate="item.indeterminate"
         :checked="item.checkAll"
         @change="onCheckAllChange($event, index)"
       >
         {{ item.label }}
       </a-checkbox>
       <a-checkbox-group
         v-model="item.checkedList"
         :options="item.childAreaList"
         @change="onChange($event, index)"
       >
         <span
           class="checkbox-label"
           slot="label"
           slot-scope="{ value }"
         >
           {{ value }}
         </span>
       </a-checkbox-group>
     </div>
   </div>
 </div>
</div>

js代码

<script>
export default {
	data(){
		return{
		changeAll: false,
		cityList: [
			{
			"areaCode": 110000,
			"areaDesc": "北京",
			"childAreaList": [
			{
				"areaCode": 110100,
				"areaDesc": "北京市",
				"childAreaList": null
			}
		]
		},
			 {
				"areaCode": 120000,
				"areaDesc": "天津",
				"childAreaList": [{
					"areaCode": 120100,
					"areaDesc": "天津市",
					"childAreaList": null
				}]
			}, {
				"areaCode": 130000,
				"areaDesc": "河北",
				"childAreaList": [{
					"areaCode": 130100,
					"areaDesc": "石家庄",
					"childAreaList": null
				}, {
					"areaCode": 130200,
					"areaDesc": "唐山",
					"childAreaList": null
				}, {
					"areaCode": 130300,
					"areaDesc": "秦皇岛",
					"childAreaList": null
				}, {
					"areaCode": 130400,
					"areaDesc": "邯郸",
					"childAreaList": null
				}, {
					"areaCode": 130500,
					"areaDesc": "邢台",
					"childAreaList": null
				}, {
					"areaCode": 130600,
					"areaDesc": "保定",
					"childAreaList": null
				}, {
					"areaCode": 130700,
					"areaDesc": "张家口",
					"childAreaList": null
				}, {
					"areaCode": 130800,
					"areaDesc": "承德",
					"childAreaList": null
				}, {
					"areaCode": 130900,
					"areaDesc": "沧州",
					"childAreaList": null
				}, {
					"areaCode": 131000,
					"areaDesc": "廊坊",
					"childAreaList": null
				}, {
					"areaCode": 131100,
					"areaDesc": "衡水",
					"childAreaList": null
				}]
			}
			]
		} 
	}
},
mounted(){
	// 因为数据是接口请求的,这里模拟一下,顺便对数据处理成自己需要的格式
	this.init()
},
methods:{
	init(){
        this.cityList.map((item) => {
          item.checkedList = [];
          item.checkAll = false;
          item.indeterminate = false;
          item.label = item.areaDesc;
          item.value = item.areaCode;
          item.children = item.childAreaList;
          item.childAreaList &&
            item.childAreaList.map((ite) => {
              ite.label = ite.areaDesc;
              ite.value = ite.areaCode;
            });
        });
	},
    // 选择全国
    onChangeAll(e) {
      console.log(e.target.checked);
      this.cityList.map((item) => {
        item.checkAll = e.target.checked;
        item.childAreaList.map((ite) => {
          if (e.target.checked) {
            item.checkedList.push(ite.areaCode);
          } else {
            item.checkedList = [];
          }
        });
      });
    },
    // 单选的时候,需要对比数据的长度来判断是否全部选中
     returnCheckStatus() {
      let list = [];
      let checkedList = [];
      this.cityList.map((item) => {
        checkedList = [...checkedList, ...item.checkedList];
        item.children.map((ite) => {
          list.push(ite.value);
        });
      });
      list = [...new Set(list)];
      checkedList = [...new Set(checkedList)];
      console.log(list.length === checkedList.length);
      return list.length === checkedList.length;
    },
    //单个选择
    onChange(e, index) {
      if (e.length < 1) { // 只要是未选中的时候,直接为false;
        this.changeAll = false; 
      } else {// 选中的时候,需要对比选中的长度跟全部的城市的id对比
        this.changeAll = this.returnCheckStatus();
      }
      this.cityList[index].indeterminate =
        !!this.cityList[index].checkedList.length &&
        this.cityList[index].checkedList.length <
          this.cityList[index].childAreaList.length;
      this.cityList[index].checkAll =
        this.cityList[index].checkedList.length ===
        this.cityList[index].childAreaList.length;
    },
    //选择全部的事件
    onCheckAllChange(e, index) {
      console.log(e.target.checked);
      if (!e.target.checked) { // 全选的时候只要有一个未选,就改变全部选择的状态
        this.changeAll = false;
      } else {
        let count = 1;// 判断全选的时候,二级的有哪些值是改变的,然后+1,最后对比
        this.cityList.map((item) => {
          if (item.checkAll) {
            count += 1;
          }
        });
        this.changeAll = count === this.cityList.length;
      }

      // 二级全选的时候,需要拿出当前childAreaList数组里边id
      let newArr = [];
      if (e.target.checked) {
        newArr = this.cityList[index].childAreaList.map((item) => {
          return item.value;
        });
      }
      this.cityList[index].checkedList = e.target.checked ? newArr : [];
      this.cityList[index].indeterminate = false;
      this.cityList[index].checkAll = e.target.checked;
    },
}
<script>

css代码


.address-content {
  height: 566px;
  border: 1px solid #e2e8fe;
  background: #fff;
  border-radius: 10px;
  .address-group {
    height: 518px;
    overflow-y: auto;
  }
}
::v-deep .address-item {
  display: flex;
  padding-top: 20px;
  padding-left: 20px;
  border-bottom: 1px solid #e2e8fe;
  &.address-item-all {
    padding: 16px 0 16px 20px;
    background: #f9fafd;
  }
  &:nth-child(2n) {
    background: #f7f9ff;
  }
  > .ant-checkbox-wrapper {
    margin-right: 48px;
    flex-shrink: 0;
  }
  .ant-checkbox-group {
    display: flex;
    flex-wrap: wrap;
    .ant-checkbox-wrapper {
      width: 112px;
      display: flex;
      align-items: center;
      margin-bottom: 20px;
      > span:nth-child(2) {
        display: inline-block;
        width: 100px;
        overflow: hidden;
        white-space: nowrap;
        text-overflow: ellipsis;
      }
    }
  }
}

有问题的话请指出,看到会修改 0_0

结束
转载请加来源

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现Vue Select的多选全选功能,你可以使用以下步骤: 1. 在Vue组件中,使用`v-model`指令将选择的值绑定到一个数据属性上,例如`selectedOptions`。 2. 添加一个全选的复选框,用于选择或取消选择所有选项。你可以使用一个单独的数据属性,例如`selectAll`,来保存全选复选框的状态。 3. 在Vue的模板中,为每个选项添加一个复选框,并将其选择状态与对应的选项绑定。使用`v-model`指令将选中状态绑定到一个临时的`isChecked`属性上。 4. 监听全选复选框的变化,当全选复选框的状态改变时,更新每个选项的选择状态。 下面是一个示例代码: ```html <template> <div> <input type="checkbox" v-model="selectAll" @change="selectAllOptions"> <label for="select-all">全选</label> <select multiple v-model="selectedOptions"> <option v-for="option in options" :value="option.value" :key="option.value"> <input type="checkbox" :value="option.value" v-model="option.isChecked"> {{ option.label }} </option> </select> </div> </template> <script> export default { data() { return { options: [ { label: '选项1', value: 'option1', isChecked: false }, { label: '选项2', value: 'option2', isChecked: false }, { label: '选项3', value: 'option3', isChecked: false }, // 添加更多选项... ], selectedOptions: [], selectAll: false, }; }, methods: { selectAllOptions() { this.options.forEach((option) => { option.isChecked = this.selectAll; }); if (this.selectAll) { this.selectedOptions = this.options.map((option) => option.value); } else { this.selectedOptions = []; } }, }, }; </script> ``` 在上面的示例中,我们使用了一个`options`数组来存储所有的选项。每个选项都有一个`isChecked`属性来表示其选择状态。当全选复选框改变时,我们遍历所有选项并更新它们的选择状态。同时,我们根据选择状态更新`selectedOptions`数组,以便在多选框中显示被选择的选项。 希望这能帮助到你实现Vue Select的多选全选功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值