vue项目两级全选(多级原理也一样),感觉有点意思,随手一记

需求:

首先说一下思路:我首先把数据列表两级遍历了一下,增加了一个checked属性来控制勾选和不勾线

this.productList.forEach((item)=>{
  this.$set(item,"checked",false);
     item.goodList.forEach((subItem)=>{
     this.$set(subItem,"checked",false);(我这里用$set,添加属性,
因为vue是数据挟持的原理,他通过Object.defineProperty来监听属性的变化,我防止层级太深,
属性变化vue监听不到(或者监听到了dom渲染不了),如果监听到了你可以不加,加了肯定是对的) }) })

页面结构

<div>
            <p>
              <span class="checkSpan"><input type="checkbox" v-model="checkAll" @change="selectAll"><label></label>全选</span></p>
            <div class="itemSection" v-for="(item,index) in productList">
              <div class="item-top">
                <span class="checkSpan"><input type="checkbox" v-model="item.checked" @change="selectItem1(item,productList)"><label></label>{{item.typeName}}</span>
              </div>
              <div class="subItemSection">
                 <div class="subItem" v-for="(subItem,subIndex) in item.goodList">
                  <div class="">
                    <span class="checkSpan"><input type="checkbox" v-model="subItem.checked" @change="selectItem2(item,productList)"><label></label>{{subItem.goodName}}</span></div>
                </div>
              </div>
             
            </div>
          </div>

以下步骤是建立在你把数据循环遍历加了一个checked属性的基础上实现的

1第一步全选    checkAll:false,

selectAll(){
      this.productList.forEach(item=>{
        item.checked=this.checkAll;
        item.goodList.forEach(subItem=>{
          subItem.checked=this.checkAll;
        })
      })
    },//定一个变量,你通过全选的变量来递归让所有的数据勾选或不勾选

2第二步

selectItem1(item,productList){
      let firstItem=productList.every(item=>{
        return item.checked==true;
      }) //这步所有的一级,度勾选控制全选勾选
      if(firstItem){
        this.checkAll=true;
      }else{
        this.checkAll=false;
      }
      item.goodList.forEach(subItem=>{
        subItem.checked=item.checked;
      })//控制二级的勾选
    }, 

3这里都是针对的都是当前的二级

selectItem2(item,productList){
     
      let lengths=item.goodList.length;
      let checkeds=item.goodList.filter(subItem=>{
        return subItem.checked==true;
      });
      if(lengths==checkeds.length){
        item.checked=true;//2级勾选的数量和二级的数量相同,让一级勾选
        let firstItem=productList.every(item=>{
          return item.checked==true;
        })//所有二级勾选控制一级勾选,然后让全选勾选,或者不勾选
        if(firstItem){
          this.checkAll=true;
        }else{
          this.checkAll=false;
        }
      }else{
        item.checked=false;
        this.checkAll=false;
      }
    },
chooseProduct(){
      this.saveSelectProduct=[];
      this.productList.forEach(item=>[
        item.goodList.forEach(subItem=>{
          if(subItem.checked==true){
            this.saveSelectProduct.push({
              goodName:subItem.goodName,
              goodId:subItem.id
            })
          }
        })
      ]);
      this.productVisible=false;
      
      let productNameList=this.saveSelectProduct.map(item=>{
        return item.goodName
      })
      this.ruleForm.productJson=productNameList.toString();
      
    },

上面是拿到所有勾选的值,然后该干嘛干嘛

 

转载于:https://www.cnblogs.com/zhihou/p/10736585.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用 Vue 2 和 Element UI 实现的多选全选开源项目的示例代码: ```html <template> <div> <el-checkbox v-model="allSelected" @change="selectAll">{{selectAllText}}</el-checkbox> <br /> <el-checkbox-group v-model="selectedItems"> <el-checkbox v-for="item in items" :key="item.id" :label="item">{{item.label}}</el-checkbox> </el-checkbox-group> </div> </template> <script> export default { data() { return { items: [ { id: 1, label: 'Item 1' }, { id: 2, label: 'Item 2' }, { id: 3, label: 'Item 3' }, { id: 4, label: 'Item 4' } ], selectedItems: [], allSelected: false } }, computed: { selectAllText() { return this.allSelected ? 'Deselect All' : 'Select All' } }, methods: { selectAll() { if (this.allSelected) { this.selectedItems = [...this.items] } else { this.selectedItems = [] } } } } </script> ``` 在该示例中,我们首先渲染一个“全选”复选框,并将其绑定到 `allSelected` 数据属性上。当用户更改复选框的选中状态时,我们会调用 `selectAll` 方法,该方法将根据 `allSelected` 数据属性将所有项目添加到或从 `selectedItems` 数组中删除。 接下来,我们使用 `el-checkbox-group` 组件渲染每个项目,并将其绑定到 `selectedItems` 数据属性上。最后,我们使用 `computed` 属性计算“全选”复选框的文本,该文本根据 `allSelected` 数据属性而变化。 这是一个基本示例,您可以根据需要进行扩展和定制。希望这可以帮助到您!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值